代码之家  ›  专栏  ›  技术社区  ›  Dinesh

生成器是迭代器的实例,而不是

  •  0
  • Dinesh  · 技术社区  · 4 年前

    我有以下代码。在我得到的第一个验证中 False 但是 True 在第二次验证中。有人能帮我理解这两种情况有什么不同吗?我正在使用 Python-3.9.5 在…上 Windows-10

    from collections.abc import Iterator
    
    i1 = iter([])
    g1 = (lambda : (yield))()
    print (isinstance(g1, type(i1)))
    
    print(isinstance(g1, Iterator))
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   khelwood Muhammed Elsayed.radwan    4 年前

    如果你 print(type(i1)) 你会发现它不是 Iterator 但是 list_iterator 。这是迭代器的特定实现,而 迭代程序 是迭代器的抽象基类型。

    Generator和list_iterator都是基类iterator的子类型。

    >>> from collections.abc import Iterator
    >>> type1 = type(iter([]))
    >>> type1
    <class 'list_iterator'>
    >>> issubclass(type1, Iterator)
    True
    >>> def gen():
    ...   yield 1
    ...
    >>> type2 = type(gen())
    >>> type2
    <class 'generator'>
    >>> issubclass(type2, Iterator)
    True
    >>> type1 is type2
    False