关于@修饰符:其实就是将@修饰符下面的函数当成参数传给它上面的函数。
def a(x):
print('a')
@a
def b():
print('b')
其效果等价为:
def a(x):
print('a')
def b():
print('b')
a(b())
有个记忆诀窍,@的下面哪个函数最近,谁就是儿子,@谁就是喊谁爸爸,布局如果是 a @a b,那就是b喊a爸爸,即a(b()),爸爸保护儿子。(如下图:)
@等同于喇叭,他后面的哪个儿子(函数)离他最近才能用它召唤爸爸,并且他的爸爸只要在喇叭@之上就行,不管有多远,爸爸总会回来保护儿子。
@+函数名,不可以加(),喊爸爸要用敬称。禁用@a(),只能用@a
PS:@行后面只能跟函数(不要试图在@后加其他语句,如print等,会报错)如下图:
关于yield关键字:他有2个基本功能:return 返回功能+生成器功能
return返回功能就显示它必须用在函数内部,语句执行到它时跳出该函数并返回值。
见下图:
yield与return第一个不同之处:大家可以看到,yield相当于return,但是他不是直接返回值,而是返回一个生成器(可以理解为一个内存卡),生成器内部的数据只能用for循环之类的读卡器才能读取。
yield与return第二个不同之处:yield其实是个中断点,可以通过再次访问读取下一个值,而return是个断点,见下图,如将yield换成return,那么返回的只能是第一个值,函数内部的运行到第一个return就结束了,无论你用for循环读取几次。
另外,yield常常跟next()函数入对出双,因为,next就是读卡器。用法见下图:
大家可以看到,next的访问,都从中断点后继续进行访问,若生成器已被读完,继续读取则报错。
ps:yield生成器不是一开始就含括了所有返回值,而是通过访问到某个值才在生成器中添加该值,详见下图: