【问题标题】:Why does raw_input create an infinite loop in this Learn Python the Hard Way exercise variant?为什么 raw_input 在这个 Learn Python the Hard Way 练习变体中创建了一个无限循环?
【发布时间】:2011-12-31 06:15:51
【问题描述】:

我正在努力学习 Python the Hard Way,并尝试在我能做的事情上继续深造。我认为这会起作用:设置 raw_input 以设置 while 循环的限制,然后让 while 循环执行到我使用变量“频率”建立的限制。

它,呃,没有。相反,它将 Python 发送到创建数字列表的无限循环中,每个列表似乎都比最后一个(非常长的)列表长一个增量。

原始代码有“while i

这是完整的脚本:

i = 0 
numbers = []

print "What is the frequency?"
frequency = raw_input ('Kenneth? ')

while i < frequency:
    print "At the top i is %d" % i
    numbers.append(i)
    i = i + 1
    print "Numbers now: ", numbers
    print "At the bottom i is %d" % i

print "The numbers: "

for num in numbers: 
    print num

为最大的无知道歉——我现在有一本用于软件设计的 Python 平装本,这是继 LPTHW 之后我的待办事项清单上的下一件事。

【问题讨论】:

  • 您可能会发现以下内容很有用。这是关于如何在 python 中比较字符串和整数。 stackoverflow.com/questions/3270680/…
  • 尝试将raw_input更改为input
  • frequency = int(raw_input ('Kenneth? '))
  • 您的比较总是返回 True。您需要将 raw_input 值转换为 int (int()) 以获得所需的结果。在交互式 shell 中尝试以下操作: i=6 i
  • @TomIngram 当用户提供的值无法转换为 int 时,这种方法会给您留下未处理的异常。

标签: python while-loop


【解决方案1】:

raw_input 会给你一个字符串对象,而不是一个整数。尝试在循环之前使frequency = int(frequency),这将使比较有价值。

【讨论】:

  • 在赋值之前将整个事物转换为 int 也会更加隐含:frequency = int(raw_input('Kenneth? ')).
  • 哦!好的,我明白了。该字符串返回“true”,因此我得到的只是一个永远的“true”循环,而不是我从整数中得到的纯结果。谢谢!
  • @Makoto 仅在您处理异常时。如果给定的值不是 int castable,int(raw_input(…)) 将抛出 ValueError
  • @kojiro:当然。但即便如此,如果我们要走那么远,你也必须try...except 甚至在独立变量中强制转换int。 ;)
  • @Makoto 或者您可以在强制转换之前测试该值是否包含可用字符串。 if 语句比单纯的错误处理更便宜。
【解决方案2】:
>>> 3 < '2'
0: True

这是你的提示。

【讨论】:

    【解决方案3】:

    因为 raw_input 结果是一个字符串。

    >>> frequency = "10"
    >>> i = 0
    >>> while i < frequency:
    ...     i = i + 1
    ...     print i
    ...     if i > 20: break
    ... 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    

    【讨论】:

      【解决方案4】:

      您输入的数字是字符串而不是整数

      只需在while循环前添加frequency = int(frequency)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 2012-02-17
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多