【问题标题】:Mimic while-loop using only for-loops in python [duplicate]在python中仅使用for循环模仿while循环[重复]
【发布时间】:2016-12-31 14:19:58
【问题描述】:

在开始学习 C 代码后,我一直认为 for 循环和 while 循环在本质上始终是等价的(因为其中一个总是可以仅使用另一个来重现其中一个的行为)。但是在python中,从for循环到while循环总是微不足道的,我找不到实现相反的方法。

在 python 中,有没有办法仅使用 for 循环来重现 while 循环(无限循环)的行为?

这是一个使用递归生成器不起作用的解决方案(由于递归限制):

def infinite_loopy():
    yield "All work and no play makes Jack a dull boy"
    for x in infinite_loopy():
        yield x

#here starts the supposedly infinite-loop
for x in infinite_loopy():
    print(x)

【问题讨论】:

  • @Aurora0001 这不是那个问题的重复,因为我希望 不使用 while-loops
  • 该问题的公认答案不使用 while 循环,所以这正是您想要的,是吗?如果没有,为什么不呢?
  • @Kevin 糟糕,我只检查了这个问题。但是,是的,这将算作一个解决方案。
  • 是的,不知何故我错过了建议的副本,并起草了一个与其他问题中接受的答案完全相同的答案......
  • @Antti Haapala 这真的算作重复吗?我觉得它们是两个不同的问题,附加有共同的答案。

标签: python loops for-loop while-loop


【解决方案1】:

你可以通过写non-yield iterator class来做到这一点:

class Infinite(object):
    def __iter__(self):
        return self

    def next(self): # For Python3, replace this with __next__
        return 1

# Loops forever
for i in Infinite():
    pass

(如果你有耐心,你可以看到它在 ideone 上停滞不前 - 这就像看着油漆变干)。

【讨论】:

  • 这个方案简单好看,+1
  • @Lost 非常感谢!
  • @AnttiHaapala 感谢您的正确评论。对于 Python3,next 应替换为 __next__(在问题中更新)。
【解决方案2】:

您可以使用iter 的两个参数版本,如下所示:

for _ in iter(int, 1):
    print('All your loops are belong to us!')

iter 的 2 参数形式将第一个参数调用为不带参数的函数。如果返回值等于 (==) 第二个参数,则引发 StopIteration,否则产生返回值。 int() 不带参数调用返回 0 当然不等于 1 因此永远产生 0,我们有一个无限循环。

【讨论】:

    【解决方案3】:

    您可以使用itertools.repeatcountcycle

    import itertools
    
    for _ in itertools.repeat(None):
        # infinite loop
    
    for _ in itertools.count():
        # infinite loop
    
    for _ in itertools.cycle([None]):
        # infinite loop
    

    所有这些可以通过使用while循环的函数来表示,但是itertools模块是在c(在cPython中)中实现的,并且没有使用while循环在the source codejython (java) 甚至 PyPy (python) 也是如此。 countcycle 也是如此。

    【讨论】:

    • 它们仍然有可能在内部使用while 实现,不是吗?我认为这就是 OP 对 Aurora 在问题下的评论的回应。
    • itertools.repeat 的doc 表示它大致相当于一个包含while 的函数
    • @jadsq source for repeat 根本没有使用while
    • @AmiTavory 查看编辑
    • @RoadieRich 哦,答案很好,那么(完全不同的方向)。
    【解决方案4】:

    你可以在 for 循环中使用itertools.count()

    import itertools
    
    def infinite_loopy():
        x = "All work and no play makes Jack a dull boy"
        for x in itertools.count():
            yield x
    
    for i in infinite_loopy():
        print("All work and no play makes Jack a dull boy")
    

    [参考] Looping from 1 to infinity in Python

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2012-09-19
      • 2020-10-09
      • 2020-10-18
      • 2018-07-24
      相关资源
      最近更新 更多