可迭代的对象:带有__iter__方法的,就是迭代器。字符串,列表,元祖,字典,集合,文件,都是可迭代的
可迭代的对象使用了__iter__方法的,就是迭代器,带有__next__,__iter__方法。
l = [1,2,3,4,6] # l被称为可迭代的对象l1 = l.__iter__() # l1为迭代器l1.__iter__() # 迭代器的两种方法l1.__next__
Python 中的for循环 就是用了迭代器的原理
生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器实例:
def func(): a = 1 b = 3 print('------') yield a print('******') yield b ret = func() # ret就是生成器 ,实质上就是迭代器print(next(ret))print(next(ret))
**执行第三次他会报错
生成器的优点:如果读取大量的内容,那么用迭代器可以减少内存,惰性计算
生成器的应用send语句 加上装饰器 贼牛逼,计算每日平均利率
def wrapper(func): def inner(*args,**kwargs): ret = func(*args,**kwargs) next(ret) return ret return inner@wrapperdef pjs(): total = 0 day = 0 ave = None while True: day_num = yield ave total +=day_num day += 1 ave = total / dayave = pjs()# next(ave)print(ave.send(10))print(ave.send(15))
yield from 语句
正常的情况下的生成器
list =[1,2,3,4,5,6,7,8,9]def func(): for i in list: yield iret = func()print(next(ret))print(next(ret))print(next(ret))print(next(ret))
yield from语句的生成器
def func(): yield from listret = func()print(next(ret))print(next(ret))
效果与上面产生的生成器是一样 的
列表推导式 与 生成器表达式
#alex 准备下十个蛋来报答egonfor i in range(1,11): print('alex下的第%s个蛋!!!! 真厉害呀' % i)# 用列表推导式来表达:l = [i for i in range(1,11)]print(l)
生成器的表达是就是把列表推导式的中括号,变成小括号
#alex 准备下十个蛋来报答egonfor i in range(1,11): print('alex下的第%s个蛋!!!! 真厉害呀' % i)# 用列表推导式来表达:l = (i for i in range(1,11))print(next(l))print(next(l))print(next(l))print(next(l))
完美