python----迭代器和生成器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python----迭代器和生成器相关的知识,希望对你有一定的参考价值。
1、python中的for循环
for i in [1,2,3,4]: print(i)
2、迭代和可迭代协议
iterable:可迭代的,可重复的、迭代的
可迭代:笼统的说就是可以被for循环,如,字符串(str)、列表(list)、元组(tuple),字典(dict),集合(set),range、map、filter、enumerate等。
迭代---迭代器:把某个数据集内的元素一个个取出来
可迭代协议的定义:是内部实现了_iter_方法
能被for循环的都是可迭代的,内部必须有一个_iter_方法
iterator:迭代器,迭代程序
_next_方法:就是一个一个取值
***迭代器遵循迭代器协议:必须拥有_iter_方法和_next_方法
l=[1,2,3,4] a=l.__iter__() while True: try: x=a.__next__() print(x) except StopIteration: break
初识生成器
python中提供的生成器
1、生成器函数:用yield语句返回结果,一擦返回一个结果
2、生成器表达式 类似列表推到,生成器返回按产生一个结果的一个对象,不是一次构建一个结果列表
3、生成器Generator
本质就是迭代器(自带了_iter_方法和_next_方法)
4、生成器偶函数
import time def genrator_func(): a=1 print(‘定义了a变量‘) yield a b=2 print(‘定义了一个b变量‘) yield b g=genrator_func() print(‘g:‘,g) #打印g可以发现g就是一个生成器 print(‘_‘*20) #分割线 print(next(g)) time.sleep(1) #sleep一秒看清执行过程 print(next(g))
生成器函数二
# def func(): # #生产衣服 # for i in range(2000000): # yield #生产了第%s件衣服%i # func1=func() # print(func1.__next__())#要一件衣服 # print(func1.__next__())#再买一件衣服 # print(func1.__next__())#再要买一件衣服 # num=0 # for i in func1: #要一批衣服 # print(1) # num+=1 # if num == 5: # break
更过应用
# import time # def tail(filename): # f=open(filename) # f.seek(0,2) #从文件末尾算起 # while True: # line = f.readline() #读取文件新的文本行 # if not line: # time.sleep(0.1) # continue # yield line # tail_g=tail(‘tmp‘) # for line in tail_g: # print(line)
计算移动平均值
def averager(): total=0.0 count=0 average=None while True: term=yield average total+=term count+=1 average = total/count g_avg=averager() next(g_avg) print(g_avg.send(10)) print(g_avg.send(30)) print(g_avg.send(5))
计算移动平均值-预激协程的装饰器
def time(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) next(ret) return ret return inner @time def averager(): total=0.0 ccount=0 average=None while True: term = yield average total +=term ccount+=1 average=total/ccount g_avg = averager() print(g_avg.send(10)) print(g_avg.send(20)) print(g_avg.send(5))
yiel from
def gen1(): for c in ‘AB‘: yield c for i in range(3): yield i print(list(gen1())) def gen2(): yield from ‘AB‘ yield from range(3) print(list(gen2()))
liebiao推导式和生成器表达式
egg_list=[‘鸡蛋%s‘ %i for i in range(10)] #列表解析 laomuji=(‘鸡蛋%s‘ %i for i in range(10)) #生成器表达式 print(laomuji) print(next(laomuji)) #next本质就是调用_next_ print(laomuji.__next__()) print(next(laomuji))
本章小结
可迭代对象:
拥有_iter_方法 如:range()、str、list、tuple、dict、set
特性:惰性运算
迭代器:Iterator:
拥有_iter_方法和_next_方法 如:iter(range()),iter(str),iter(list)、iter(tuple)、iter(set)、reversed(list_o)、map(func,list_o)、filter(func,list_o)、file-o
生成器Generator:
本质:迭代器,所以拥有__iter__方法和__next__方法
特点:惰性运算,开发者自定义
使用生成器的优点:
1.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。
#列表解析
sum([i for i in range(100000000)])#内存占用大,机器容易卡死
#生成器表达式
sum(i for i in range(100000000))#几乎不占内存
以上是关于python----迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章