2024-09-30 12:31:30 发布
网友
在Python中可以在while循环中使用生成器或迭代器吗?例如,类似于:
i = iter(range(10)) while next(i): # your code
这样做的目的是将迭代构建到while循环语句中,使其类似于for循环,区别在于现在可以在while语句中添加逻辑:
然后它就变成了一个不错的for-loop/while-loop混合动力车。在
有人知道怎么做吗?在
您只需要安排迭代器在它过期时返回一个类似false的值。E、 g.如果我们将range倒数为0:
range
>>> i = iter(range(5, -1, -1)) >>> while val := next(i): ... print('doing something here with value', val) ...
这将导致:
while next(i):有两个问题
while next(i):
for
next
while
StopIteration
next(i, None)
相反,您可以将for循环与^{}一起使用,测试iterable中的当前元素,或者只测试任何其他条件。这将循环,直到iterable用尽,或者条件求值为false。在
from itertools import takewhile i = iter(range(10)) r = 0 for x in takewhile(lambda x: r < 10, i): print("using", x) r += x print("result", r)
输出:
在Python<;3.8中,可以使用^{}:
from itertools import takewhile i = iter(range(10)) for x in takewhile({some logic}, i): # do stuff
这里的“Some logic”是一个1-arg可调用函数,接收next(i)产生的任何结果:
next(i)
在Python>;=3.8中,可以使用assignment expressions执行以下操作:
i = iter(range(10)) while (x := next(i, None)) is not None and x < 5: print(x)
您只需要安排迭代器在它过期时返回一个类似false的值。E、 g.如果我们将
range
倒数为0:这将导致:
^{pr2}$while next(i):
有两个问题for
循环不同,如果没有next
值,while
循环将不会捕获引发的StopIteration
异常;在这种情况下,可以使用next(i, None)
返回“false”值,但是每当迭代器返回实际的false值时,while
循环也将停止next
返回的值将被使用,并且不再在循环体中可用。(在python3.8+中,可以通过赋值表达式来解决这个问题,请参阅其他答案。)相反,您可以将} 一起使用,测试iterable中的当前元素,或者只测试任何其他条件。这将循环,直到iterable用尽,或者条件求值为false。在
for
循环与^{输出:
^{pr2}$在Python<;3.8中,可以使用^{} :
这里的“Some logic”是一个1-arg可调用函数,接收
^{pr2}$next(i)
产生的任何结果:在Python>;=3.8中,可以使用assignment expressions执行以下操作:
相关问题 更多 >
编程相关推荐