2015-08-12 3 views
1

Я новичок в Python, поэтому прошу прощения, если это простое исправление. Я довольно долго задерживался на проблеме Codeval (Happy Numbers), и я не уверен, что происходит не так.Python: попытка конвертировать строку в int, получить ошибку для int invalid literal для int() с базой 10: ''

Описание проблемы:

Начиная с любым положительным целым числом, заменить число на сумме квадратов его цифр, и повторите процесс, пока число не станет равными 1, или петлей бесконечно в цикле, который не включает 1.Чтобы числа, для которых этот процесс заканчивается на 1, счастливы, а те, которые не заканчиваются на 1, недовольны.

Например:

7 является счастливым числом (7-> 49-> 97-> 130-> 10-> 1)

22 не счастливый номер (22-> 8-> 64-> 52-> 29-> 85-> 89-> 145-> 42-> 20-> 4-> 16-> 37-> 58-> 89 ...)

My испытательный ввод и ожидаемые результаты:

1 -> 1

7 -> 1

22 -> 0

Если число является счастливым числом, распечатайте 1. Если нет, распечатать 0.

Вот полный Traceback:

Traceback (most recent call last): 
    File "/happy_number.py", line 58, in <module> 
    happy_number_check("happy_numbers.txt") 
    File "/happy_number.py", line 55, in happy_number_check 
    happy_or_not(line) 
    File "/happy_number.py", line 33, in happy_or_not 
    i = int(i) 
ValueError: invalid literal for int() with base 10: '' 

Вот мой код:

# test = 7 


def happy_or_not(number): 
    number = str(number) 
    if number == 1: 
     print 1 
    else: 
     new_num = 0 
     for i in number: 
      i = int(i) 
      if i == " ": 
       continue 
      else: 
       new_num += i**2 
     if new_num == 10 or new_num == 10: 
      print 1 
     else: 
      try: 
       happy_or_not(new_num) 
      except RuntimeError: 
       print 0 

# happy_or_not(test) 


def happy_number_check(file): 
    f = open(file, 'r+') 
    for line in f: 
     if line == "": 
      continue 
     else: 
      happy_or_not(line) 


happy_number_check("happy_numbers.txt") 

То, что я уже пробовал:

Основываясь на том, что я собрал из других подобных вопросов, то проблема может быть, что я не в состоянии преобразовать str в int, когда я попал в линию i = int(i). Я понимаю, что мне нужно преобразовать тип str в тип int, прежде чем выполнять какую-либо математику на нем, но похоже, что он не работает.

Я проверил функцию happy_or_not сам по себе, и он распечатает значение, которое я ожидаю от него. Мне кажется, что проблема возникает, когда я пытаюсь вызвать функцию happy_or_not внутри функции happy_number_check, которая читает мой txt-файл (содержащий список номеров для проверки). Я не должен здесь разбираться в более широком принципе, поэтому любые объяснения были бы полезными.

Это также моя первая реальная попытка рекурсивной функции, и, вероятно, лучший способ ее структурирования, поэтому любые предложения о том, как изменить ситуацию, чтобы быть более эффективными, являются наиболее желанными.

Спасибо заранее!

+0

Вы пытаетесь преобразовать пустую строку в int, поэтому она не работает. Попробуйте отладить и узнайте, почему вы получаете пустую строку. – Celeo

+0

Как говорится в ошибке, вы отправляете 'int()' пустую строку. Не отправляйте пустую строку. – TigerhawkT3

+0

Вы говорите «i = int (i)», а затем проверьте, не существует ли 'i ==" "'; целое число не может быть строкой с одним пробелом. –

ответ

1

Попробуйте изменить happy_number_check, как это (проверки каждая строка представляет собой целое число):

def happy_number_check(file): 
    with open(file, 'r+') as f: # Safer way to open a file. Will automatically close for you even if something goes wrong 
     for line in f: 
      if line.strip().isdigit(): 
       happy_or_not(line.strip()) 

strip() будет также сделать так, что вы можете удалить этот код:

if i == " ": 
    continue 
else: 

Кстати, у вас также есть ошибка в вашей логике. Вы полагаетесь на RuntimeError - переполнение стека достаточно интересно :-) - чтобы завершить тест. Вы должны действительно отслеживать, какие числа были опробованы, и если вы попробуете тот же номер снова, верните 0.

Не нажимайте эту ссылку, если вы не хотите прямое решение проблемы, но если вы делаете, вот итеративное решение: http://rosettacode.org/wiki/Happy_numbers#Python

+0

Спасибо! Я работал правильно. Теперь интересная часть реорганизации этой другой логической ошибки вы упомянули. :) –

Смежные вопросы