python的生成器和迭代器

42 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

1.1 生成器

生成器就是一个可迭代对象

next()
g = (x for x in range(10))
print(next(g))
g = (x for x in range(10))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
0
1
2
3
4

r = (x for x in range(1,6))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))  # 报错,只遍历五个值
a = 10
b = a
b = 5
只要没有被对象引用,那么python就会有垃圾回收机制将其回收掉
for循环的本质就是在调用next()
r = (x for x in range(1,6))
for i in r:  # next(r)
    print(i)
创建生成器的两种方式
1.(i for i in range(1,10))
2. yield 关键字实现
def f():
    print("hello world")
    yield 1
print(f())  # f()生成器对象  # <generator object f at 0x0000024E841B14A0>
g = f()  
print(next(g))  # hello world  1
def a():  # a()是生成器
    print("f1")
    yield 1
    print("f2")
    yield 2
g = a()
next(g)  # f1
next(g)  # f2
print(next(g))  # f1   1
print(next(g))  # f2   2
def a():
    print("f1")
    yield 1
    print("f2")
    yield 2
for i in a():  # next()
    print(i)  # f1  1  f2  2
从现象来看,只要是可以for循环的都是可迭代对象
从本质来看,是内置有iter方法的是可迭代对象

记住for循环本质:能循环是因为内部有一个iter方法

可迭代对象:对象拥有iter方法的
yield 和return有一定的区别:
return:在函数中返回某个值,然后函数结束运行。一般没有返回值类型,就不用写return
yield:带yield的函数是一个生成器,在函数内部碰到yield的时候,函数会返回某个值,并停留在这个位置,当下次执行函数后,会在上次停留的位置继续运行

1.2 迭代器

生成器都是迭代器

什么是迭代器:
1.iter方法
2.next方法

l = [2,4,6]
d = iter(l)
print(next(d))
print(next(d))
print(next(d))

2
4
6
for循环内部本质是2个事情
1.调用可迭代对象的iter方法返回一个迭代器
2.不断调用迭代器的next方法
for i in [1,2,3]:
    print(i)  # [1,2,3].__iter__() ——》iter([1,2,3])
ator = iter([1,2,3])
while True:
    try:
        print(next(ator))
    except StopIteration:
        break

今天的内容就到这里咯,感谢观看哇~