目录
1.函数对象
精髓:可以把函数当做参数传给其他函数
fun=内存地址
def func():
print('from func')
1.可以赋值
f=func
print(f,func)
2,可以当作函数参数传入
def foo(x): # x=func()
x()
foo(func)
3.可以当作函数当作另一个函数返回值
def foo(x): # x=func()的内存地址
return x
res=foo(func()) # foo(func的内存地址)
print(res) # func的内存地址
4.可以当作容器类型的一个元素
l=[func,]
print(l)
l[0] ( )
dic={'k1':func}
print(dic)
dic['k1']()
def login():
print('登录')
def trannsfer():
print('转账')
def check_balance():
print('查询余额')
def withdraw():
print('体现')
func_dict={
'1':login,
'2':trannsfer,
'3':check_balance,
'4':withdraw
}
func_dict={
'0':['退出',None],
'1':['登录',login()],
'2':['转账',trannsfer],
'3':['查询余额',check_balance()],
'4':['提现',withdraw()]
}
while True:
# print('''
# 0 退出
# 1 登录
# 2 转账
# 3 查询余额
# 4.提现
# ''')
for i in func_dict:
print(i,func_dict[i][0])
choice=input('请输入指令').strip()
if not choice.isdigit():
print('必须输入编号')
continue
if choice in func_dict:
func_dict[choice][1]()
else:
print('输入的指令不存在')
# if choice=='0':
# break
# if choice=='1':
# login()
# elif choice=='2':
# trannsfer()
# elif choice=='3':
# check_balance()
# else:
# print('指令不存在')
2.函数的嵌套
1、函数的嵌套调用:在调用一个函数的过程中又调用其他函数
def max2(x,y):
if x > y:
return x
else:
return y
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
圆形
def circle(radius,action=0):
from math import pi
def peiimiter(radius):
return 2*pi*radius
def area(radius):
return pi*(radius**2)
if action==0:
return peiimiter(radius)
elif action==1:
return area(radius)
函数的嵌套定义:在函数内定义其他函数
def f1():
def f1():
pass
3.闭包函数
一.大前提:
闭包函数=名称空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系时以函数定义阶段为准
二:什么是闭包函数
'闭'函数指的该函数时内嵌函数
'包'函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
闭包函数:名称空间与作用域的应用+函数嵌套
def f1():
x = 33333333333333333333
def f2():
print(x)
f2()
x=11111
def bar():
x=444444
f1()
def foo():
x=2222
bar()
foo()
闭包函数:函数对象
def f1():
x = 33333333333333333333
def f2():
print('函数f2:',x)
return f2
f=f1()
print(f)
x=4444
f()
def foo():
x=5555
f()
foo()
三:为何要有闭包函数=》闭包函数的应用
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参
def f2(x):
print(x)
f2(1)
f2(2)
f2(3)
方式二:名称空间与作用域包给它
def f1(x): # x=3
x=3
def f2():
print(x)
return f2
x=f1(3)
print(x)
x()
4.传参补充
import requests
传参的方案一:
def get(url):
response=requests.get(url)
print(len(response.text))
get('https://www.baidu.com')
get('https://www.cnblogs.com/linhaifeng')
get('https://zhuanlan.zhihu.com/p/109056932')
传参的方案二:
def outter(url):
# url='https://www.baidu.com'
def get():
response=requests.get(url)
print(len(response.text))
return get
baidu=outter('https://www.baidu.com')
baidu()
cnblogs=outter('https://www.cnblogs.com/linhaifeng')
cnblogs()
zhihu=outter('https://zhuanlan.zhihu.com/p/109056932')
zhihu()
5.函数类型提示
str int ('play','music')
def register(name:str,age:int,hobbbies:tuple)->int:
print(name)
print(age)
print(hobbbies)
return 111
# register(1,'aaa',[1,])
res=register('egon',18,('play','music'))
def register(name:str='egon',age:int=18,hobbbies:tuple=(1,2))->int:
print(name)
print(age)
print(hobbbies)
return 111
# register(1,'aaa',[1,])
# res=register('egon',18,('play','music'))
res=register()
def register(name:"必须传入名字傻叉",age:1111111,hobbbies:"必须传入爱好元组")->"返回的是整型":
print(name)
print(age)
print(hobbbies)
return 111
# register(1,'aaa',[1,])
# res=register('egon',18,('play','music'))
# res=register('egon',19,(1,2,3))
print(register.__annotations__)
返回