【问题标题】:Can I make a for loop go forever? (Python)我可以让 for 循环永远运行吗? (Python)
【发布时间】:2021-12-28 02:25:54
【问题描述】:

如果我有这样的代码:

for i in range(3):
    print("Hello")

有没有办法通过for 循环使其永久打印?

【问题讨论】:

标签: python loops for-loop


【解决方案1】:

如果你的 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

【讨论】:

  • 能不能把infinite做成单行?
  • 我已经为此添加了一个建议
  • 嗨,@Grismar 你能详细说明一下这个iter(int, 1) 的作品吗?或者任何指针?我知道iter,但从来不知道它可以这样工作......谢谢。
  • 我添加了一些解释,希望可以清除它。
【解决方案2】:

你可以使用类似itertools.count:

from itertools import count

for i in count():
    print(i)

【讨论】:

  • itertools.repeat("hello")
【解决方案3】:

有什么理由需要一个 for 循环吗?

你可以只使用一个while循环,

while True:
    print('hello')

要停止它,请按键盘上的 Ctrl + c

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2014-05-30
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多