函数
global与nonlocal关键字使用
- x = 111
def index():
局部修改全局变量 需要使用关键字声明
global x
x = 222
index()
print(x)
name_list = ['jason', 'kevin']
def index():
name_list.append('heiheihei')
index()
print(name_list)
如果想在局部修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则无需关键字global声明 - def index():
x = 111
l1 = [11,22]
def func():
内部局部修改外部局部
l1.append(333)
func()
print(l1)
index()
如果想要在内部的局部修改外部局部的不可变类型数据,需要关键字nonlocal声明
函数对象(函数名)
函数名遇到括号就会调用
-
用法1:函数名可以当做变量名赋值
def index():
print('from index')
a = index
a() # 本质就是在调用index函数 -
用法2:函数名还可以当做函数的实参
def index():
print('from index')
def func(a):
print(a)
a()
print('from func')
func(index) -
用法3:函数名还可以当做函数返回值
def index():
print('from index')
def func():
print('from func')
return index
res = func() # 调用func并接受func的返回值
res() -
用法4:函数名可以当做容器类型(内部可以存放多个数据)的元素
def index():
print('from index')
l = [111, 222, 333, index()]
print(l)
函数的嵌套调用
嵌套调用:函数内部调用其他函数
-
eg:
def index():
print('from index')
def func():
index()
print('from func')
func() -
def many_max(x,y,z,m):
res = my_max(x,y)
res1 = my_max(res,z)
res2 = my_max(res1,m)
return res2
ret = many_max(1,2,3,4)
print(ret)7
函数的嵌套定义
函数体内部定义其他函数
将复杂的功能全部隐藏起来 暴露一个简单的接口
- def all_func(type):
def register():
print('注册功能')
def login():
print('登录功能')
def transfer():
print('转账功能')
def shopping():
print('购物功能')
这里仅仅是延时嵌套定义的现象 暂不考虑优化
if type == '1':
register()
elif type == '2':
login()
elif type == '3':
transfer()
elif type == '4':
shopping()
else:
print('不知道啥功能')
all_func('3')
闭包函数
闭:定义在函数内部的函数
包:内部函数使用了外部函数名称空间中的名字
-
只有符合上述两个特征的函数才可以称之为"闭包函数"
def outer():
x = 222
def index():
print('from index', x)
return index
闭包函数其实是给函数传参的第二种方式 -
方式1:函数体代码需要用到数据 直接在括号内定义形参即可
def index(username):
print(username)
def my_max(a, b):
if a > b:
return a
return b -
方式2:利用闭包函数
def outer(x,y):
x = 2
y = 40
def my_max():
if x > y:
return x
return y
return my_max
res = outer(2,40)
print(res())
print(res())