打开Python开发工具IDLE,新建‘gen.py’文件,写代码如下:list1 = [x for x in range(10)]print (list1)gen1 = (x for x in range(10))print (gen1)创建列表和生成器,上面的区别仅仅是中括号和小括号。
F5运行程序,打印出列表和生成器对象[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
遍历生成器对象才能正常打印出内容。另一种访问方式是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)
另一种生成器是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))
F5运行程序,可以发现s是一个生成器对象[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
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__()
F5运行程序,程序执行到yield卡住,相当于函数已经返回,不影响程序向下执行
继续改写代码,执行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')
F5运行程序,因为程序中只有一个yield。所以程序会报错,在实际应用中,yield 一般是一个函数,函数返回值通过send方式传递,程序捕获异常并处理