1.迭代器
要理解迭代器,首先需要明白迭代器和可迭代对象的区别。一个一个读取、操作对象称为迭代,Python 中,可迭代(Iterable)
对象就是你能用for
循环迭代它的元素,比如列表是可迭代的
- 大多数容器对象都可以使用
for
语句,承接上文装饰器的例子,还是拿英雄的技能举例子 - 王者荣耀中英雄关羽的技能有
一骑当千
单刀赴会
青龙偃月
刀锋铁骑
用for
语句分别迭代出1-4
技能
(yiluo) ➜ Code python3
Python 3.7.5 (default, Nov 29 2019, 14:32:46)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> skills = ['一骑当千','单刀赴会','青龙偃月','刀锋铁骑']
>>> for skill in skills:
... print(skill)
...
一骑当千
单刀赴会
青龙偃月
刀锋铁骑
- 在幕后,
for
语句会调用容器对象中的iter()
。 该函数返回一个定义了__next__()
方法的迭代器对象,该方法将逐一访问容器中的元素 - 我们现在利用一下
iter()
函数 和next()
函数
你能用 next 函数不断的去获取它的下一个值,直到迭代器返回 StopIteration
异常。所有的可迭代对象都可以通过 iter 函数去获取它的迭代器
# 作者:伊洛Yiluo 公众号:伊洛的小屋
# 个人主页:https://yiluotalk.com/
# 博客园:https://www.cnblogs.com/yiluotalk/
>>> skills = ['一骑当千','单刀赴会','青龙偃月','刀锋铁骑']
>>> skill = iter(skills)
>>> print(skill)
<list_iterator object at 0x1037ea5d0>
>>> next(skill)
'一骑当千'
>>> next(skill)
'单刀赴会'
>>> next(skill)
'青龙偃月'
>>> next(skill)
'刀锋铁骑'
>>> next(skill)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
-
skill
就是迭代器 -
next
迭代到没有值的时候就会报错 - 所有的迭代器其实都实现了
__iter__
和__next__
这俩个魔法方法,iter
与next
函数实际上调用的是这两个魔法方法,上面的例子背后其实是这样的
2.另一种实现方式
- 迭代器的另一种实现方式,
__iter__
+__next__:
>>> class Test:
... def __init__(self, a, b):
... self.a = a
... self.b = b
... def __iter__(self):
... return self
... def __next__(self):
... self.a += 1
... if self.a > self.b:
... raise StopIteration()
... return self.a
...
>>> test = Test(0, 5)
>>> next(test)
1
>>> next(test)
2
>>> next(test)
3
>>> next(test)
4
>>> next(test)
5
>>> next(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in __next__
StopIteration
- 能被 for 循环访问的都是可迭代对象,能被 next 函数获取下一个值的是迭代器
欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !
网友评论