在C语言中,我会这样做:
1
2
3
4int i;
for (i = 0;; i++)
if (thereIsAReasonToBreak(i))
break;
如何在Python中实现类似的功能?
我不是python专家,但while (true): if reasonneeded(i) break i = i+1应该可以吗?
python unbounded xrange()的可能重复项
在C语言中,这会导致溢出,而不会变为"无穷大"
是否应该将此问题的标题更改为"在Python中从0循环到无穷大"? 您只是想拥有一个"无限range",因此可以避免while True: i += 1
使用itertools.count:
1
2
3
4import itertools
for i in itertools.count():
if there_is_a_reason_to_break(i):
break
在Python2中,xrange()仅限于sys.maxint,对于大多数实际目的而言可能已足够:
1
2
3
4import sys
for i in xrange(sys.maxint):
if there_is_a_reason_to_break(i):
break
在Python3中,range()可以更高,尽管不能达到无穷大:
1
2
3
4import 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()。
takewhile也可以很好地发挥作用:for x in takewhile(thereIsAReasonToContinue, count()):
对我而言,for i in range(sys.maxint)以MemoryError中断。您还提到了有效的xrange()。
@scai,在Python3 range中替换了Python2s xrange。在Python2中,range创建并返回一个实际的int列表。您没有足够的RAM来存放这么大的清单
1
2
3
4
5
6
7
8def to_infinity():
index=0
while 1:
yield index
index += 1
for i in to_infinity():
if i > 10:break
重申thg435的评论:
1
2
3
4
5
6
7from itertools import takewhile, count
def thereIsAReasonToContinue(i):
return not thereIsAReasonToBreak(i)
for i in takewhile(thereIsAReasonToContinue, count()):
pass # or something else
或更简洁地说:
1
2
3
4from itertools import takewhile, count
for i in takewhile(lambda x : not thereIsAReasonToBreak(x), count()):
pass # or something else
takewhile模仿"行为良好"的C for循环:您有一个延续条件,但有一个生成器而不是一个任意表达式。您可以在C for循环中执行"不良行为"的操作,例如在循环体内修改i。如果生成器是某个局部变量i的闭包,然后您将其弄乱了,也可以使用takewhile模仿它们。从某种意义上说,定义该闭包可以使您特别明显地知道您正在做的事情可能会使您的控制结构混乱。
最简单,最好:
1
2
3
4i = 0
while not there_is_reason_to_break(i):
# some code here
i += 1
选择与Python中C代码最接近的类比可能很诱人:
1
2
3
4
5from itertools import count
for i in count():
if thereIsAReasonToBreak(i):
break
但是要注意,修改i不会像在C中那样影响循环的流程。因此,使用while循环实际上是将C代码移植到Python的更合适的选择。
如果您在C语言中执行此操作,那么您的判断就会像在Python中一样浑浊:-)
更好的C方法是:
1
2
3
4
5int i = 0;
while (! thereIsAReasonToBreak (i)) {
// do something
i++;
}
要么:
1
2
3
4int i; // *may* be better inside the for statement to localise scope
for (i = 0; ! thereIsAReasonToBreak (i); i++) {
// do something
}
那将转化为Python:
1
2
3
4i = 0
while not thereIsAReasonToBreak (i):
# do something
i += 1
只有当您需要在循环中间退出时,才需要担心中断。如果您的潜在出口位于循环的起点(如此处所示),通常最好将出口编码为循环本身。
如果您需要指定首选步长(如范围),并且不想导入外部软件包(如itertools),
1
2
3
4
5
6
7
8def infn(start=0, step_size=1):
"""Infinitely generate ascending numbers"""
while True:
yield start
start += step_size
for n in infn():
print(n)
也许最好的解决方案是使用while循环:
i=1
while True:
if condition:
break
...........rest code
i+=1
1
2
3
4
5a = 1
while a:
if a == Thereisareasontobreak(a):
break
a += 1
您是否要使人迷惑?
a == Thereisareasontobreak(a)? while a?
Thereisareasontobreak返回什么?通过对代码进行逆向工程,唯一可行的方法是,如果循环应该中断,则函数返回a,否则返回不等于a的值(例如0)。这是故意的吗?似乎有点令人费解。如果是有意的,如果您不解释代码的工作原理,您如何期望人们能够使用您的代码?一个很好的习惯是编写不言自明的代码,即使其他人容易快速理解它的作用。对于必须进行逆向工程的代码,情况并非如此。
您还可以通过以下方式进行操作:
1
2
3list=[0] for x in list:
list.append(x+1)
print x
这将导致无限for loop。
以及无限的内存使用情况。
1
2
3
4
5while 1==1:
if want_to_break==yes:
break
else:
# whatever you want to loop to infinity
此循环无限期地进行。
请格式化您的代码。为什么在可以使用while True时执行while 1==1?