python生成器和迭代器

生成器和迭代器

1.1 生成器

g = (i for i in range(10))  # 不会直接的给你开辟内存空间
print(g)

<generator object <genexpr> at 0x000001B2632CC900>

调用生成器的方法

next(),next

g = (i for i in range(10))  # 不会直接的给你开辟内存空间
# print(g.__next__())
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

g = (i for i in range(1,6))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

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

垃圾回收机制:只要没有被对象引用,那么python就会有垃圾回收机制将其回收掉

for循环的本质就是在调用next()

r = (i for i in range(1,6))
for i in r:
    print(i)

next()
生成器有两种创建方式:
1.(i for i in range(1,10))
yield关键字实现
def fn():
    print('hello world')
    yield 1

g = fn()
print(next(g))

hello world
1
def a():
    print('f1')
    yield 1
    print('f2')
    yield 2

for i in a():
    print(i)

f1
1
f2
2

生成器是可迭代对象

可迭代对象不是迭代器的意思

for i in [2,4,6]:
    print(i)
[2,4,6]是可迭代对象
从现象来看,只要是可以for循环的都是可迭代对象
从本质来看,是内置有iter方法的是可迭代对象
l = [2,4,6]
l.__iter__()
t = (1,2,3)
t.__iter__()
d = {'name':'初雪'}
d.__iter__()

能循环是因为内部有一个iter方法
可迭代对象:对象拥有iter方法
yieldreturn的区别:
return:在函数中返回某个值,然后函数结束运行
yield:带yield的函数是一个迭代器,在函数内部碰到yield的时候,函数会返回某个值,并停留在这个位置,当下次执行函数后,会在上次停留的位置继续运行

1.2 迭代器

生成器都是迭代器

iter方法为我们做了一个事情:返回一个迭代器对象

l = [1,2,3,4]
d = iter(l)
print(d)

<list_iterator object at 0x00000118D835D550>

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

iterator是迭代器的意思
iterable可迭代对象

什么是迭代器,满足两个条件:

  1. 有iter方法
  2. 有next方法

生成器可以for循环,迭代器也可以for循环

for循环内部本质是3个事情:
1. 调用可迭代对象的iter方法返回一个迭代器
2. 不断调用迭代器的next方法
3.处理异常
a = iter([1,2,3])
while 1:
    try:
        print(next(a))
    except StopIteration:
        break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小初雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值