生成器
列表和迭代器都能通过列表生成式生成。[]
中的内容就是列表生成式,帮我我们快速生成元素。列表的所有元素已经在内存中存在,假如我们有100万个元素,但是只用到前面几个,就会造成内存浪费。这时候我们就用迭代器。
L = [x for x in range(10)]
print(L)
# 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
迭代器并不会一次性将所有元素加载到内存中。而是在我们用到的时候,才会计算下一个元素的值。生成一个迭代器,只需要将[]
改成()
即可。generator这个对象就是迭代器,它只有一个方法__next__()
用来查看下一个元素。
G = (x for x in range(10))
print(G)
# 输出 <generator object <genexpr> at 0x000001D9CDBF7DB0>
__next__()
方法按照顺序从头开始取,每调用一次,取一个值,当获取的次数大于迭代器元素的个数,会报StopIteration
异常,表示已经取完了。
G = (x for x in range(5))
print(G.__next__())
print(G.__next__())
print(G.__next__())
print(G.__next__())
print(G.__next__())
print(G.__next__()) # 取第六次
# 输出
# 0
# 1
# 2
# 3
# 4
# Traceback (most recent call last):
# File "O:/pythonWorkspace/Include/shengchengqi.py", line 11, in <module>
# print(G.__next__())
# StopIteration
迭代器
迭代器分成两种
一种是可以用for循环的数据结构,包括set,list,tuple,dict等数据类型
另一种是generator,包括生成器和带有yield的generator function
这些统称为迭代对象 Iterable,判断一个对象是不是迭代对象,可以通过isinstance()方法。
from collections import Iterator
from collections import Iterable
seto = ("sss","dddd") # set
print("Iterable:",isinstance(seto,Iterable)) # 判断可迭代对象
print("Iterator:",isinstance(seto,Iterator)) # 判断迭代器
# 输出
# Iterable: True
# Iterator: False
由上面输出可以看出,一些数据类型可以迭代对象,但不是迭代器对象
生成器是Iterator迭代对象,但list,dict,str是Iterable,并不是Iterator。可以通过iter()将Iterable转换成Iterator。
Iterator表示一个数据流,调用next()方法,不断返回下一个值,知道抛出异常。甚至可以存全体自然数。