函数嵌套>作用域>闭包函数
一:函数对象
函数是第一类对象,即表示函数可以当做数据传递
可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则。
可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作为返回值返回的话,返回的结果是函数的内存地址。
可以当做容器类型的元素:意思就是可以作为列表和字典的元素利用函数的特性,可以取代多分枝的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函数的以 ...
随机推荐
- Linux限制cpu睿频&限制频率
.关闭睿频 > /sys/devices/system/cpu/intel_pstate/no_turbo .限制CPU最大频率到50% " | sudo tee /sys/devic ...
- SpringBoot(十一)_springboot热部署
在开发中,后台修改了代码就要重新启动服务,很是费劲,现在我们可以让SpringBoot自动编译 热启动就需要用到我们在一开始引入的另外一个组件:devtools.它是 Spring Boot 提供的一 ...
- hdu6057 Kanade's convolution 【FWT】
题目链接 hdu6057 题意 给出序列\(A[0...2^{m} - 1]\)和\(B[0...2^{m} - 1]\),求所有 \[C[k] = \sum\limits_{i \; and \; ...
- 单点登录(十六)-----遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决
情况 我们之前已经完成了cas4.2.x登录使用mongodb验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...
- 栈(C语言实现)
栈是一种线性数据结构,顺序可能是 LIFO(后进先出)或 FILO(先进先出). 堆栈主要有三个基本操作: 1.push,把元素压入栈 2.pop,从栈中弹出元素(同时从栈中移除),最后加入的第一个被 ...
- 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数
FIFO.LRU.OPT这三种置换算法的缺页次数 转载 由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...
- Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效
这个应该属于 Qt 的一个bug,Qt assistant 给出相应的解决办法:重写函数“void paintEvent(QPaintEvent *event);”,添加下面截图中的一段代码
- 【Asp.net入门05】第一个ASP.NET 应用程序-测试Asp.net程序
测试示例应用程序 本部分内容: ASP.NET应用程序测试方法 web窗体访问过程 Visual Studio工具栏上有一个下拉列表,其中列出了工作站上已安装的浏览器的名称(单击浏览器名称右侧的向下箭 ...
- vue项目post请求405报错解决办法。
步骤一: 确定ajax语法没有错误. 步骤二: 与后台对接确认请求是否打到nginx上? 步骤三: 检查nginx是否配置了事件转发,比如我们的接口是在,当前地址的8100端口上,并且接口地址上有v1 ...
- go语言从零学起(三) -- chat实现的思考
要通过go实现一个应用场景: 1 建立一个websocket服务 2 维护在线用户的链接 3 推送消息和接受用户的操作 列出需求,很显然的想到了chat模型.于是研究了revel框架提供的sample ...