物流网站后台,沈阳网站优化建设,山西省网站域名备案得多长时间,网站免费建站系统其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚python有一个很有意思的地方#xff0c;就是def函数可以嵌套在另一个def函数之中。调用外层函数时#xff0c;运行到的内层def语句仅仅是完成对内层函数的定义#xff0c;而不会去调用内层函数#xff0c;除非在嵌套函数之…其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚python有一个很有意思的地方就是def函数可以嵌套在另一个def函数之中。调用外层函数时运行到的内层def语句仅仅是完成对内层函数的定义而不会去调用内层函数除非在嵌套函数之后又显式的对其进行调用。x 99def f1():x 88def f2():print(x)f2()f1()88可以看出f1中的嵌套变量x覆盖了全局变量x99然后f2中的本地变量按照引用规则就引用了x88。下面我们来说说嵌套作用域的一个特殊之处:本地作用域在函数结束后就立即失效而嵌套作用域在嵌套的函数返回后却仍然有效。def f1():x 88def f2():print(x)return f2action f1()action()88这个例子非常重要也很有意思函数f1中定义了函数f2f2引用了f1嵌套作用域内的变量x并且f1将函数f2作为返回对象进行返回。最值得注意的是我们通过变量action获取了返回的f2虽然此时f1函数已经退出结束了但是f2仍然记住了f1嵌套作用域内的变量名x。上面这种语言现象称之为闭包一个能记住嵌套作用域变量值的函数尽管作用域已经不存在。这里有一个应用就是工厂函数工厂函数定义了一个外部的函数这个函数简单的生成并返回一个内嵌的函数仅仅是返回却不调用因此通过调用这个工厂函数可以得到内嵌函数的一个引用内嵌函数就是通过调用工厂函数时运行内部的def语句而创建的。def maker(n):k 8def action(x):return x ** n kreturn actionf maker(2)print(f).action at 0x00000000021C51E0再看一个例子def maker(n):k 8def action(x):return x ** n kreturn actionf maker(2)print(f(4))24这里我们可以看出内嵌的函数action记住了嵌套作用域内得两个嵌套变量一个是变量k一个是参数n即使后面maker返回并退出。我们通过调用外部的函数maker得到内嵌的函数action的引用。这种函数嵌套的方法在后面要介绍的装饰器中会经常用到。这种嵌套作用域引用就是python的函数能够保留状态信息的主要方法了。这里接着说说另一个关键字nonlocal本地函数通过global声明对全局变量进行引用修改那么对应的内嵌函数内部想对嵌套作用域中的变量进行修改就要使用nonlocal进行声明。def test(num):in_num numdef nested(label):nonlocal in_numin_num 1print(label, in_num)return nestedF test(0)F(a)F(b)F(c)a 1b 2c 3这里我们可以看到几个点我们在nested函数中通过nonlocal关键字引用了内嵌作用域中的变量in_num那么我们就可以在nested函数中修改他即使test函数已经退出调用这个“记忆”依然有效。再最后一个例子def test(num):in_num numdef nested(label):nonlocal in_numin_num 1print(label, in_num)return nestedF test(0)F(a)F(b)F(c)G test(100)G(mm)a 1b 2c 3mm 101多次调用工厂函数返回的不同内嵌函数副本F和G彼此间的内嵌变量in_num是彼此独立隔离的。更系统、更深入的探讨欢迎进入我们的专栏《Python数据科学之路》酱油哥来吧一起踏上Python数据科学之路zhuanlan.zhihu.com本专栏仿照美剧的剧集编排方式和整体逻辑架构进行组织目前策划共分为七季第一季Python编程语言核心基础。第二季Python数据分析基本工具。第三季机器学习线性代数核心-Python描述。第四季利用python进行时间序列分析。第五季机器学习概率统计核心-Python描述。第六季机器学习典型算法专题。第七季实战热点深度应用。让我们一步一个台阶共同踏上Python数据科学之旅。