实例讲解Python生成器的概念

2025-11-05 19:07:32

1、打开Python开发工具IDLE,新建‘gen.py’文件,写代码如下:

list1 = [x for x in range(10)]

print (list1)

gen1 = (x for x in range(10))

print (gen1)

创建列表和生成器,上面的区别仅仅是中括号和小括号。

实例讲解Python生成器的概念

2、F5运行程序,打印出列表和生成器对象

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

<generator object <genexpr> at 0x0000000002F39E58>

实例讲解Python生成器的概念

3、遍历生成器对象才能正常打印出内容。另一种访问方式是gen1.next()

list1 = [x for x in range(10)]

print (list1)

gen1 = (x for x in range(10))

print (gen1)

for i in gen1:

    print (i)

实例讲解Python生成器的概念

4、F5运行程序,生成器的内容逐个打印,所以说生成器也是迭代器一种。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

<generator object <genexpr> at 0x0000000002F39E58>

0

1

2

3

4

5

6

7

8

9

实例讲解Python生成器的概念

5、另一种生成器是yield生成器,当一个函数里有yield那么这个函数就是一个生成器,测试代码如下;

list1 = [x for x in range(10)]

print (list1)

gen1 = (x for x in range(10))

print (gen1)

for i in gen1:

    print (i)

def yieldfun():

    print ('begin')

    r = yield 'a'

    print ('end')

s = yieldfun()

print (type(s))

实例讲解Python生成器的概念

6、F5运行程序,可以发现s是一个生成器对象

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

<generator object <genexpr> at 0x0000000002F39E58>

0

1

2

3

4

5

6

7

8

9

<class 'generator'>

实例讲解Python生成器的概念

7、Python3中生成器的next(),要写成__next__(),完整代码如下:

list1 = [x for x in range(10)]

print (list1)

gen1 = (x for x in range(10))

print (gen1)

for i in gen1:

    print (i)

def yieldfun():

    print ('begin')

    r = yield 'a'

    print ('end')

s = yieldfun()

print (type(s))

s.__next__()

实例讲解Python生成器的概念

8、F5运行程序,程序执行到yield卡住,相当于函数已经返回,不影响程序向下执行

实例讲解Python生成器的概念

9、继续改写代码,执行yield下面的代码,可以继续用__next__(),或者send给 r 传值

list1 = [x for x in range(10)]

print (list1)

gen1 = (x for x in range(10))

print (gen1)

for i in gen1:

    print (i)

def yieldfun():

    print ('begin')

    r = yield 'a'

    print (r)

    print ('end')

s = yieldfun()

print (type(s))

s.__next__()

s.send('x')

实例讲解Python生成器的概念

10、F5运行程序,因为程序中只有一个yield。所以程序会报错,在实际应用中,

yield 一般是一个函数,函数返回值通过send方式传递,程序捕获异常并处理

实例讲解Python生成器的概念

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢