在Python中从1到无限循环
在C中,我会这样做:
int i; for (i = 0;; i++) if (thereIsAReasonToBreak(i)) break;
我如何在Python中实现类似的function?
使用itertools.count
:
import itertools for i in itertools.count(): if there_is_a_reason_to_break(i): break
在Python2中, xrange()
仅限于sys.maxint,对于大多数实际用途来说这可能已经足够了:
import sys for i in xrange(sys.maxint): if there_is_a_reason_to_break(i): break
在Python3中, range()
可以更高,但不是无穷大:
import sys for i in range(sys.maxsize**10): # you could go even higher if you really want if there_is_a_reason_to_break(i): break
所以最好使用count()
。
def to_infinity(): index=0 while 1: yield index index += 1 for i in to_infinity(): if i > 10:break
重申thg435的评论:
from itertools import takewhile, count def thereIsAReasonToContinue(i): return not thereIsAReasonToBreak(i) for i in takewhile(thereIsAReasonToContinue, count()): pass # or something else
或者更简洁些:
from itertools import takewhile, count for i in takewhile(lambda x : not thereIsAReasonToBreak(x), count()): pass # or something else
takewhile
模仿一个“行为良好”的C for循环:你有一个继续条件,但是你有一个生成器而不是一个任意的expression式。 在C for循环中你可以做的事情是“performance不好”,比如在循环体中修改i
。 如果生成器是关于某个局部variablesi
的closures,那么也可以模仿这些。 从某种意义上说,定义这个闭包使得你在做一些可能会让你的控件结构混淆的东西特别明显。
如果你用C语言来做这个,那么你的判断就像在Python中一样多云:-)
更好的C方式是:
int i = 0; while (! thereIsAReasonToBreak (i)) { // do something i++; }
要么:
int i; // *may* be better inside the for statement to localise scope for (i = 0; ! thereIsAReasonToBreak (i); i++) { // do something }
这将转化为Python:
i = 0 while not thereIsAReasonToBreak (i): # do something i += 1
只有当你需要在循环中途退出时,你才需要担心打破。 如果你的潜在的退出是在循环的开始(因为它看起来在这里),通常最好是将退出编码到循环本身。
最简单和最好的:
i = 0 while not there_is_reason_to_break(i): # some code here i += 1
在Python中select最接近C代码的类比可能是很诱人的:
from itertools import count for i in count(): if thereIsAReasonToBreak(i): break
但是要小心, 修改i
不会像C中那样影响循环stream 。因此,使用while
循环实际上是将C代码移植到Python的更合适的select。
while 1==1: if want_to_break==yes: break else: # whatever you want to loop to infinity
这个循环无限期地去。
a = 1 while a: if a == Thereisareasontobreak(a): break a += 1
这适用于所有python版本:
m=1 for i in range(m): #action here m+=1
简单而直接。
你也可以做以下的方法:
list=[0] for x in list: list.append(x+1) print x
这将导致无限for loop
。