函数嵌套>作用域>闭包函数
一:函数对象
函数是第一类对象,即表示函数可以当做数据传递
可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则。
可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作为返回值返回的话,返回的结果是函数的内存地址。
可以当做容器类型的元素:意思就是可以作为列表和字典的元素利用函数的特性,可以取代多分枝的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函数的以 ...
随机推荐
- MDN & IRC
MDN IRC MDN IRC xgqfrms https://developer.mozilla.org/en-US/docs/Mozilla/QA/Getting_Started_with_IRC ...
- 多态在编译器是无法确定引用类型的是哪个子类 可以用 instanceof 在运行期判断
- enginefuncs_t 结构体中的函数
就是常见的 g_engfuncs 中的函数.AMXX 里就是 fakemeta 的 EngFunc_** // 这些函数由引擎提供给EXTDLL使用.mp.dll hl.dll ... typedef ...
- C++ 构造函数初始化列表
C++ 中类初始化列表执行顺序是按照定义的顺序执行,不是写在初始化列表的顺序执行 #include <bits/stdc++.h> using namespace std; class N ...
- 【刷题】BZOJ 2154 Crash的数字表格
Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...
- [洛谷P4819][中山市选]杀人游戏
题目大意:有一张$n$个点$m$条边的有向图,有一个关键点,如果你访问一个点,你会知道它连出的边中有没有关键点,以及若有的话是哪个.问最优策略下不访问关键点而知道关键点的概率 题解:发现若一个点不是关 ...
- LINUX内核分析第七周——可执行程序的装载
一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => ...
- 用Python实现的数据结构与算法:快速排序
一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...
- 解题:WC 2007 石头剪刀布
题面 要我们把边定向,最大化留下来的三元环数目......并不能直接做,考虑容斥,去掉不合法的数目. 那么三个点不成环当且仅当有一个点出度为2一个点入度为2,发现最终答案就是$C_n^3-\sum C ...
- 闲:测试memcpy和std::copy vector之间拷贝
预测:底层C函数肯定比stl算法快 结果:少量数据底层快,大数据以上则stl对vector的处理可能更好 C/C++: #include <iostream> #include <v ...