生成器
#生成器定义:@day4-n11-10min'''
#生成器作用:节省内存,和提高效率,可以循环的同时生成需要的元素《按照一定的规则
#将列表生成器的中括号改成小括号即可变成生成器,使用生成器器是没有生成这个数据的,只存储了一个算法,只有调用了它的时候它才真的按存的算法生成数据。
#生成器不可再用列表的方式切片了
'''**********************生成器小节:***************************
1.只有在调用时才会生成相应的数据,它仅仅是储存了一个生成数据的算法。
2.它只保留当前的值(前面的值它都丢掉了,因此节省了内存)
3.只有2种调用方式
#for循环调用(来迭代它)
#__next__()下一步,进行算法里的下一个数据 #注意:python2.7 make 》next()#
**************************************************************************'''
#( i*2 for i range(100) )#最简单的生成器小括号里是算法
#斐波那契数列:1,1,2,3,5,13,21,34,.....
def fib(max):#斐波那契数列生成函数,max = "生成次数"
n,a,b = 0,0,1
while n < max:
yield b #print()改成yield 就变成了一个生成器(generator),yield 是跳出循环返回当前的结果
a,b =b, a + b
n = n + 1
return 'done'#当用__next__()执行完了则告诉你生成器的循环到头了,生成完了再next则返回一个异常信息为其返回值,当用for循环不会打印返回值。
#print(fib(100))#打印出生成器内存地址
#f = fib(10)
#print(f.__next__())#调用一次
#print(f.__next__())#调用一次
'''yiedl 可以在单线程下实现并行效果,虽然仍然是串行的
yield是保存当前状态跳出循环
__next__()直接运行一次生成器
send()向yield里传值并且带值运行一次生成器
叫:协成'''
'''**********yield的方式实现并行代码实例****************
__author__ = "Alex Li"
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
c = consumer("ChenRonghua")
c.__next__()
# b1= "韭菜馅"
# c.send(b1)
# c.__next__()
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了1个包子,分两半!")
c.send(i)
c2.send(i)
producer("alex")
**************END************************'''
'''迭代器
可直接被for循环的对象称为可迭代对象iterable
*可以被next函数调用并不断返回下一个值的对象称为迭代器:iterator*
可以使用isinstance()判断一个对象是否是iterator对象,注意迭代器(iterator)和可迭代对象(iterable)的区别
——可迭代对象,不一定可以用__next__之类的方法进行操作。但是可以通过iter()函数转化成一个迭代器(interator)
tip1:dir(对象)函数,可以看“对象”的可操作方法
interator可以表示无穷大的数据流。而列表之类的是储存不这样的数据的。
'''列表生成式:
#列表生成式的实例
a = []
for i in range(10):
a.append(i*2)
print(a)
num = [i*2 for i in range(10)]
print(num)
def func(num):
num2=num*3
return num2
num = [func(i) for i in range(10)]
print(num)
#实例结束提醒#