dbo*_*ouz 2 python types generator python-3.x
Python 3的推出了在调用时要返回的发电机状物体range()和zip().返回的对象就像一个生成器,可以迭代一次,但不能很好地"打印",就像enumerate()返回参数一样.
然而,我很困惑地看到它们是不同的对象类型并且不属于types.GeneratorType,或者至少这是types模块显示的内容.如果期望发电机运行的功能将无法检测到它们.他们的遗产是什么?它们是否属于主要的"发电机"结构,因此它们可以与其他发电机一起识别?
import types
a = [1,2,3]
b = [4,5,6]
# create some generator-type objects
obj_zip = zip(a,b)
obj_enu = enumerate(a)
obj_r = range(10)
print(type(obj_zip))
print(type(obj_enu))
print(type(obj_r))
# checking against types.GeneratorType returns False
print(isinstance(obj_zip,types.GeneratorType))
print(isinstance(obj_enu,types.GeneratorType))
print(isinstance(obj_r,types.GeneratorType))
# checking against their own distinct object types returns True
print(isinstance(obj_zip,zip))
Run Code Online (Sandbox Code Playgroud)
types.GeneratorType
生成器 - 迭代器对象的类型,由生成器函数创建.
生成器函数是语言中的特定内容; 它表示使用yield或yield from(或生成器表达式的函数,它只是内联生成器函数的简写).它是迭代器集的一个子集(你可以调用next()以获取新值的所有东西),而这又是迭代的一个子集(你可以调用iter()它来获取迭代器;迭代器本身就是迭代,其中iter(iterator)表现为身份功能).
基本上,如果你正在测试"我可以循环吗?",请测试isinstance(obj, collections.abc.Iterable).如果你正在检查"这是一个耗尽的迭代器吗?" (也就是说,我会通过循环来消耗它吗?),测试或者isinstance(obj, collections.abc.Iterator)基于鸭子类型的方法,测试iter(obj) is obj(迭代器上的不变量需要使iter(iterator)原始迭代器对象保持不变).
请注意,range它不是生成器或迭代器.根据文档:
范围实际上是一个不可变的序列类型,而不是一个函数,如范围和序列类型 - list,tuple,range中所述.
作为一个不可变的序列类型意味着它是一个可迭代的,但就是这样.它通常被用作迭代器的事实是无关紧要的; 如果它是一个迭代器,这里的第二个循环永远不会执行:
r = range(3)
for i in r:
print("First", i)
for i in r:
print("Second", i)
Run Code Online (Sandbox Code Playgroud)
但它工作得很好,因为每一个(隐含的)调用iter(r)返回一个新的伊特拉TOR基于相同的基础伊特拉BLE.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |