本篇文章记录的是Python函数对象和嵌套的知识。
一、函数对象
精髓:可以把函数名当成变量名去用
函数名和变量名一样,都是指向的是内存地址
二、函数名的用途
1、可以赋值
把一个函数名赋值给另一个变量名
# func=函数的内存地址
def func():
pass
f=func
print(func) # <function func at 0x000001E78F9B3EA0>
print(f) # <function func at 0x000001E78F9B3EA0>
2、当参数
函数名也可以当做参数传给另一个函数
def func():
pass
def foo(x): # × = func的内存地址#
print(x)
x()
foo(func) # foo( func的内存地址)
3、当返回值
函数名也可以当函数的返回值
def func():
pass
def foo(x):
return x
res = foo(func)
print(res)
4、当元素
函数名可以当做容器类型的一个元素
def func():
print('func函数: ',func)
l=[func,]
print(l)
l[0]() # 调用func函数
dic={ 'k1' :func}
print(dic)
dic['k1']() # 调用func函数
5、小练习
def login():
print('登录功能')
def transfer():
print('转账功能')
def check_balance():
print('查询余额')
def change_password():
print('修改密码')
# 巧用数据类型
dic = {
# '1': login,
'0': ('退出', None),
'1': ['登录', login],
'2': ['转账', transfer],
'3': ['查询余额', check_balance],
'4': ['更改密码', change_password],
# '2': transfer,
# '3': check_balance,
}
while 1:
for key, value in dic.items():
print('{} {}'.format(key, value[0]))
choice = input('请输入编号:').strip()
if not choice.isdigit():
print('必须输入编号,憨批')
continue
if choice == '0':
break
if choice in dic:
dic[choice][1]()
else:
print('你输入的命令不存在,憨批')
三、函数的嵌套
1、函数的嵌套调用
在调用一个函数的过程又调用其他的函数
def func1():
print("调用了func1函数")
def func2():
print("调用了func2函数")
def func3():
print("调用了func3函数")
def func():
func1()
func2()
func3()
应用场景:
把各个小功能(小函数),封装到一个大功能(大函数)里面
def max2(x, y):
return x if x > y else y
# 比较4个参数的大小
def max4(a, b, c, d):
# 比较a,b得到res1
res1 = max2(a, b)
# 比较res1,c,得到res2
res2 = max2(res1, c)
# 比较res2,d ,得到res3
res3 = max2(res2, d)
return res3
print(max4(7838237, 9859, 949, 90))
2、函数的嵌套定义
在函数内定义其它的函数
def func():
def func1():
pass
# 举例:
# 求圆的周长和面积,但是只在圆内调用,在其他地方不用
from math import pi
def circle(radius, action=None):
"radius:半径 action为0是求周长 action为1是求面积 "
def get_perimeter(radius):
return 2 * radius * pi
def get_area(radius):
return pi * radius ** 2
# 求圆的周长
if action == 0:
return get_perimeter(radius)
# 求圆的面积
elif action == 1:
return get_area(radius)
==上面的应用场景比较少 , 函数的嵌套定义更多的用在闭包
==
# 函数的嵌套定义你可以认为把一堆函数丢到一个大容器(最外面的那个函数)中
# 同时在外部是无法访问这个函数的,只能在大容器中访问这些函数