迭代器和生成器
---恢复内容开始---
一:迭代器
双下方法:很少直接调用方法,一般是用其他语句触发
可迭代的一般含有_iter_ 的方法
可迭代的是可以被for循环的
迭代器:含有_iter_,_next_方法
迭代器一定是可迭代的,通过_next()方法一个一个得到。但是可迭代的不一定是迭代器
迭代器的特点:
很方便,且只能去所有数据一次
节省内部空间,因为只有你要用的时候,内存才会产生,
二:生成器
生成器的本质也就是相当于迭代器
生成器的表现:生成器函数,生成器的表达式
生成器函数,函数里面有yield关键字,就是生成器函数
特点:
调用函数的时候不执行函数,而是返回一个生成器
每次调用一个_next()函数返回一个值
直到取完最后一个值,在调用_next()会报错
生成器写一个:一个文件,用户写什么,我能从文件读取到内容,也可以我要看什么内容,用户写了,我就能看到
1 def fun(): 2 f = open('file', encoding='utf-8') 3 while True: 4 a= f.readline().strip() 5 if a.strip(): 6 yield a 7 8 b= fun()---调用函数,是变成一个生成器函数,还不会执行 9 for d in b: 10 print(d)
2.使用send方法写的一个移动平均值,用户输入一个10,那么平均值就是10,如果用户在输入一个值,那么就是总数/个数=的平均值
def fun(f): def inner(*args, **kwargs): ret = f(*args, **kwargs) ret.__next__() return ret return inner @fun def fun1(): sun = 0 cont = 0 avg = 0 while True: ret = yield avg sun += ret cont += 1 avg = sun / cont a = fun1() b = a.send(10) print(b)
列表推导式
lis_ne = ['自动%s' % i for i in range(10)] print(lis_ne)
生成器推导式
g = ('自动%s' % i for i in range(10)) for b in g: print(b) 列表和生成器推导式的区别:
1.列表推导器是的[] 生成器推导器的是()
2.返回值不一样,列表的是直接返回,生成器推导式是不返回,要用的时候,在存在内存。
各种推导式
lise = [i for i in range(30) if i % 3 == 0] print(lise) lise1 = [i * i for i in range(30) if i % 3 == 0] print(lise1) # 字典推导式 # 集合推导式,自带去重功能 lise2 = {i * i for i in [1, -1, 2]} print(lise2) # 生成器:生成器取完值后,就没有了,惰性,取一次
---恢复内容结束---