python學習筆記—yield生成器

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()

相關文章
相關標籤/搜索