Chỉ cần cho một sự thay thế, làm thế nào về khái quát hóa các hoạt động lặp/increment để một hàm lambda để bạn có thể làm điều gì đó như thế này:
012.
for i in seq(1, 9, lambda x: x*2):
print i
...
1
2
4
8
đâu seq
được định nghĩa dưới đây:
#!/bin/python
from timeit import timeit
def seq(a, b, f):
x = a;
while x < b:
yield x
x = f(x)
def testSeq():
l = tuple(seq(1, 100000000, lambda x: x*2))
#print l
def testGen():
l = tuple((2**x for x in range(27)))
#print l
testSeq();
testGen();
print "seq", timeit('testSeq()', 'from __main__ import testSeq', number = 1000000)
print "gen", timeit('testGen()', 'from __main__ import testGen', number = 1000000)
Sự khác biệt về hiệu suất không phải là nhiều:
seq 7.98655080795
gen 6.19856786728
[EDIT]
Để hỗ trợ lặp đảo ngược và với đối số mặc định ...
def seq(a, b, f = None):
x = a;
if b > a:
if f == None:
f = lambda x: x+1
while x < b:
yield x
x = f(x)
else:
if f == None:
f = lambda x: x-1
while x > b:
yield x
x = f(x)
for i in seq(8, 0, lambda x: x/2):
print i
Lưu ý: Đây thường chạy khác để range
/xrange
trong đó sự chỉ đạo kiểm tra <
/>
được lựa chọn bởi các dấu hiệu iterator, chứ không phải là sự khác biệt giữa đầu và cuối các giá trị.
'for i in range (0,9, -2)' sẽ không lặp lại nếu số đầu tiên nếu nhỏ hơn số thứ hai. – hexparrot
Chính xác hơn, dải ô() không thể cung cấp mảng có bước âm cho giá trị dương. Đó là một vòng lặp vô hạn. – dwerner
@ user1320925 bạn có muốn các giá trị này là các giá trị của i: 1 2, 4, 8, 16, 32 .... –