函数对象,嵌套,名称空间与作用域
一:函数对象
(1)函数名可以被传递
(2)函数名可以被当做参数传递给其余函数
(3)函数名可以当做函数的返回值
(4)函数名可以当做容器类型的参数
例如:
# 函数名可以被传递给变量 def func(): print('test') f = func # 变量名f指向函数的内存地址 通过该内存地址该变量可以找到函数对应的代码块 f() # 变量名f调用函数 print(f) # <function func at 0x00000000020A2E18> #函数名可以当做参数传递给其余函数 def func(): print('test') def func1(args): print(args) func1(func) #指向func的内存地址 <function func at 0x0000000002032E18> func1(func()) # test 没有写return 默认返回None #函数名可以当做函数的返回值 def func(): print('test') def index(): return func print(index) # <function index at 0x00000000021BAA60> index() # 调用函数index res = index() # 输出index的返回值其指向func的内存地址 因为return指向的是func res() # 调用函数func 输出test 在上述中res已经找到啦func的内存地址 通过内存地址可以调用函数 #函数名可以当做容器类型里的元素 def index(): return 'SR' list = [index,index()] # 函数的内存地址 以及函数的值 print(list) # [<function index at 0x00000000020C2E18>, 'SR']
二:函数的嵌套
定义:函数内层在定义函数
作用:可以将复杂的问题进行简单化
例如:
#函数嵌套 比较大小 #a,b,c,d求出其中的最大值 #步骤一:两两比较 选出其中大的在与第三个值比较 def my_max(x,y): if x>y: return x return y #步骤二:调用步骤一中两两比较的函数 在与第三个比较 def index(a,b,c,d): res=my_max(a,b) res1=my_max(res,c) res2=my_max(res1,d) return res2 print(index(1,2,3,4)) # 4
三:名称空间
(1)
定义:存放变量名与变量值绑定关系的地方
例如:
x = 1 #ps:其中变量值存在内存中 那么变量名则存在内存空间中
(2)名称空间的分类
(1)内置名称空间:用来存放Python给我们定义的变量名
例如:
len max print
(2)全局名称空间:当执行python文件的时候 以文件为基础加载进入全局名称空间
例如:
x = 1 while True: y == 2 # PS 无论while 与 if里面嵌套多少层子代码都属于全局名称空间
(3)局部名称空间:属于函数子代码块里的创建的名称
例如:
def index(): number = [1,2,3] user_info ={'name':'SR','age':18} #PS:其中里面的number与user_info属于局部名称
(3)名称空间的加载顺序
(1)当启动python解释器的时候 加载内置空间
(2)当执行python文件的时候 加载全局名称空间
(3)当调用函数里的子代码块的时候 加载的是局部名称空间
(4)名称空间的查找顺序
(1)如果处于全局:全局--->内置
例如:
# 处于全局位置 len = '处于全局名称空间' def index(): len = '处于局部名称空间' print(len) # 站在全部调用的是全局名称空间 处于全局名称空间 #全局名称空间不存在 def index(): len = '处于局部名称空间' print(len) # <built-in function len> 内置空间
(2)如果处于局部:局部--->全局--->---内置
例如:
当局部空间存在值的时候 max=1 def f1(): # max=2 def f2(): max=3 print(max) # 3 直接查找查找局部空间地址 f2() f1() print(max) # 1 查找的全局空间地址 #当局部空间不存在值的时候 max=1 def f1(): def f2(): print(max) # 1 查找的全局空间地址 局部空间地址不存在值 f2() f1() print(max) # 1 查找的全局空间地址
四:作用域
作用域范围:
(1)全局作用域:内置名称空间 与全局名称空间都属于该范围 全局有效 全局存活
(2)局部作用域:局部名称空间属于该范围 局部存活 局部有效
PS:函数作用域在定义阶段就已经作用好了 与函数的调用位置无关
x = 1 def index(): global x x = 999 print(x) index() # 999 print(x) # 999 global将全局名称给修改了 def func(): x = 1 def index(): nonlocal x x = 2 index() print(x) func() # 2