for(i=0;True;i++) in python?

3
有没有更符合Python规范的方法,或者至少更短更简单的方法来完成这个任务:
i = 1
while True:
    res = lookup(i) # returns a value or None
    if res is None:
        break
    else:
        i += 1
        yield res

这是最“Pythonic”的方式,但不是最短或最简单的(count(1))。你的代码实际上很简单:你不需要在结尾处使用else:和缩进。 - ninjagecko
3个回答

7
你可以利用 itertools 库:
from itertools import takewhile, count

# ...
def myfunc():
    return takewhile(lambda x: x is not None, (lookup(i) for i in count(1)))

如果你不喜欢takewhile,无论出于什么原因:

for i in count(1):
     res = lookup(i)
     if res is None: break
     yield res

2
更短,但我不确定它是否更简单。 - foosion
3
如果您了解“takewhile”,那么一眼就能看出这一点,并且它的优点在于它是功能元素的组合,而不是命令式语句的集合。 使用适当的库函数来完成工作是符合“Pythonic”风格的。 - Niklas B.
1
@foosion:我加了另一个版本,使用了一个普通的for循环。 - Niklas B.
@NiklasB。一旦你非常熟悉它,一切都是直观的 :) Count就是我正在寻找的东西。 - foosion
@Steven:是的,但这不是问题的一部分,所以我不能假设它是这样的情况。 - Niklas B.
显示剩余3条评论

3

不使用 itertools 的情况下...

i = 1
res = lookup(i)
while res is not None:
    i += 1
    yield res
    res = lookup(i)

这个重复了代码 res = lookup(i)。我认为 OP 使用 while True 是为了特别消除那个重复。 - Niklas B.
它更短,更简单,即使有重复。 - foosion
嗯,我也不喜欢代码重复,但循环肯定是简化了:P。虽然我对itertools没有任何意见... - Ricardo Cárdenes
1
@foosion:你可以删除else,这样你的原始代码就和之前一样短了。 - Niklas B.

3

itertools.count能够无限地计数:

for i in itertools.count(1):
    res = lookup(i)
    if res is None: break
    yield res

计数器正是我所需要的。比起 i=1,while True 和 i+=1 要好得多。 - foosion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接