码迷,mamicode.com
首页 > 编程语言 > 详细

python 迭代器 第二部分

时间:2017-11-21 17:38:44      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:python






#!/usr/bin/python
# coding:utf-8

#共有9道题

#http://pythontutor.com/visualize.html#mode=display  调试工具

#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)]
‘‘‘

#迭代器必须要有next,才能输出
‘‘‘
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield
       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))

c = consumer("alex")
c.next()
c.send`("韭菜馅")
‘‘‘

#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[i]:
            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[i] = 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[i] = li[i], 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]+i for i in cols)) == len(set(vec[i]-i for i in cols)) == len(set(vec[i]+1 for i in cols)) == len(set(vec[i]-1 for i in cols))):
        print vec


本文出自 “要有梦想,万一实现了呢” 博客,请务必保留此出处http://szgb17.blog.51cto.com/340201/1983825

python 迭代器 第二部分

标签:python

原文地址:http://szgb17.blog.51cto.com/340201/1983825

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!