高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。

从python解释器开始执行之后,就在内存中开辟了一个空间

每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。

但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

命名空间和作用域

命名空间一共分为三种:

  全局命名空间

  局部命名空间

  内置命名空间

*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

 

三种命名空间之间的加载与取值顺序:

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

1 x = 1
2 def f(x):
3     print(x)
4
5 print(10)

在全局调用:全局命名空间->内置命名空间

x = 1
def f(x):print(x)f(10)
print(x)

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

函数名的本质

函数名本质上就是函数的内存地址

1.可以被引用

def func():print('in func')f = func
print(f)

2.可以被当作容器类型的元素

def f1():print('f1')def f2():print('f2')def f3():print('f3')l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

3.可以当作函数的参数和返回值

*不明白?那就记住一句话,就当普通变量用

闭包

闭包函数:

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数

由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

是不是直接就把这个函数的名字返回就好了?

这才是闭包函数最常用的用法

def func():name = 'eva'def inner():print(name)return innerf = func()
f()

#输出的__closure__有cell元素 :是闭包函数
def func():name = 'eva'def inner():print(name)print(inner.__closure__)return innerf = func()
f()#输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():def inner():print(name)print(inner.__closure__)return innerf2 = func2()
f2()

def wrapper():money = 1000def func():name = 'eva'def inner():print(name,money)return innerreturn funcf = wrapper()
i = f()
i()

from urllib.request import urlopendef index():url = "http://www.xiaohua100.cn/index.html"def get():return urlopen(url).read()return getxiaohua = index()
content = xiaohua()
print(content)

命名空间:

  一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间

作用域(包括函数的作用域链):

小范围的可以用大范围的但是大范围的不能用小范围的范围从大到小(图)

在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。如果都没有,报错

函数的嵌套:

  嵌套调用

  嵌套定义:定义在内部的函数无法直接在全局被调用

函数名的本质:

  就是一个变量,保存了函数所在的内存地址

闭包:

  内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

转载于:https://www.cnblogs.com/buyisan/p/7252423.html

Python高阶函数-闭包相关推荐

  1. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

  2. python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...

    一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰 ...

  3. python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...

    高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...

  4. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  5. Python高阶函数原理分析及其应用

    三 高阶函数, 闭包和装饰器 所谓高阶函数就是把函数做为参数传入的一类函数. 另外, 返回函数的函数也属于高阶函数. 3.1 函数做为参数传入另外一个函数 3.1.1 高阶函数引入 Python中函数 ...

  6. 快速记忆python函数-【速学速记】Python 高阶函数

    原标题:[速学速记]Python 高阶函数 前言: python 迅速发展壮大起来,多亏了人工智能,AI ,机器学习,深度学习的发展.所以小的给各位看官们准备了收藏已久的视频教程分享给大家!希望能带给 ...

  7. python高阶函数filter_python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  8. python高阶函数map_简单了解python高阶函数map/reduce

    高阶函数map/reduce Python内建了map()和reduce()函数. 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...

  9. python高阶函数(三分钟读懂)

    python高阶函数(三分钟读懂) 函数式编程 Python中,函数是一等对象 一等对象:具有特点 ① 对象是在运行时创建的 ② 能赋值给变量或作为数据结构中的元素 ③ 能作为参数传递 ④ 能作为返回 ...

  10. python高阶函数——sorted排序算法

    python高阶函数--sorted排序算法 python 内置的sorted()函数可以对一个list进行排序: >>> sorted([8,3,8,11,-2]) [-2, 3, ...

最新文章

  1. 在VMware15中创建虚拟机安装ubuntu系统(超详细教程)
  2. java 对 mysql 最简配置
  3. 通过StringBuilder的reverse()实现倒序
  4. python可以干嘛知乎-Python到底可以干什么?老男孩Python视频教程
  5. vsftpd登录报530
  6. ajax form表单提交_LayUI提交表单,监听select,分页组件
  7. java猜单词游戏_序列应用——猜单词游戏
  8. SPOJ COT Count on a tree 主席树
  9. aspx页面中文汉字显示为乱码
  10. LA 2572 Viva Confetti (Geometry.Circle)
  11. 如何挖掘评论中的关键信息
  12. wxpython学习笔记
  13. 自学是一门手艺_错误报告是一门科学
  14. 传智健康(黑马项目)
  15. 一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?
  16. 通过V90PN通讯故障实例来看线路干扰与线路错误的区别
  17. 计算机笔记--【Java设计模式】
  18. 等待事件统计视图 | 全方位认识 sys 系统库
  19. 三菱梯形图转换c语言软件,三菱梯形图转51单片机软件使用程序超过100步又要使用软件的朋友.pdf...
  20. python3 迭代器(自定义迭代器)

热门文章

  1. Ubuntu18 yolov5使用ncnn部署
  2. ubuntu18.04+RTX 3090安装docker并配置pytorch环境
  3. 一行代码安装xgboost
  4. python求解LeetCode习题Sort Colors
  5. php时间测试,PHP 测试程序运行时间
  6. python路径怎么查看_:怎么查看python的安装路径
  7. C++ std::thread::hardware_concurrency() 获取CPU核心数
  8. Java SecureRandom 简单生成随机正整数
  9. 基于vue+node的校园交流平台
  10. list所有元素相加 python_什么是序列,Python序列详解(包括序列类型和常用操作)...