其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚

python有一个很有意思的地方,就是def函数可以嵌套在另一个def函数之中。调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不会去调用内层函数,除非在嵌套函数之后又显式的对其进行调用。

x = 99

def f1():

x = 88

def f2():

print(x)

f2()

f1()

88

可以看出,f1中的嵌套变量x覆盖了全局变量x=99,然后f2中的本地变量按照引用规则,就引用了x=88。

下面我们来说说嵌套作用域的一个特殊之处:

本地作用域在函数结束后就立即失效,而嵌套作用域在嵌套的函数返回后却仍然有效。

def f1():

x = 88

def f2():

print(x)

return f2

action = f1()

action()

88

这个例子非常重要,也很有意思,函数f1中定义了函数f2,f2引用了f1嵌套作用域内的变量x,并且f1将函数f2作为返回对象进行返回。最值得注意的是我们通过变量action获取了返回的f2,虽然此时f1函数已经退出结束了,但是f2仍然记住了f1嵌套作用域内的变量名x。

上面这种语言现象称之为闭包:一个能记住嵌套作用域变量值的函数,尽管作用域已经不存在。

这里有一个应用就是工厂函数,工厂函数定义了一个外部的函数,这个函数简单的生成并返回一个内嵌的函数,仅仅是返回却不调用,因此通过调用这个工厂函数,可以得到内嵌函数的一个引用,内嵌函数就是通过调用工厂函数时,运行内部的def语句而创建的。

def maker(n):

k = 8

def action(x):

return x ** n + k

return action

f = maker(2)

print(f)

.action at 0x00000000021C51E0>

再看一个例子:

def maker(n):

k = 8

def action(x):

return x ** n + k

return action

f = maker(2)

print(f(4))

24

这里我们可以看出,内嵌的函数action记住了嵌套作用域内得两个嵌套变量,一个是变量k,一个是参数n,即使后面maker返回并退出。我们通过调用外部的函数maker,得到内嵌的函数action的引用。这种函数嵌套的方法在后面要介绍的装饰器中会经常用到。这种嵌套作用域引用,就是python的函数能够保留状态信息的主要方法了。

这里接着说说另一个关键字nonlocal

本地函数通过global声明对全局变量进行引用修改,那么对应的,内嵌函数内部想对嵌套作用域中的变量进行修改,就要使用nonlocal进行声明。

def test(num):

in_num = num

def nested(label):

nonlocal in_num

in_num += 1

print(label, in_num)

return nested

F = test(0)

F('a')

F('b')

F('c')

a 1

b 2

c 3

这里我们可以看到几个点,我们在nested函数中通过nonlocal关键字引用了内嵌作用域中的变量in_num,那么我们就可以在nested函数中修改他,即使test函数已经退出调用,这个“记忆”依然有效。

再最后一个例子:

def test(num):

in_num = num

def nested(label):

nonlocal in_num

in_num += 1

print(label, in_num)

return nested

F = test(0)

F('a')

F('b')

F('c')

G = test(100)

G('mm')

a 1

b 2

c 3

mm 101

多次调用工厂函数返回的不同内嵌函数副本F和G,彼此间的内嵌变量in_num是彼此独立隔离的。

更系统、更深入的探讨欢迎进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.com

本专栏仿照美剧的剧集编排方式和整体逻辑架构进行组织,目前策划共分为七季:

第一季:Python编程语言核心基础。

第二季:Python数据分析基本工具。

第三季:机器学习线性代数核心-Python描述。

第四季:利用python进行时间序列分析。

第五季:机器学习概率统计核心-Python描述。

第六季:机器学习典型算法专题。

第七季:实战热点深度应用。

让我们一步一个台阶,共同踏上Python数据科学之旅。

python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?相关推荐

  1. python以某种编码进行打印_如何在一场面试中展现你对Python的coding能力?

    (点击上方快速关注并设置为星标,一起学Python) 来源:Python数据科学    链接: https://mp.weixin.qq.com/s/KwjLpeRT4l-pOc_iRCLWzg 如果 ...

  2. insert 语句的选择列表包含的项多于插入列表中的项_如何定义和使用Python列表(Lists)

    Python中最简单的数据集合是一个列表(list).列表是方括号内用逗号分隔的任何数据项列表.通常,就像使用变量一样,使用=符号为Python列表分配名称. 如果列表中包含数字,则不要在其周围使用引 ...

  3. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  4. python中的映射_一文读懂Python中的映射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  5. python计时器timeit返回秒数_一日一技:Python中的timeit()方法

    timeit()方法 python中的timeit()方法, 它用于获取代码的执行时间.该库将代码语句运行一百万次,并提供从集合中花费的最短时间.这是一种有用的方法,有助于检查代码的性能. 语法如下: ...

  6. python代码在线回归中怎么运行_手把手教你用Python进行回归(附代码、学习资料)...

    原标题:手把手教你用Python进行回归(附代码.学习资料) 作者: GURCHETAN SINGH翻译:张逸校对:丁楠雅 本文共5800字,建议阅读8分钟. 本文从线性回归.多项式回归出发,带你用P ...

  7. python在工程中的应用_将Flash应用于Python项目(转)

    lostpencil 2014-4-7 15:43:00 阅读(1737) 评论(4) == 基于本地的Python应用程序 == === 写在之前 === {{{ 这篇所说的是关于建立python调 ...

  8. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  9. python从地址提取省市区实例_一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块...

    简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...

  10. 回归分析中自变量共线性_具有大特征空间的回归分析中的变量选择

    回归分析中自变量共线性 介绍 (Introduction) Performing multiple regression analysis from a large set of independen ...

最新文章

  1. jupyter notebook中的魔法函数
  2. Hadoop集群中增加与ElasticSearch连接的操作
  3. Spark 1.4新特性概述
  4. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
  5. Sencha Touch2中数据的获取
  6. 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法
  7. java 经纬度度分秒转度_用java实现经纬度坐标度分秒与度批量转换
  8. 焦作哪里有学机器人编程_焦作自学plc入门梯形图编程去哪学
  9. 网络运营和网络营销有什么区别?
  10. 【转】用深度学习揭示数据的因果关系
  11. lotus notes 闪退_win10系统Lotus notes邮箱闪退的恢复办法
  12. 跳槽进阿里了,面试阿里P6也没那么难。
  13. Ubuntu18.04 + RTX2080Ti + CUDA +cudnn 环境配置
  14. SEO原创和伪原创文章的一些技巧
  15. Win10 64位下解决 NVIDIA 显示设置不可用(小白问题)
  16. 计算机快捷键m是什么,电脑常用快捷键有哪些
  17. 流辰信息微服务平台:数字化转型的优良工具!
  18. 【吴恩达机器学习】Week4 编程作业ex3——多分类任务和神经网络
  19. 笔记本外接显示器屏幕发灰解决方案
  20. 眼睛不好者的福音,超大字版本万能五笔!

热门文章

  1. ComponentBase.createMetaData and manifest.json oRoute
  2. 观察者模式在SAP UI5主题更改功能中的应用
  3. Account detail页面加载的性能分析 - 2017-09-25
  4. 通过SAP customizing修改显示message 的type
  5. 404 Not Found: Requested route ('jerrylist.cfapps.eu10.hana.ondemand.com') does not exist
  6. 关于SAP Commerce里CMS页面模型modifiedTime和modifiedtime的大小写问题
  7. 如何在Marketing Cloud里创建extension field扩展字
  8. ABAP system landscape和vue项目webpack构建的一种实践
  9. 使用回溯法解决编辑距离问题(C语言)
  10. 交换机工作原理_交换机的作用是什么?