美文网首页
Python | 可迭代对象、迭代器、生成器

Python | 可迭代对象、迭代器、生成器

作者: 简子逍 | 来源:发表于2019-08-22 20:56 被阅读0次

可迭代对象

可迭代对象(Iterable),就是任意定义了一个可以返回迭代器的__iter__方法的对象。
常见的数据类型如列表、元组、字符串等,都属于可迭代对象

from collections import Iterable

print(isinstance([1, 2, 3], Iterable))  # True
print(isinstance({1, 2, 3}, Iterable))  # True
print(isinstance((1, 2, 3), Iterable))  # True
print(isinstance(100, Iterable))  # False

可迭代对象用于for循环:

from collections import Iterable

class A():
    def __init__(self):
        self.arrs = [3, 6, 9]

    def __iter__(self):
        return iter(self.arrs)

for i in A():
    print(i, end=' ')  # 3 6 9
print('')
print(isinstance(A(), Iterable))  # True

class B():
    def __init__(self):
        self.arrs = [3, 6, 9]

    def __getitem__(self, item):
        return self.arrs[item]

for i in B():
    print(i, end=' ')  # 3 6 9
print('')
print(isinstance(B(), Iterable))  # False

迭代器

迭代器(Iterator),就是任意定义了__iter____next__方法的对象。

使用__iter__方法将一个可迭代对象转换成迭代器

from collections import Iterator

print(isinstance([1, 2, 3], Iterator))  # False
print(isinstance(iter([1, 2, 3]), Iterator))  # True

使用__next__方法不断调用并返回下一个值,直到最后抛出StopIteration异常。

from collections import Iterable, Iterator

class C():
    def __init__(self):
        self.n = 0
        self.arrs = [3, 6, 9]

    def __next__(self):
        if self.n < len(self.arrs):
            value = self.arrs[self.n]
            self.n += 1
            return value
        else:
            raise StopIteration

    def __iter__(self):
        return self

i = C()
print(next(i))  # 3
print(next(i))  # 6
print(next(i))  # 9
print(next(i))  # Error: StopIteration
print(isinstance(C(), Iterable))  # True
print(isinstance(C(), Iterator))  # Ture

生成器

生成器(Generator),只需任意方法中包含关键字yield
生成器也是一种迭代器,它特殊的地方在于函数体中没有return关键字,函数的返回值是一个生成器对象。

函数每次运行到yield时,会暂停并保存当前运行状态,返回数值,并在下一次执行next方法时,从保存位置继续往下执行。

from collections import Iterable, Iterator, Generator

def gen():
    yield 3
    yield 6
    yield 9

i = gen()
print(isinstance(i, Iterable))  # True
print(isinstance(i, Iterator))  # True
print(isinstance(i, Generator))  # True
for x in i:
    print(x, end=' ')  # 3 6 9

# yield from 的写法
def gen2():
    yield from [3, 6, 9]

生成器表达式

a = (x for x in range(10))
print(a)  # <generator object <genexpr> at 0x0000023508C30B48>

b = [x for x in range(10)]
print(b)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器适用场景:不必将所有数据一次性加载到内存当中,只有当具体使用时(如调用__next__方法)才生成值,可以节省资源。

相关文章

  • Python基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python中的迭代器和生成器

    今天我们来学习下Python中的迭代器和生成器。 迭代和可迭代对象 在学习迭代器之前,我们需要了解下迭代和可迭代对...

  • 理解迭代器/生成器

    完全理解Python 迭代对象、迭代器、生成器 迭代和生成操作总结 Python迭代器 http://www.ji...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • 迭代器、生成器和协程

    迭代器、生成器和协程 可迭代(Iterable) Python 中任意的对象, 只要定义了可以返回一个迭代器的 _...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

  • python生成器、迭代器、可迭代对象

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

网友评论

      本文标题:Python | 可迭代对象、迭代器、生成器

      本文链接:https://www.haomeiwen.com/subject/peuosctx.html