- 優化一:
原代碼
num =range(10)
size = len(num)
events = []
i =0
while i<size:
if i%2==0:
events.append(i)
i+=1
events
改進方法:list comprehensions
events = [i for i in range(10) if i%2 ==0]
優化二:enumerate
i=0
seq = ["one","two","three"]
for element in seq:
seq[i] = '%d:%s' %(i,seq[i])
i+=1
seq
['0:one','1:two','2:three']
替代:
seq = ['one','two','three']
for i,element in enumerate(seq):
seq[i] = '%d:%s' %(i,seq[i])
思考 enumrate(list()) 獲取2個值 ,爲什麼for循環裏面不用element 替代seq[i]呢?
還可以用list comprehension:
def _treatment(pos,element):
return '%d:%s' %(pos,element)
seq = ["one","two","three"]
[_treatment(i,el) for i,el in enumrate(seq)]
迭代器itertools獲取序列中間數據
import itertools
def starting_at_five():
value = raw_input().strip()
while value !='':
for el in itertools.islice(value.split(),4,None):
yield el
value = raw_input().strip()
iter = starting_at_five()
iter.next()
---one two three four five six--
iter.next()
--five--
iter.next()
--six--
python 遞歸:
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
棧溢出,遞歸優化
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)