python-13 可迭代对象 迭代器

可迭代对象需要实现__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:返回值,然后暂停,下次还能接着跑
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容