【问题标题】:While statement and expressionsWhile 语句和表达式
【发布时间】:2017-01-25 08:09:09
【问题描述】:

while 只要表达式为真,循环语句就会被执行。

在第 10 次之后,pop() 会返回一个 IndexError,因为列表中有 10 个元素。但是,下面的代码执行良好,没有任何错误。为什么会这样?

a = [x*x for x in range(10)]
while a.pop():
    print("elements in the list")

这可能是一个非常基本的问题,但我正在努力适应 Python。

【问题讨论】:

  • 它按你的预期工作。
  • 我不确定这一点,但也许 while 循环将异常视为错误?我也很想知道。
  • @dawg 我正在使用 anaconda/3.5.2/pycharm。我又试了一次,它没有任何错误..
  • @SSNR 看起来像 while 不处理 StopIteration 而for 处理。

标签: python while-loop


【解决方案1】:

在第 10 次之后,pop() 会抛出一个 IndexError,因为列表中有 10 个元素。

不,代码从不尝试在第 10 个之后执行任何 pops,因为第 10 个 pop 返回 00 在布尔上下文中被认为是错误的,因此循环在该点终止。

【讨论】:

  • 这是零!我认为这是while-loop 用来处理异常的某种魔法。
  • 这很快 :) 我更改为 range(2,10) ,正如你提到的,我确实得到了 IndexError 。看起来for 处理了 StopIteration 而while 没有。
【解决方案2】:

不清楚您的问题是什么。如果我执行你的代码,它会(我认为)你所期望的。可能是 0 导致了意外行为:

>>> a = [x*x for x in range(10)]
>>> while a.pop():
...    print a
... 
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0, 1, 4, 9, 16, 25, 36, 49]
[0, 1, 4, 9, 16, 25, 36]
[0, 1, 4, 9, 16, 25]
[0, 1, 4, 9, 16]
[0, 1, 4, 9]
[0, 1, 4]
[0, 1]
[0]

Pythonic 只测试列表本身而不是 .pop() 的结果,因为这将终止任何虚假项目的循环:

>>> li=[1,2,3,False,4,5]
>>> while li.pop():
...    print li
... 
[1, 2, 3, False, 4]
[1, 2, 3, False]

您可以看到while 循环在遇到来自pop 的False 时终止。

这样做会更典型:

>>> li=[1,2,3,False,4,5]
>>> while li:
...    e=li.pop()
...    print e, li
... 
5 [1, 2, 3, False, 4]
4 [1, 2, 3, False]
False [1, 2, 3]
3 [1, 2]
2 [1]
1 []

当列表变为假时终止。

最好还是(在 Python 中)使用对列表没有破坏性的 for 循环:

>>> li=[1,2,3,False,4,5]
>>> for e in li:
...    print e, li
... 
1 [1, 2, 3, False, 4, 5]
2 [1, 2, 3, False, 4, 5]
3 [1, 2, 3, False, 4, 5]
False [1, 2, 3, False, 4, 5]
4 [1, 2, 3, False, 4, 5]
5 [1, 2, 3, False, 4, 5]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多