【发布时间】:2021-12-28 02:25:54
【问题描述】:
如果我有这样的代码:
for i in range(3):
print("Hello")
有没有办法通过for 循环使其永久打印?
【问题讨论】:
-
它必须是一个
for循环吗? -
这能回答你的问题吗? Infinite for loops possible in Python?
如果我有这样的代码:
for i in range(3):
print("Hello")
有没有办法通过for 循环使其永久打印?
【问题讨论】:
for 循环吗?
如果你的 for 循环从一个永远运行的生成器中获取数据,当然:
def infinite():
while True:
yield
for __ in infinite():
print("Hello")
您问是否可以将其作为单行来完成。不是这样,但有一些诡计(并且没有作弊,只是从其他地方导入它,比如itertools):
for __ in iter(int, 1):
print("Hello")
这是可行的,因为int() 只会无限返回0,永远不会达到1 的标记值。我仍然觉得它有点作弊,你这样做只是为了表明它可以用for 来完成——显然while True: 是你真正需要的方法。
你问for __ in iter(int, 1): 是如何工作的。 iter() 的文档很清楚 https://docs.python.org/3/library/functions.html#iter,但简短的版本是,如果给出了两个参数,第二个作为哨兵,第一个参数必须是一个可调用的,它将在没有参数的情况下被调用,直到返回哨兵值,直到哨兵的所有值都将从迭代器中产生。
例如:
from random import random
def coin_flip():
return 'heads' if random() > .5 else 'tails'
print(list(iter(coin_flip, 'heads')))
这里,coin_flip() 是一个随机返回 'heads' 或 'tails' 的函数,概率约为 50/50。 iter(coin_flip, 'heads') 创建一个可迭代的对象,它将调用 coin_flip() 并产生结果,直到它返回哨兵值(不会产生)。
因此,您有 50% 的机会获得[]、25% 的机会获得['tails']、12.5% 的机会获得['tails', 'tails'],等等。
另一种看待它的方式是 iter() 的模拟实现:
def iter(callable, sentinel):
while (result := callable()) != sentinel:
yield result
这并没有实现iter()s 的所有功能,因为如果您只使用单个参数调用它,它的工作方式会有所不同。
在原始答案中,它可以工作,因为int() 将始终返回0,它永远不会变成1,因此迭代器永远产生0。
【讨论】:
iter(int, 1) 的作品吗?或者任何指针?我知道iter,但从来不知道它可以这样工作......谢谢。
你可以使用类似itertools.count:
from itertools import count
for i in count():
print(i)
【讨论】:
itertools.repeat("hello")
有什么理由需要一个 for 循环吗?
你可以只使用一个while循环,
while True:
print('hello')
要停止它,请按键盘上的 Ctrl + c。
【讨论】: