Python While语句和表达式

Python While语句和表达式,python,while-loop,Python,While Loop,只要表达式为true,就会执行while循环语句 第10次之后,pop()会抛出一个索引器,因为列表中有10个元素。但是,下面的代码执行得很好,没有任何错误。为什么会这样 a = [x*x for x in range(10)] while a.pop(): print("elements in the list") 这可能是一个非常基本的问题,但我正在尝试熟悉Python。不清楚您的问题是什么。如果我执行你的代码,它会(我认为)达到你的期望。可能是0导致了意外行为: >>

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

第10次之后,pop()会抛出一个索引器,因为列表中有10个元素。但是,下面的代码执行得很好,没有任何错误。为什么会这样

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

这可能是一个非常基本的问题,但我正在尝试熟悉Python。

不清楚您的问题是什么。如果我执行你的代码,它会(我认为)达到你的期望。可能是
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]
只测试列表本身而不是测试
.pop()
的结果更像Python,因为这将终止任何falsy项上的循环:

>>> 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 []
当列表变为false时终止

更好的做法是(在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]

你的问题是什么还不清楚。如果我执行你的代码,它会(我认为)达到你的期望。可能是
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]
只测试列表本身而不是测试
.pop()
的结果更像Python,因为这将终止任何falsy项上的循环:

>>> 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 []
当列表变为false时终止

更好的做法是(在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]
第10次之后,pop()会抛出一个索引器,因为列表中有10个元素

不,代码在第10个
pop
s之后从不尝试执行任何
pop
,因为第10个
pop
返回
0
0
在布尔上下文中被视为false,因此循环在该点终止

第10次之后,pop()会抛出一个索引器,因为列表中有10个元素


不,代码在第10个
pop
s之后从不尝试执行任何
pop
,因为第10个
pop
返回
0
<代码>0在布尔上下文中被视为false,因此循环在该点终止。

它的工作方式与您对我的期望相同。我不确定这一点,但可能while循环将异常视为false?我也很想知道。@dawg我正在使用anaconda/3.5.2/pycharm。我再试了一次,没有出现任何错误。@SSNR看起来好像while没有处理StopIteration,而
for
处理。它的工作原理与您对我的期望一样。我不确定这一点,但可能while循环将异常视为false?我也很想知道。@dawg我正在使用anaconda/3.5.2/pycharm。我又试了一次,没有任何错误。@SSNR看起来像while不处理StopIteration,而
for
处理StopIteration。它是零!我认为这是
while循环
用来处理异常的某种魔法。这很快:)我更改为范围(2,10),正如你提到的,我确实得到了indexer。看起来
for
处理StopIteration,而
不处理。它是零!我认为这是
while循环
用来处理异常的某种魔法。这很快:)我更改为范围(2,10),正如你提到的,我确实得到了indexer。看起来
for
处理停止迭代,而
不处理。