函数对象
函数使用方法
之前说函数类似于变量,那么有些变量的使用方法在函数上也是适用的
python中一切皆对象,我们可以对它获取内存地址或者打印类型或者其他的操作
1. 引用,赋值
def self_max(x,y):
if x > y:
return x
return y
a = self_max #此时a就是函数self_max
max_num = a(20,39)
print(max_num)
39
2. 当作函数的返回值
def f2():
print('from f2')
def f1():
return f2
print(f1())
f = f1() #因为调用f1函数返回值为f2,所以f = f1() = f2
f() #f2()
<function f2 at 0x0000025DC8949378>
from f2
3. 当作函数的参数
def f1():
print ('from f1')
def f2(m):
return m
f = f2(f1) #以f1作为m进入函数f2,所以return f1,所以f = f1
f()
from f1
4. 作为容器元素的元素
def f1():
print('from f1')
l = ['str',1,f1]
l[2]()
from f1
函数的嵌套
函数的嵌套可以对比循环的嵌套来看,循环的嵌套是在一个循环之内还有循环,函数的嵌套就是一个函数内还有一个函数
def f1():
def f2():
代码块
f2()
f1()
名称空间和作用域
名称空间:存放名字的空间
1. 内置名称空间
内置名称空间就是在python启动的时候,就会定义出一些函数比如len(),存放在一块内存空间里,这个内存空间就叫做内置名称空间
生命周期:python启动时产生,python关闭时结束
2. 全局名称空间
除了内置名称空间和局部名称空间,就是全局名称空间
生命周期:程序/文件运行的时候产生,运行完毕就结束
3. 局部名称空间
函数内部就叫做局部,所以局部名称空间就是函数内部定义的名称存放的空间
生命周期:函数运行的时候开始,这个函数结束就结束
执行顺序
内置名称空间--->全局名称空间--->局部名称空间
查找顺序
从当前名称空间开始查找,如果查找不到就逐步往上查找
作用域
全局作用域
适用于全局+内置,即全局可以修改内置,内置可以修改全局
局部作用域
只能适用于局部范围(函数内部),在局部定义的名字只能在局部获取
作用域关系在函数定义阶段就已经确定了
函数与函数之间可能会有相同名字的变量,但这两个变量之间毫无关系,他们的作用域不同
补充
#global:从局部修改全局
x = 100
def f1():
global x
x = 1
f1()
print(x)
1
#nonlocal:把局部改成外部
def f1():
x = 1
def f2():
nonlocal x
x = 3
f2()
print(x)
print(f'xxx:{x}')
f1()
xxx:1
3