迭代器和生成器

Posted zuiziyouran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器和生成器相关的知识,希望对你有一定的参考价值。

迭代器

1.1 什么是可迭代对象

  可以被 for 循环的 , 就是可迭代对象

  首先,我们对一个列表进行for循环。

for i in [1,2,3,4]:  
    print(i)

  上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试

for i in 1234
    print(i) 

结果:
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    for i in 1234:
TypeError: int object is not iterable

报错信息 : int 类型是不可迭代的

  字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的

 


1.2 可迭代协议

  什么是可迭代协议?

  通过 for 循环把内容一个一个取出来,就必须满足 for 的要求 , 这个要求就是可迭代协议

  内部有 __iter__ 方法 , 就是有可迭代协议

我们可以验证一下:

技术分享图片
print(dir([1,2]))
print(dir((2,3)))
print(dir({1:2}))
print(dir({1,2}))

结果:
[__add__, __class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt__, __hash__, __iadd__, __imul__, __init__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __reversed__, __rmul__, __setattr__, __setitem__, __sizeof__, __str__, __subclasshook__, append, clear, copy, count, extend, index, insert, pop, remove, reverse, sort]
[__add__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, count, index]
[__class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __setitem__, __sizeof__, __str__, __subclasshook__, clear, copy, fromkeys, get, items, keys, pop, popitem, setdefault, update, values]
[__and__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __iand__, __init__, __ior__, __isub__, __iter__, __ixor__, __le__, __len__, __lt__, __ne__, __new__, __or__, __rand__, __reduce__, __reduce_ex__, __repr__, __ror__, __rsub__, __rxor__, __setattr__, __sizeof__, __str__, __sub__, __subclasshook__, __xor__, add, clear, copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update]
验证结果

  总结 : 可以被 for 循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。

 


1.3 迭代器

  通过迭代器迭代一个列表

技术分享图片
l = [1, 2, 3, 4]
ite = l.__iter__()  # 通过__iter__生成一个迭代器
item = ite.__next__()
print(item)  # 通过迭代器的__next__方法迭代对象并输出
item = ite.__next__()
print(item)
item = ite.__next__()
print(item)
item = ite.__next__()
print(item)
item = ite.__next__()  # 多余__next__会报错
print(item)
通过迭代器迭代

 

以上是关于迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章

python函数:迭代器和生成器

python函数:迭代器和生成器

迭代器和生成器函数

Python中迭代器和生成器的区别与联系

迭代器和生成器

python的生成器与迭代器和可迭代对象