【问题标题】:Python: Trying to convert string to int, get error to int invalid literal for int() with base 10: ''Python:尝试将字符串转换为 int,将错误转换为 int 的 int() 以 10 为底的无效文字:''
【发布时间】:2015-11-05 17:26:09
【问题描述】:

我是 Python 新手,所以如果这是一个简单的解决方法,我深表歉意。我在 Codeval 问题(Happy Numbers)上卡住了很长一段时间,我不确定出了什么问题。

问题描述:

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

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

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")

我已经尝试过的:

根据我从其他类似问题中收集的信息,问题可能是当我点击i = int(i) 时,我无法将str 转换为int。我的理解是,在对其进行任何数学运算之前,我必须将 str 类型转换为 int 类型,但看起来这就是它失败的地方。

我自己测试了happy_or_not 函数,它确实打印出了我期望的值。在我看来,当我尝试在 happy_number_check 函数内调用 happy_or_not 函数时,问题就出现了,该函数正在读取我的 txt 文件(包含要测试的数字列表)。我不能在这里掌握更大的原则,因此任何解释都会有所帮助。

这也是我对递归函数的第一次真正尝试,可能有更好的方法来构建它,因此欢迎任何关于如何将其更改为更有效的建议。

提前谢谢你!

【问题讨论】:

  • 您正在尝试将空字符串转换为 int,所以它失败了。尝试调试并找出为什么你得到一个空字符串。
  • 正如错误所说,您正在向int() 发送一个空字符串。不要给它一个空字符串。
  • 你说i = int(i)然后检查i == " "是否永远不会发生;整数不能是带有单个空格的字符串。
  • 你也说number = str(number),然后检查number == 1,这又是不可能发生的。
  • Protip:当你需要一个新的变量时,使用一个新的名字。示例:使用 str_number=str(number) 代替 number=str(number)。 Python 解释器两者都接受,但你可怜的碳基大脑使用第二个比第一个好得多。

标签: python string recursion error-handling int


【解决方案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

【讨论】:

  • 谢谢!我让它正常工作。现在重构你提到的其他逻辑错误的有趣部分。 :)
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2019-12-09
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多