Python 从入门到跑路 【九】迭代器和生成器


生成器

列表和迭代器都能通过列表生成式生成。[]中的内容就是列表生成式,帮我我们快速生成元素。列表的所有元素已经在内存中存在,假如我们有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()方法,不断返回下一个值,知道抛出异常。甚至可以存全体自然数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值