【python】可迭代对象&迭代器&生成器

傻傻分不清

可迭代对象
  • 举例:容器如字符串、列表、元组、字典、集合,文件对象和管道对象,迭代器
  • 可通过for..in来调用next方法进行遍历的对象
  • 当我们对可迭代对象进行for...in循环时,实际是用iter()方法把它转化为迭代器后再next()返回
  • 有限序列?
迭代器
  • 为容器对象添加 __iter__()__next__() 方法(Python 2.7 中是 next()
    __iter__() 返回迭代器对象本身 self,__next__()则返回每次调用next()或迭代时的元素;
  • 内置函数 iter() 将可迭代对象转化为迭代器
  • 通过yield语句快速生成迭代器
生成器
  • 迭代器的一种,即上面的第三种
  • 两种类型:生成器函数(包含yield的函数)和生成器表达式(把列表生成式的[]改为())
  • return关键词被yield取代,程序执行到 yield 会返回值并暂停,再次调用 next() 时会从上次暂停的地方继续开始执行。
是这样吗↓

普通函数

def sth():
    result = []
    for … in …
        result.append(x)
    return result

生成器函数

def iter_sth():
    for … in …
        yield x

迭代器构造

class Counter:
    def __init__(self):
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        i = self.index
        if i < 10:
            self.index += 1
            return i
        else:
            raise StopIteration

counter = Counter()
for i in counter:
    print(i)

让普通对象可迭代

class Name:
    def __iter__(self):
        return iter(['zhangsan', 'lisi', 'wangwu'])

name = Name()
for n in name:
    print(n)

你可能感兴趣的:(【python】可迭代对象&迭代器&生成器)