Python 可迭代对象 / 迭代器 / 生成器

可迭代对象

Python 可迭代对象可以分为三类:

  1. 迭代器(iterator): 生成器(generator)

  2. 序列(list, str, tuple, set)

  3. 字典(dict)

# 可迭代对象
for i in set(1,2,3,4):
      print(i)
# 不能用next(i) TypeError: 'set' object is not an iterator

set集合是一个可迭代对象,但不是迭代器

迭代器

可迭代对象需要实现__iter__方法,迭代器不仅要实现__iter__方法,还需要实现__next__方法

迭代器是可迭代对象的一个子集,它是一个可以记住遍历的位置的对象,它与列表、元组、集合、字符串这些可迭代对象的区别就在于__next__方法的实现,其他列表、元组、集合、字符串这些可迭代对象可以通过Python内置的iter函数能很简单的转化成迭代器。

X = [1,2,3,4,5]
print(type(X))
Y = iter(X)
print(type(Y))
print(next(Y))
print(next(Y))
print(next(Y))
​
# 输出
<class 'list'>
<class 'list_iterator'>
1
2
3

自定义迭代器

class Iterator(object):
    def __init__(self, array):
        self.x = array
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index < len(self.x):
            value = self.x[self.index]
            self.index += 1
        else:
            raise StopIteration
        return value
    
it = Iterator([1,2,3,4,5])
print(type(it))
for i in it:
    print(i)
​
# 输出
<class '__main__.Iterator'>
1
2
3
4
5

使用itertools库生成迭代器

todo

生成器

生成器是迭代器的子集

使用yield关键字构建生成器

yield 后接单个内容

def generator(array):
    for i in array:
        yield i
gen = generator([1,2,3,4,5])
print(type(gen))
for j in gen:
    print(j)
# 输出
<class 'generator'>
1
2
3
4
5

使用yield from关键字构建生成器

yield from 后接可迭代对象,但也是逐个返回

def generator(array):
    for sub_array in array:
        yield from sub_array
​
gen = generator([(1,2,3), (4,5,6,7)])
​
# 输出
1
2
3
4
5
6
7
posted @ 2020-07-20 10:38  林震宇  阅读(202)  评论(0编辑  收藏  举报