objeto de funciones, funciones y la función de cierre anidada

1, objeto de función

Se refiere al objeto de función pueden ser tratados como una función de 'datos' de manejar, en particular el uso puede ser dividido en cuatro zonas, como sigue

func=内存地址
def func():
    print('from func')

1、可以赋值
f=func   #将函数的内存地址绑定给f
print(f,func)
f()		#内存地址加()调用函数
2、可以当做函数当做参数传给另外一个函数
def foo(x): # x = func的内存地址
    # print(x)
    x()

foo(func) # foo(func的内存地址)

3、可以当做另外一个函数的返回值
def foo(x): # x=func的内存地址
    return x # return func的内存地址
res=foo(func) # foo(func的内存地址)
print(res) # res=func的内存地址

res()

4、可以当做容器类型的一个元素
l=[func,]
# print(l)
l[0]()			#调用func

dic={'k1':func}
print(dic)
dic['k1']()

函数对象应用示范:

def login():
    print('登录功能')


def transfer():
    print('转账功能')


def check_banlance():
    print('查询余额')


def withdraw():
    print('提现')


def register():
    print('注册')


func_dic = {
    '0': ['退出', None],
    '1': ['登录', login],
    '2': ['转账', transfer],
    '3': ['查询余额', check_banlance],
    '4': ['提现', withdraw],
    '5': ['注册', register]
}
func_dic['1']()


while True:
    for k in func_dic:
        print(k, func_dic[k][0])

    choice = input('请输入命令编号:').strip()
    if not choice.isdigit():
        print('必须输入编号,傻叉')
        continue

    if choice == '0':
        break

    # choice='1'
    if choice in func_dic:
        func_dic[choice][1]()
    else:
        print('输入的指令不存在')

2, la función anidada

1、函数的嵌套定义:在函数内定义其他函数
def f1():
    def f2():
        pass

2、函数的嵌套调用:在调用一个函数的过程中又调用其他函数
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

res=max4(1,2,3,4)
print(res)

# 圆形
# 求圆形的求周长:2*pi*radius
def circle(radius,action=0):
    from math import pi

    def perimiter(radius):
        return 2*pi*radius

    # 求圆形的求面积:pi*(radius**2)
    def area(radius):
        return pi*(radius**2)

    if action == 0:
        return 2*pi*radius

    elif action == 1:
        return area(radius)

circle(33,action=0)

# 圆形
# 求圆形的求周长:2*pi*radius
def circle(radius,action=0):
    from math import pi

    def perimiter(radius):
        return 2*pi*radius

    # 求圆形的求面积:pi*(radius**2)
    def area(radius):
        return pi*(radius**2)

    if action == 0:
        return 2*pi*radius

    elif action == 1:
        return area(radius)

circle(33,action=0)

3, la función de cierre

A: premisa mayor:
la función de cierre y de espacio de nombres scope = + + función anidada función de objeto
punto central: Encontrar el nombre de relación es prevalecerá una función de la fase de definición

Dos: ¿Cuál es la función de cierre de
"cerrar" función se refiere a la función está incorporada en las funciones de
la función de "paquete" se refiere a la función de la capa externa contiene una referencia al nombre del ámbito de función (no en el alcance global)

闭包函数:名称空间与作用域的应用+函数嵌套
def f1():
    x = 33333333333333333333
    def f2():
        print(x)
    f2()
x=11111
def bar():
    x=444444
    f1()

def foo():
    x=2222
    bar()

foo()  #结果为333333333333
闭包函数:函数对象
def f1():
    x = 33333333333333333333
    def f2():
        print('函数f2:',x)
    return f2

f=f1()
# print(f)

# x=4444
# f()
def foo():
    x=5555
    f()

foo() 		#结果为3333333333333333333333333
三:为何要有闭包函数=》闭包函数的应用
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参
def f2(x):
    print(x)

f2(1)
f2(2)
f2(3)

方式二:使用闭包函数
def f1(x): # x=3
    x=3
    def f2():
        print(x)
    return f2   #返回f2函数

x=f1(3)  #定义f2函数的内存地址给X
print(x)
x()  #内存地址+()调用函数

caso:

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

Publicado 16 artículos originales · ganado elogios 0 · Vistas 149

Supongo que te gusta

Origin blog.csdn.net/weixin_46466247/article/details/104996643
Recomendado
Clasificación