函数嵌套>作用域>闭包函数
一:函数对象
函数是第一类对象,即表示函数可以当做数据传递
可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则。
可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作为返回值返回的话,返回的结果是函数的内存地址。
可以当做容器类型的元素:意思就是可以作为列表和字典的元素利用函数的特性,可以取代多分枝的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函数的以 ...
随机推荐
- testdisk修复文件系统
故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...
- 【大数据】Hadoop的高可用HA
第1章 HA高可用 1.1 HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障(single point of fa ...
- BZOJ3504 CQOI2014危桥(最大流)
如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...
- 【刷题】洛谷 P3455 [POI2007]ZAP-Queries
题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...
- 深踩 AndroidStudio 缓存的坑
本文记录的是今天在群里提到的昨天所踩的一个坑,有关 AndroidStudio 缓存的. 先说一下背景. 我负责的一个项目,对一个图表库有外部依赖.这个图表库是我在维护的,由于新功能在开发中,所以我就 ...
- Container With Most Water - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Container With Most Water - LeetCode 注意点 没什么好注意的... 解法 解法一:暴力求解,假设任意两个端点会是最佳答 ...
- 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告
P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...
- Java EE之会话
1.需要会话的原因 所有HTTP服务器技术都普遍采用HTTP会话的概念,并且Java EE也在规范中添加了对会话的支持. 维持状态 会话用于维持请求和请求之间的状态.HTTP请求自身是完全无状态的.从 ...
- 牛客网NOIP赛前集训营-普及组(第二场)
T1 牛牛刚学习了输入输出,他遇到了一道这样的题目. 输入2个整数a和b 保证输入的a和b在long long范围之内,即满足 -9223372036854775808 <= a, b < ...
- 团体程序设计天梯赛 L1-010. 比较大小
测试数据: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Code: 先确定最小,然后确定第二小 #include <stdio.h> #include < ...