做这样的C代码
的最有效方法是什么for(int i = 0; i < 10; i++) {
printf("%d\n", i);
if(i == 5)
i = 1;
}
在python中,所以输出将是
0
1
2
3
4
5
1
2
3
4
5
1
我知道next()
的范围iterator = iter(range(0, 10))
for i in iterator:
next(iterator)
print(i)
所以这段代码会打印每一个数字,但我不知道如何跳回来进行循环。
答案 0 :(得分:7)
您可以使用itertools.cycle()
永久循环,然后您可以使用itertools.chain()
附加起始条件,如:
import itertools as it
for i in it.chain((0,), it.cycle(range(1, 6))):
print(i)
0
1
2
3
4
5
1
2
3
4
5
答案 1 :(得分:1)
所以我从评论中意识到我必须像这样使用while循环
i = 0
while i < 10:
print(i)
if i == 5:
i = 1
上面使用itertools和chain的例子很不错,但是我想在循环时想要这样的解决方案,但我没有想到。在我的代码中,有一些更复杂的条件,不仅仅是这个简单的“链”,但我认为它足以演示“跳”。
答案 2 :(得分:0)
@Stephen我试着没有连锁店,工作得很好。好的代码
import itertools as it
for i in it.cycle(range(1, 6)):
print(i)
答案 3 :(得分:0)
您可以使用迭代器类重现大部分C样式for循环。
例如:
class cFor:
def __init__(self,start,condition,step=1):
self.index = start
self.nextIndex = start
self.doLoop = condition
if type(condition) == type(start):
self.doLoop = lambda x:x < condition
self.getNext = step
if type(step) == type(start):
self.getNext = lambda x:x + step
def __iter__(self):
return self
def next(self) : return self.__next__()
def __next__(self):
if self.doLoop(self.nextIndex):
self.index = self.nextIndex
self.nextIndex = self.getNext(self.index)
return self.index
raise StopIteration()
这将允许您执行简单的循环:
for i in cFor(0,10,2) : print(i)
# 0, 2, 4, 6, 8
并且,使用lambdas,您可以提供自己的条件和增量计算:
for i in cFor(1, lambda i:i<=10, lambda i:i+3): print(i)
# 1, 4, 7, 10
或应用更复杂的“内联”计算:
[ a for a,b in cFor((1,1),lambda ab:ab[1]<30,lambda ab:(ab[1],sum(ab))) ]
# [ 1, 1, 2, 3, 5, 8, 13 ]
为了能够修改循环中的索引(或条件或增量),您可以创建一个返回当前索引和迭代器实例的生成器函数。这将允许您控制循环体内迭代器的属性。
def cForLoop(start,condition,step=1):
loop = cFor(start,condition,step)
while True : yield loop.next(), loop
for i,loop in cForLoop(0,10):
print(i)
if i == 5 : loop.nextIndex = 1
# 0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ....
例如,您可以使用它来实现简单的冒泡排序:
arr = [3,7,4,2,8,1,6]
for i,loop in cForLoop(1,len(arr)):
if arr[i-1] > arr[i] :
arr[i],arr[i-1] = arr[i-1],arr[i]
loop.nextIndex = max(1,i-1)
# arr == [1, 2, 3, 4, 6, 7, 8]