可迭代对象需要实现__iter__()方法 并且__iter__()返回了迭代器对象
isinstance()判断对象是否是可迭代对象或者是一个已知的数据类型
isinstance(o,t) o是需要判断的对象,t是判断是不是什么类型
from collections.abc import Iterator
print(isinstance(123, Iterator)) # 是不是迭代器对象
print(isinstance(123, int))
print(isinstance('123', Iterable)) # 是不是可迭代对象
--------------------------
False
True
True
迭代器
迭代器是一个可以记住遍历位置的对象
通过iter() 获取可迭代对象的迭代器
iter()就是调用对象的__iter__()方法的返回值作为自己的返回值
通过next() 一个个取元素,取完后再调用会引发一个越界异常
next()也是调用__next__()
可迭代对象不一定是迭代器对象,但迭代器对象一定是可迭代对象
可以用iter()方法把可迭代对象转换成迭代器对象
一个对象拥有__iter__()方法 是可迭代对象
拥有__iter__()和__next__()方法 就是迭代器对象
自定义迭代器类
两个特性:要实现有__iter__()和__next__()方法
class MyIterable(object):
def __init__(self):
self.num = 0
def __iter__(self):
return self
def __next__(self):
if self.num >= 10:
raise StopIteration("终止迭代,数据已经取完")
self.num += 1
return self.num
mi = MyIterable()
for i in mi:
print(i)
-----------------------------------------
1
2
3
4
5
6
7
8
9
10
生成器(generator)
python中一边循环一边计算的机制,叫做生成器
生成器表达式
gen = (i*5 for i in range(5)) # range(5) 从 0 开始,到 5 之前 结束,步长为 1。
print(gen)
for i in gen:
print(i)
-------------------------
<generator object <genexpr> at 0x00000200FF1BAA80>
0
5
10
15
20
生成器函数
python中使用了yield关键字的函数就称为生成器函数
yield的作用:
1、类似return,将制定值或多个值返回给调用者
2、yield语句一次返回一个结果,在每个结果中间,挂起函数,执行next(),再重新从挂起点继续往下执行
def gen(n):
li = []
a = 0
while a < n:
li.append(a)
yield a
a += 1
print(gen(5))
for i in gen(5):
print(i)
----------------------------
<generator object gen at 0x000001BA6F92AA80>
0
1
2
3
4
执行到 yield 时,把值“产出”给调用者,然后暂停函数,保存当前所有状态;下次再被请求时,从暂停处继续执行。
调用 gen(5) 时,函数体并不会立刻执行,而是返回一个生成器对象。只有当你去迭代它(比如用 for 或 next())时,代码才开始跑。
和 return 的区别
- return:返回值,然后整个函数结束。
- yield:返回值,然后暂停,下次还能接着跑