zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python 生成器与迭代器

Python迭代 生成器
2023-09-11 14:20:29 时间


  因为我基本上是自学,因为各种原因生成器这个语法,一直在我的待办中,今天恰好有点时间,我就把这个待办给结束了。生成器的基础是迭代器,这个我也不是很熟练,所以需要练习一下。

实现迭代器

  迭代器必须实现两个方法,一个是__iter__,一个是__next__方法。__iter__方法用于初始化迭代器,__next__方法用于生成值。我动手实践了一下:

# _*_ coding:utf-8 _*_

class QuadraticGenerator:

    def __iter__(self):
        self.__n = 1
        return self

    def __next__(self):
        n = self.__n
        self.__n+=1
        return n * n

if __name__ == '__main__':
    for i in QuadraticGenerator():
        print(i, end=',')
        if i > 100:
            break

  这个简单的迭代器不断输出平方,永远不会终止,所以我用了一个if去终止,输出结果如下:

1,4,9,16,25,36,49,64,81,100,121,

列表生成式

  列表生成式是python的语法糖,可以简洁地基于一个迭代器生成一个列表。如:

# _*_ coding:utf-8 _*_

if __name__ == '__main__':
    a = [x * x for x in range(10)]
    print(type(a))
    for x in a:
        print(x, end=',')

 &esmp;这种语法创建了一个list,输出为:

<class 'list'>
0,1,4,9,16,25,36,49,64,81,

  如果将生成式的方括号改成小括号,那么就是一个生成器表达式了。我们可以试一试:

# _*_ coding:utf-8 _*_

if __name__ == '__main__':
    a = (x * x for x in range(10))
    print(type(a))
    for x in a:
        print(x, end=',')

  循环时效果和list一样,但是类型是迭代器,输出如下:

<class 'generator'>
0,1,4,9,16,25,36,49,64,81,

生成器函数

  生成器是一个特殊的函数,return关键字变成了yield。每次迭代后会保存函数运行的位置,下次迭代时从保存的位置继续运行。说了这么多不如一个例子:

def seq():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5


if __name__ == '__main__':

    for i in seq():
        print(i, end=',')

  输出结果:

1,2,3,4,5,

 &esmp;通过这个例子,就可以很容易理解网络上那些yield关键字的教程文章了。那么最开始的产生平方的例子就很容易改写了:

def quadratic(n):
    for i in range(n):
        yield i * i


if __name__ == '__main__':

    for i in quadratic(10):
        print(i, end=',')

  比创建一个类的写法简洁多了,输出如下:

0,1,4,9,16,25,36,49,64,81,