欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python新手必看:了解可迭代对象和迭代器——第一部分:什么是可迭代对象?

最编程 2024-01-13 20:58:19
...

有编程python基础的同学应该知道,for循环可以用于Python中任何序列类型,包括列表、元组以及字符串等,如下:

>>> import time
>>> ite_1 = ['风', 111, time.time()]
>>> ite_2 = ('hello', 222, (2221, 'test'))
>>> ite_3 = 'abcdefg'
>>> for i in ite_1:    print(i)111
1598796165.6438172

实际上,for、列表推导、in成员关系测试以及内置函数map等工具都可用于任何可迭代对象。

如果对象是实际保存的序列或是可以在迭代工具上下文中(例如, for循环)一次产生一个结果的对象, 那么就看作是可迭代的。 总之,可迭代对象包括实际序列, 以及能按照需求计算的虚拟序列。

其实,可迭代对象(iterable)指代一个支持iter调用的对象,换句话说,只要内部含有__iter__()的对象,就是可迭代对象。
可以i使用dir(obj)查看一个对象所有拥有的方法来判断它是否是一个可迭代对象:

>>> dir(ite_2)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
>>> iter(ite_3)
<str_iterator object at 0x00000202354EF308>
>>> iter_obj = ite_3.__iter__()
>>> iter_obj
<str_iterator object at 0x00000202354A9208>

>>> test = 2333 
>>> dir(test)	#没有__iter__
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> iter_obj = test.__iter__()	# 也就不可迭代
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    iter_obj = test.__iter__()
AttributeError: 'int' object has no attribute '__iter__'

推荐阅读