day16_函数对象

目录


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__)

返回

猜你喜欢

转载自www.cnblogs.com/wjxyzs/p/12903170.html