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

相关文章
相关标签/搜索