day23
函数对象
函数可以被赋值
def foo():
print('from foo')
def func(f):
f()
func(foo)
函数可以当做函数的返回值
函数可以当做容器的元素
# def foo():
# print(234567,1234,2345)
# l=[foo]
# l[0]()
# def login():
# print('登录'.center(50,'*'))
# def register():
# print('注册'.center(50,'*'))
# def withdraw():
# print('提现'.center(50,'*'))
# def transfer():
# print('转账'.center(50,'*'))
#
# func_dic={'1':['登录',login],
# '2':['注册',register],
# '3':['提现',withdraw],
# '4':['转账',transfer]}
#
# while True:
# print('0 退出')
# for i in func_dic:
# print ('%s %s'%(i,func_dic[i][0]))
# choice = input('输入编号:').strip()
# if choice == '0':
# break
# if choice in func_dic:
# func_dic[choice][1]()
# else:
# print('命令错误,请重新输入')
函数嵌套
函数的嵌套调用:在调用一个函数的过程中,该函数内部又调用了其它函数
def max2(x, y):
if x > y:
return x
else:
return y
def max4(a, b, c, d):
res1 = max2(a, b)
res2 = max2(res1, c)
res3 = max2(res2, d)
print(res3)
max4 (13123, 434252, 212141, 341414) #434252
名称空间与作用域
内置名称空间:放的是python自带的名字,print\len\input
生命周期:解释器启动则产生,解释器关闭则销毁
全局名称空间:放的是*名字
生命周期:运行python文件立即产生,python文件运行完毕则结束
局部名称空间:放的是函数内的名字
生命周期:调用函数则产生,函数调用完毕则销毁
结论: L E G B
名字的查找优先级 局部-全局-内置 基于自己当前所在位置向外查找 LEGB
giobal关键字
global关键字
# 在局部修改全局的名字对应的值(不可变类型)
# x=1
# def func():
# global x #global 修改不可变类型
# x=222
# func()
# print(x) #222
nonlocal关键字:声明一个名字是来自于外层函数,如果外层没有不会找到全局,会报错
x=1
def f1():
x=2 #若是没有x=2,会报错
def f2():
nonlocal x
x=3
f2()
print(x)
f1() #3
全局作用域:全局存活,全局有效
局部作用域:临时存活,局部有效
闭包函数
闭包函数=函数对象+函数嵌套定义+名称空间与作用域
闭函数:定义在函数内部的函数
包函数:内部函数引用了一个外层函数的名字
def foo():
x=111
def wrapper():
print(x)
return wrapper
f=foo()
print(f)
f() #111
闭包函数的作用:闭包函数是一种为函数体传参的方案
为函数体传参:
一:直接使用形参
def wrappera(x):
print(x)
wrapper(111)
wrapper(222)
wrapper(333)
二:闭包函数
def outter():
x=111
def wrapper():
print(x)
return wrapper
f=outter()
f()
def outter(x):
def wrapper():
print(x)
return wrapper
f=outter(111)
f()