Python While语句和表达式
只要表达式为true,就会执行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导致了意外行为: >>
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
处理停止迭代,而不处理。