python有两个很有趣的地方性,是def表达式能冗余在另两个def表达式当中。初始化内层表达式时,运转到的内层def语句实际上是顺利完成对内层表达式的表述,而不能去初始化内层表达式,假如在冗余表达式后又隐式的对其展开初始化。
能窥见,f1中的冗余变量x全面覆盖了全局表达式x=99,接着f2中的邻近地区表达式依照提及准则,就提及了x=88。
上面他们而言说冗余回到值的两个特定之处:
邻近地区回到值在表达式完结后就立刻失灵,而冗余回到值在冗余的表达式回到后却依然有效率。
这个例子非常重要,也很有趣,表达式f1中表述了表达式f2,f2提及了f1冗余回到值内的表达式x,并且f1将表达式f2作为回到对象展开回到。最值得注意的是他们通过表达式action
上面这种语言现象称之为闭包:两个能记住冗余回到值表达式值的表达式,尽管回到值已经不存在。
这里有两个应用领域是工厂表达式,工厂表达式表述了两个外部的表达式,这个表达式简单的生成并回到两个内嵌的表达式,实际上是回到却不初始化,因此通过初始化这个工厂函数,能得到内嵌表达式的两个提及,内嵌表达式是通过初始化工厂表达式时,运转内部的def句子而创建的。
再看两个例子:
这里他们能窥见,内嵌的表达式action记住了冗余回到值内得两个冗余表达式,两个是表达式k,两个是参数n,即使后面maker回到并退出。他们通过初始化外部的表达式maker,得到内嵌的表达式action的提及。这种表达式冗余的方法在后面要介绍的装饰器中会经常用到。这种冗余回到值提及,是python的表达式能够保留状态信息的主要方法了。
这里接着说说另两个关键字nonlocal
邻近地区表达式通过global声明对全局表达式展开提及修改,那么对应的,内嵌表达式内部想对冗余回到值中的表达式展开修改,就要使用nonlocal展开声明。
这里他们能看到几个点,他们在nested表达式中通过nonlocal关键字提及了内嵌回到值中的表达式in_num,那么他们就能在nested表达式中修改他,即使test表达式已经退出初始化,这个“记忆”依然有效率。
再最后两个例子:
多次初始化工厂表达式回到的不同内嵌表达式副本F和G,彼此间的内嵌表达式in_num是彼此独立隔离的。
当然还有《机器学习中的微积分-全集(python版)》系列专栏,欢迎大家阅读,配合食用,效果更佳~
有订阅的问题可咨询微信:zhangyumeng0422