生成器和迭代器
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方法
yield和return的区别:
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可迭代对象
什么是迭代器,满足两个条件:
- 有iter方法
- 有next方法
生成器可以for循环,迭代器也可以for循环
for循环内部本质是3个事情:
1. 调用可迭代对象的iter方法返回一个迭代器
2. 不断调用迭代器的next方法
3.处理异常
a = iter([1,2,3])
while 1:
try:
print(next(a))
except StopIteration:
break