python學習筆記—yield生成器python
1.生成器app
yield能夠返回當前的參數的值。可是yield記錄了當前運行的位置,下次調用的時候會從新從這個位置開始運行。還有就是調用了yield的函數,能夠在一次調用函數的狀況下,返回多個值。固然,你要訪問這些值就必須迭代訪問【以下面的for的方法】。函數
#! /usr/bin/env python學習
def flatten(nested):spa
print nestedelement
for sublist in nested:yield
print sublistmap
for element in sublist :學習筆記
yield element 方法
print 'flatten %d'% element
def main() :
m=[[1,2],[3,4],[5]]
for i in flatten(m) :
print 'main %d'%i
if __name__ == '__main__' : main()
2.皇后問題【沒用yield生成器代碼】
#! /usr/bin/env python
def conflict(map,row,tandem) :
for i in range(0,len(map),1) :
if map[i] == tandem or map[i]-i == tandem - row or map[i]+i == tandem + row :
return 1
return 0
def working(map,row):
if len(map) == n :
print map
return 0
for i in range(0,n,1) :
if conflict(map,row,i) ==0 :
map.append(i)
if working(map,row+1) :
map.pop()
else :
pass
return 1
def main():
global n
n=4
m=[]
working(m,0)
if __name__ == '__main__' : main()
3.使用了yield生成器
值得注意的是判斷函數的對角線問題,對角線有兩條,表示的方法都不同。一個是差值同樣,另外一個是和值同樣。yield能夠生成多個值就是由於到某一層的時候,可能有多個可行解,
這時下層返回的值也就不一樣,for result in working(map+(i,),num)這句中,就至關於working返回了多個解,而後每一個解對應了一個result,因此迭代的時候就能夠像森林同樣展開了。
#! /usr/bin/env python
def conflict(map,tandem) :
row=len(map)
for i in range(0,row,1) :
if map[i] == tandem or map[i]-i == tandem - row or map[i]+i == tandem + row :
return True
return False
def working(map,num):
for i in range(0,num,1):
if not conflict(map,i) :
if len(map) == num-1 :
yield (i,) #到達這裏說明前面已經所有符合要求,只要生成這個值就好
else :
for result in working(map+(i,),num):
yield result + (i,) #result是記錄了working生成的值【即下層的值】,再添加當前的i的值
def main():
map=()
print list(working(map,4))
print len(list(working(map,4)))
if __name__ == '__main__' : main()