多语言展示
当前在线:458今日阅读:103今日分享:49

实例讲解Python生成器的概念

实例讲解Python生成器的概念,Python生成器也是迭代器的一种,生成器可以节约内存,使用时候才创建变量。
方法/步骤
1

打开Python开发工具IDLE,新建‘gen.py’文件,写代码如下:list1 = [x for x in range(10)]print (list1)gen1 = (x for x in range(10))print (gen1)创建列表和生成器,上面的区别仅仅是中括号和小括号。

2

F5运行程序,打印出列表和生成器对象[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] at 0xF39E58>

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)

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))

6

F5运行程序,可以发现s是一个生成器对象[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] at 0xF39E58>

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__()

8

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

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')

10

F5运行程序,因为程序中只有一个yield。所以程序会报错,在实际应用中,yield 一般是一个函数,函数返回值通过send方式传递,程序捕获异常并处理

推荐信息