python基础2-生成器generator、迭代器iterator

1、生成器

  1)列表生成式,使列表更简洁

print([i*2 for i in range(10)])

a = []
for i in range(10):
    a.append(i*2)

print(a)

b = []
def func(x):
    return x**2
c = [ func(i) for i in range(10)]
print(c)

  2)生成器

g = (i*2 for i in range(10))
# print(g)
# for j in g:
#     print(j)

#生成器:只有在调用时才会生成相应的数据;只记录当前位置,只有一个__next__()方法,在2.7里是next()方法


print(g.__next__())

  3)斐波那契数列

def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b = b,a+b
        n = n+1
    return 'done'
#使用for循环,return done       这个done就不会打印
fib(10)

#生成max个fibonacci 

  4)抓取异常

def fib(max):
    n,a,b=0,0,1
    while n<max:
        #print(b)
        yield b
#只要有yield出现,就不是函数啦,而是一个生成器
        a,b=b,a+b
        n = n+1
    return '--done--'
#return的作用就是异常的时候打印的消息
f=fib(4)
print(f)
print(f.__next__())
print("*".center(20,"-"))
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
while True:
    try:
        x = next(f)
        print('f:',x)
    except StopIteration as e:
        print('Generator return value:',e.value)
        break

  5)生成器并行

#生成器并行       单线程下的并行效果,异步io的雏形,epool,我们称之为协程,比线程还小的单位

#next()只会调用yield,不会给yield传值
# 而send也是调用yield,还可以给yield传值

import time
def consumer(name):
    print("%s 准备吃包子啦!"%name)
    while True:
        baozi = yield
        print("包子[%s]来啦,被[%s]吃了!"%(baozi,name))
c = consumer("老头")
c.__next__()
c.send("西葫芦馅")
#c.__next__()
c = consumer("罗利宇")
c.__next__()
b1="韭菜鸡蛋馅"
c.send(b1)

def producer(name):
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("[%s]开始准备做包子啦!"%name)
    for i in range(3):
        time.sleep(1)
        print("[%s]做了1个包子,分两半!"%name)
        c.send(i)
        c2.send(i)
producer("老头")

#可以直接作用于for循环的数据类型:
#一类是集合数据类型,如list,tuple,dict,set,str等
#一类是generator,包括生成器和带yield的generator function
#可以直接作用于for循环的对象统称为可迭代对象:Iterable
#使用isinstance()判断一个对象是否是Iterable对象

from collections import Iterable
print(isinstance([],Iterable))

print(isinstance((x for x in range(10)),Iterable))
#可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

#通过dir查看所有的方法,如果有next()方法,就说明是一个迭代器,只是可迭代的话不一定有next()
from collections import Iterator
print(isinstance((x for x in range(10)),Iterator))

#生成器一定是迭代器,迭代器不一定是生成器


生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator,
把list、dict、str等Iterable变成Iterator,可以使用iter()函数


from collections import Iterator
print(isinstance([],Iterator))
print(isinstance(iter([]),Iterator))
a = [1,2,3]
b = iter(a)
print(b.__next__())
print(b.__next__())
print(b.__next__())
# print(b.__next__())


#在3.0 python中range是迭代器,在2.0中range是列表,xrange才是迭代器
print(range(10))

#在2.7    f有next方法,就是迭代,但是next不能直接用    for line in f.xreadlines()  才能用next(),且只能用next

6)匿名函数

#匿名函数只是没有名字
#函数即变量,只要在调用前,函数定义完毕就ok

calc = lambda x:x*3

print(calc(3))

 

#alt能直接选中前边的某几列,然后一体删除
#ctrl+/多行注释或取消

  

 

posted @ 2017-08-24 17:36  larlly  阅读(246)  评论(0)    收藏  举报