可能会有程序猿刚开始接触Python的时候感受很清爽,入门很简单,但后边学到生成器和协程的时候就感受有些吃力了。本文主要与你们分享什么是生成器以及生成器表达式。python
下载生成器yield源码bash
书上说:函数使用yield能够定义生成器对象,那么包含yield的函数主是一个生成器函数,它能够生成一个序列,方便迭代中使用,__next__()#python3中的特殊方法,应该避免使用特殊方法,next(c)使用内置函数next()便可。框架
def countdown(n): print("Counting down from %s" % n) while n > 0: yield n n -= 1 return c = countdown(10)print(c.__next__())#python3中的特殊方法,应该避免使用特殊方法print(next(c))#使用内置函数next()for i in c : print(i,end=' ')复制代码
函数对象调用.__next__()函数时开始执行语句,遇到yield语句时中止。可使用循环来操做生成器。 调用close()方法关闭未使用完的生成器。 那么问题来了,yield究竟是什么?函数
咱们把上边的代码稍加变化:工具
def countdown1(n): print("Counting down from %s" % n) while n > 0: yield n*n n -= 1 return c = countdown1(10)print(next(c))print(next(c))print(next(c))for i in c : print(i,end=' ')复制代码
运行以后咱们能够发现程序运行到yield的时候返回了一个值,那么yield和return在功能上有些类似。post
若是你对列表推导有些了解,你会发现,生成器表达式只不过是把列表的[]换成了元组的(),但列表推导返回的是一个结果集,而生成器表达式返回的是一个生成器。 由于这个特色,咱们能够经过流方式访问一个巨大的文件而没必要把它直接加载到内存,这样很大的提升了程序的性能。性能
代码以下:ui
print('')print("生成器表达式:")b = (x*x for x in range(10) if (x % 2 ==0))print(next(b))print(next(b))for i in b : print(i, end=' ')复制代码
【专业Python IDE推荐】——PyCharm spa
PyCharm 是一款Python IDE,其带有一整套能够帮助用户在使用Python语言开发时提升其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。code
更多Python教程:《利用Python自动生成小学生加减乘除口算考试题卷,再也不为手写算术题烦恼!》