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