我正在寻找以下问题的简单解决方案。
我们在 python 中是否有用于这种用法的 for 循环?
[2,3,4,5,6,7,8,9,0,1]
我有一个使用while循环的实现:
i = 2
while True:
i = i%9
if i == 1:
break
# payload code here
i+=1
for i in (2, 3, 4, 5, 6, 7, 8, 9, 0, 1):
...
for i in range(2, 10) + range(2):
...
for i in itertools.chain(xrange(2, 10), xrange(2)):
...
for i in (x % 10 for x in xrange(2, 12)):
您可以使用range
:
>>> for i in range(2,10) + range(0,2):
... print i
...
2
3
4
5
6
7
8
9
0
1
或使用itertools.chain
(适用于 py2 和 py3):
>>> from itertools import chain
>>> for i in chain(range(2,10),range(0,2)):
print (i)
...
2
3
4
5
6
7
8
9
0
1
由于print
语句/函数的开销,我更改了每次出现的print
to pass
,但这里是timeit
不同方法的结果,每个运行 10000000 次:
>>> timeit.timeit(stmt='for i in chain(xrange(2,10),xrange(0,2)): pass', setup='from itertools import chain', number=10000000)
11.17552900314331 # Ignacio
>>> timeit.timeit(stmt='for i in chain(range(2,10),range(0,2)): pass', setup='from itertools import chain', number=10000000)
13.646738052368164 # Ashwini
>>> timeit.timeit(stmt='for i in range(10): (i+2) % 10', number = 10000000)
13.806042909622192 # Bengt
>>> timeit.timeit(stmt='for i in (x % 10 for x in xrange(2, 12)): pass', number=10000000)
18.127070903778076 # Ignacio
>>> timeit.timeit(stmt='[(x+2)%10 for x in range(10)] and None', number=10000000)
21.191375017166138 # Bengt
>>> timeit.timeit(stmt='for i in range(2,10) + [0,1]: pass', number=10000000)
10.056025981903076 # Hardik
>>> timeit.timeit(stmt='for i in range(2,10) + range(2): pass', number=10000000)
11.409713983535767 # Ignacio
>>> timeit.timeit(stmt='for i in (2,3,4,5,6,7,8,9,0,1): pass', number=10000000)
2.8564839363098145 # Ignacio
令人沮丧的是,最有效的方法是迭代数字的文字表达,但是,它涉及最少的分配和最少的算术。
>>> for i in range(10):
... print((i + 2) % 10)
...
2
3
4
5
6
7
8
9
0
1
在 Python3 中,您可以使用列表推导和print
函数将其归结为一行:
>>> [print((x + 2) % 10) for x in range(10)] and None
2
3
4
5
6
7
8
9
0
1
在 Python2 中,在前面加上:
>>> from __future__ import print_function
或者,如果您只想要列表:
>>> [(x + 2) % 10 for x in range(10)]
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
尝试使用
for i in range(2,10)+[0,1]:
print i