Python 中的重点来了 : 迭代器 生成器

可迭代的对象:带有__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

@wrapper
def pjs():
    total = 0
    day = 0
    ave = None
    while True:
        day_num = yield ave
        total +=day_num
        day += 1
        ave = total / day

ave = 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 i
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))

yield from语句的生成器

def func():
    yield from list


ret = func()
print(next(ret))
print(next(ret))

效果与上面产生的生成器是一样 的

列表推导式 与 生成器表达式

#alex 准备下十个蛋来报答egon
for i in range(1,11):
    print('alex下的第%s个蛋!!!! 真厉害呀' % i)

# 用列表推导式来表达:
l = [i for i in range(1,11)]
print(l)

生成器的表达是就是把列表推导式的中括号,变成小括号

#alex 准备下十个蛋来报答egon
for 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))

完美

最新免费视频: http://www.pythonav.com/all/10000.html
原文地址:https://www.cnblogs.com/niehaidong111/p/7274415.html