#1.为什么要用yield而不是print ,yield 循环,有print就会循环输出几次
#执行流程,外层for循环,然后自己循环,又一次for循环
#而且是先输出print,然后是yield
'''
def item_iterator(embed_list):
for item in embed_list:
if isinstance(item, (tuple, list)):
# print(type(item_iterator(item)))
for item in item_iterator(item):
yield item
else:
yield item
lst = (0, (1, 2), (3, (4, 5)))
for item in item_iterator(lst):
print item
'''
#2.next放主函数,调用next()表达式的值时,其恢复点yield的值总是为None
'''
import time
def A():
while True:
print("----我是A函数---")
# yield
yield 5
time.sleep(0.5)
print("AAAAAAAAAAAA")
def B(c):
while True:
print("----我是B函数---")
next(c)
#next会不断从yield处暂停和恢复
time.sleep(0.5)
print("BBBBBBBBBBBB")
if __name__ == '__main__':
a = A()
print "中断"
B(a)
'''
#3.next 恢复点为None,如果两次next,那么返回值为None
#send放入主函数,send(value)方法是将值传给恢复点yield
'''
def framework(logic):
try:
it = logic()
s = next(it)
print "[FX] logic: ", s
print "[FX] do something"
it.send("async:" + s)
except StopIteration:
pass
def logic():
s = "mylogic2"
r = yield s
print r
framework(logic)
'''
#4.next 这个因为while条件,会向下走
'''
def fibonacci():
a,b=0,1
while True:
yield b
a, b = b, a + b
fib=fibonacci()
print fib.next()
print fib.next()
print fib.next()
print [fib.next() for i in range(10)]
'''
#yield + 循环 只要函数中有yield,循环的时候,那么就是迭代器,不要使用print
'''
def item_iterator(embed_list):
for item in embed_list:
if isinstance(item, (tuple, list)):
for i in item_iterator(item)
yield i
else:
yield item
lst = (0, (1, 2), (3, (4, 5)))
for item in item_iterator(lst):
print item
'''
#素数 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数
'''
def prime_sieve(n):
flags = [True] * n
flags[0] = flags[1] = False
for i in xrange(2, n):
if flags:
yield i
for j in xrange(2, (n - 1) / i + 1):
flags[i * j] = False
for p in prime_sieve(100):
print p
'''
'''
def prime_sieve(n):
flags = {}
for i in xrange(2, n):
for j in xrange(2, (n - 1) / i + 1):
if i==j and i / j == 0:
# print i,j
flags = False
print flags
for key in flags.keys():
if flags[key]:
yield key
for i in prime_sieve(100):
print i
'''
#yield + 循环 对一个序列进行全排列,这个例子说明yield 可以yield
'''
def permutations(li):
if len(li) == 0:
yield li
else:
for i in range(len(li)):
li[0], li = li, li[0]
for item in permutations(li[1:]):
# 有for循环,就会输出yield内容
# [li[0]] + item+permutations(li[1:])
yield [li[0]] + item
for item in permutations(range(3)):
print item
'''
#八皇后 http://blog.csdn.net/u014386870/article/details/44098151
from itertools import *
cols = range(8)
for vec in permutations(cols):
if (8 == len(set(vec+i for i in cols)) == len(set(vec-i for i in cols)) == len(set(vec+1 for i in cols)) == len(set(vec-1 for i in cols))):
print vec