函数嵌套>作用域>闭包函数
一:函数对象
函数是第一类对象,即表示函数可以当做数据传递
可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则。
可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作为返回值返回的话,返回的结果是函数的内存地址。
可以当做容器类型的元素:意思就是可以作为列表和字典的元素利用函数的特性,可以取代多分枝的if。
示例:
def auth():
print("登陆......") def register():
print("注册.......") def seach():
print("查看........") dic = {
"": auth,
"": register,
"": seach,
} def interactive():
while True:
msg = """
1 登陆
2 注册
3 查看
"""
print(msg)
choice = input("请输入选择:").strip()
if choice not in dic:
print("没有该功能编号")
continue
else:
dic[choice]() interactive()
二:函数的嵌套
函数的嵌套调用:在函数中调用了其他函数
def max2(x, y):
if x > y:
return x
else:
return y def max3(x, y, z):
res1 = max2(x, y)
res2 = max2(res1, z)
return res2 print(max3(11, 199, 2))
函数的嵌套定义:
在函数中定义其他函数。
函数的嵌套定义只能在定义的同一级别调用。
def func1():
print("weqwewq") def func2(): # 在函数func1中定义func2
print("dsadas")
print(func2) # 打印函数地址
print(func2()) # 运行函数,打印函数的返回值
func2() # 运行函数,print("dsadas") func1()
嵌套函数调用
def f1():
print("f1") def f2():
print("f2") def f3():
print("f3") def f4():
print("f4") f4()
f3()
f2()
f1()
三:名称空间与作用域
什么是名称空间
名称空间有内置名称空间、全局名称空间、局部名称空间,名称空间存放着名字与值的绑定关系:
内置名称空间存放python字自带的名字,内置的名字在解释器启动时生效,在解释器关闭后失效;
全局名称空间存放文件级别的名字,要求是顶头写的:如全局变量、函数名等,全局的名字在文件执行的时候生效,在文件结束或文件执行期间被删除的时候失效;
局部名称空间存放在函数内定义的名字(函数内的参数和函数内的名字),在函数调用时生效,在函数调用结束时候失效;
名称空间的加载顺序
内置名称空间》》全局名称空间》》局部名称空间
在全局无法查看到局部的名称,但是在局部却可以查看全局的名称
四:作用域
作用域即范围
全局范围(内置名称空间与全局名称空间属于该范围):全局存活全局有效
局部范围:函数调用时存活,调用结束时失效,局部有效
作用域关系在函数定义阶段就已经固定,与函数的调用位置没有关系
def f1(): # 定义函数f1
def f2(): # 嵌套定义函数f2
print(x) # 打印变量x的值
return f2 # 返回函数f2的内存地址 x = 100 # 定义全局变量 x = 100 def f3(func): # 定义函数f3
x = 2 # 定义局部变量x=2,其作用域仅在函数f3内有效
func() # 执行传给的函数 x= 10000 # 再次定义一个全局变量x=10000,该全局变量覆盖了上一个,x=100全局变量已经失效 f3(f1())
函数f3(f1()) 执行,首先调用函数f1,定义函数f2,在定义阶段函数f2中x的作用域是全局范围,所以获取的是全局变量x的值,得到返回的函数f2的内存地址,把其内存地址当做实参传递给函数f3,调用函数f3,局部变量x=2无效,于是输出x的值10000。
五:闭包函数
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
应用领域:延迟计算
利用闭包函数封装一个request请求
from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get baidu = index('http://www.baidu.com')
print(baidu().decode('utf-8'))
内部函数包含对外部作用域而非全局作用域的引用;
提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路。
def counter():
n = 0
def incr():
nonlocal n
x = n
n += 1
return x
return incr c = counter()
print(c())
print(c())
print(c())
print(c.__closure__[0].cell_contents)
函数嵌套>作用域>闭包函数的更多相关文章
- 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁
目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套 一个 ...
- python 嵌套作用域 闭包函数
#闭包函数 def multiplier(factor): def multiplyByFactory(number): return number*factor return multiplyByF ...
- python基础—函数嵌套与闭包
python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间 内置在解释器中的名称 2 全局名称空间 顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...
- day12 函数的嵌套调用 闭包函数,函数对象
函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...
- Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】
装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...
- 《Python》 函数嵌套、闭包和迭代器
一.函数的嵌套: 1.函数的嵌套调用 def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b ...
- Day11名称空间,作用域,闭包函数
Day11 1.函数对象: ①可以被引用 ②可以作为另一个函数的参数 ③可以作为另一个函数的返回值0 ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ...
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
- 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归
孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python函数非常的灵活,今天学习了python函数的以 ...
随机推荐
- Nginx和Apache区别
Nginx VS Apache 相同点: 1.都是HTTP服务器软件 2.功能上都采用模块化结构设计 3.都支持通用的语言接口,如PHP.Perl.Python等 4.支持正向.反向代理.虚拟主机. ...
- SD/MMC相关寄存器的介绍
1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前,我们先来看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一.OCR,CI ...
- Discrete Square Roots UVALive - 4270(拓展欧几里得)
a≡b(mod n)的含义是“a和b除以n的余数相同”,其充要条件是“a-b是n的整数倍”: 求所有满足条件r^2=x(mod m)的r 题目已经给定了一个初始的r,x,m #include < ...
- LINQ 学习之筛选条件
从list 里遍历出 id="DM" 且 code="0000" 的数据 var tes1= from u in list.where u.ID == & ...
- [UVALive 3902] Network
图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ...
- 【NOI2016】区间
目链接:http://uoj.ac/problem/222 在数轴上有 n 个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m 个区间共同包含至少 ...
- Maximum Subarray - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...
- Letter Combinations of a Phone Number - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Letter Combinations of a Phone Number - LeetCode 注意点 可以不用按字典序排序 解法 解法一:输入的数字逐 ...
- 《Linux内核设计与实现》第18章读书笔记
第十八章 调试 一.调试开始前的准备 1.准备开始 bug 藏匿bug的版本 相关内核代码的知识 成功调试的关键在于能否将错误重现 2.内核中的bug 其产生原因无数,表象变化也多种多样.从隐藏在源代 ...
- android与H5互相调用
市面上很多android软件都有内嵌H5的,主要是为了节约成本,提高开发效率,其实现原理主要是通过Java代码和JavaScript代码的互相调用来实现. Java调用Js 1,webview初始化: ...