如何在python中使用while循环语句中的迭代器

2024-09-30 12:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中可以在while循环中使用生成器或迭代器吗?例如,类似于:

i = iter(range(10))
while next(i):
    # your code

这样做的目的是将迭代构建到while循环语句中,使其类似于for循环,区别在于现在可以在while语句中添加逻辑:

^{pr2}$

然后它就变成了一个不错的for-loop/while-loop混合动力车。在

有人知道怎么做吗?在


Tags: 目的loopforyourcoderange语句逻辑
3条回答

您只需要安排迭代器在它过期时返回一个类似false的值。E、 g.如果我们将range倒数为0:

>>> i = iter(range(5, -1, -1))
>>> while val := next(i):
...     print('doing something here with value', val)
...

这将导致:

^{pr2}$

while next(i):有两个问题

  1. for循环不同,如果没有next值,while循环将不会捕获引发的StopIteration异常;在这种情况下,可以使用next(i, None)返回“false”值,但是每当迭代器返回实际的false值时,while循环也将停止
  2. next返回的值将被使用,并且不再在循环体中可用。(在python3.8+中,可以通过赋值表达式来解决这个问题,请参阅其他答案。)

相反,您可以将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)

输出:

^{pr2}$

在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)产生的任何结果:

^{pr2}$

在Python>;=3.8中,可以使用assignment expressions执行以下操作:

i = iter(range(10))
while (x := next(i, None)) is not None and x < 5:
    print(x)

相关问题 更多 >

    热门问题