Python:尝试将字符串转换为int,使用基数10为int()获取int invalid intral的错误:''

时间:2015-08-12 22:27:47

标签: python string recursion error-handling int

我是Python的新手,所以如果这是一个简单的修复,我会道歉。我一直坚持Codeval问题(Happy Numbers)很长一段时间,我不确定会出现什么问题。

问题描述:

从任何正整数开始,将数字替换为其数字的平方和,并重复该过程直到数字等于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 ...)

我的测试输入和预期结果:

1 - > 1

7 - > 1

22 - > 0

如果号码是一个满意的号码,请打印1.如果不是,请打印出0。

以下是完整的追溯:

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文件(包含要测试的数字列表)。我不能在这里抓住一个更大的原则,所以任何解释都会有所帮助。

这也是我对递归函数的第一次真正尝试,并且可能有更好的方法来构建它,所以非常欢迎任何关于如何改变事物的建议。

提前谢谢!

1 个答案:

答案 0 :(得分: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 - 一个有趣的Stack Overflow :-) - 终止测试。你应该真正跟踪已经尝试过的数字,如果再次尝试相同的数字,则返回0。

如果您不想直接解决问题,请不要点击此链接,但如果您这样做,则这是一个迭代解决方案:http://rosettacode.org/wiki/Happy_numbers#Python