今日内容
函数对象
函数是第一类对象
1.函数可以被赋值
def foo():
print('hello world')
f = foo
f()
2.函数可以当做参数传给另一个函数
def foo():
print('hello world')
def func(f):
f()
func(foo) # --> f = foo --> f() = foo()
3.函数可以当做函数的返回值
def foo():
print('hello world')
def func(f):
return f
res = func(foo) # res指向foo函数内存地址
4.函数可以当做容器类型的元素
def foo():
print('hello world')
l = [foo]
l[0]() # 执行foo函数
# 优雅的用函数可以被当做容器类型的特性来替代多分支的if判断
def dl():
print('登录'.center(50,'*'))
def zc():
print('注册'.center(50,'*'))
dict1 = {
'0':['退出',exit],
'1':['登录',dl],
'2':['注册',zc],
}
while True:
for i in dict1:
print(f'{i} {dict1[i][0]}')
choice = input('请输入命令编号>>>').strip()
if choice in dict1:
dict1[choice][1]()
else:
print('输入有误请重新输入')
函数嵌套
函数的嵌套调用
在调用一个函数的过程中,该函数内部又动用了其他函数
作用:可以将大工程打散成为一个个小函数,类似于拼高达
def max1(a,b):
if a>b:
return a
if a<b:
return b
def max2(a,b,c,d):
res1 = max1(a,b)
res2 = max1(res1,c)
res3 = max1(res2,d)
print(res3)
max2(654,846,1235,846)
函数的嵌套定义
在函数内又定义了其他函数
特点:函数内是封闭的,外面调用不到里面的参数
def a(a,mode=0):
def b(a):
return a*10
def c(a):
return a*20
if mode == 0:
return b(a)
elif mode == 1:
return c(a)
res = a(10,1)
print(res)
名称空间与作用域
名称空间
Namespace:存放名字与内存地址绑定关系的地方
名称空间分为三大类:
内置名称空间:放的是python自带的名字,例如print\len\input
全局名称空间:放的是顶级的名字,如下x\y\foo
生命周期:运行python文件则立即产生,python文件运行完毕则结束
x = 111
if 10 > 3:
y = 222
def foo():
z = 333
局部名称空间:放的是函数内的名字,如上z
生命周期:调用函数则产生,函数调用完毕则销毁
快捷名:内置->b 全局->g 局部到自己所在局部的局部中间的全部->e 自己所在的局部的局部->l
重要结论1:名字的查找优先级 局部->全局->内置 基于自己当前的位置向外查找
重要结论2:名称空间的嵌套关系是以函数定义为准生成的,与调用位置无关
例1:
def foo():
print(len)
len = 100
def bar():
len = 666
foo()
bar() # 输出100
例2:
x = 100
def f1():
print(x)
x = 222
f1() # 报错 原因:函数先定义,定义过程中在函数内发现x,所以在函数内找,此时语法错误
例3:
x = 1
def f1():
x = 2
def f2():
x = 3
print(x)
f2()
f1()
global关键字
global关键字:引用全局变量
x = 1
def f1():
x = 2
def f2():
global x # 把全局变量引用进来,修改则直接修改全局变量x
x = 3
print(x)
f2()
f1()
nonlocal关键字
nonlocal关键字:引用上一级函数变量,只找函数层面,如果函数层面没有则报错
x = 1
def f1():
x = 2
def f2():
nonlocal x # 把上级函数变量引用进来,修改则直接修改上级函数变量x
x = 3
print(x)
f2()
f1()
作用域
全局作用域:全局存活,全局有效
内置名称空间,全局名称空间
局部作用域:临时存活,局部有效
局部名称空间
闭包函数
闭包函数:函数对象+函数嵌套定义+名称空间与作用域
闭函数:定义在函数内部的函数
包函数:内部函数引用了一个外层函数的名字
# 如何将闭函数在全局环境使用
def foo():
x = 111
def wrapper():
print(x)
return wrapper
x = 222
f = foo()
f() # =wrapper() 得到111
闭包的函数的作用:闭包函数是一种为函数体传参的方法
为函数体传参方案一:直接使用形参
def wrapper(x):
print(x)
wrapper(111)
wrapper(222)
wrapper(333)
为函数体传参方案二:
def outter(x):
def wrapper():
print(x)
return wrapper # 再使wrapper()回到顶级