Python——函数对象与闭包

一、函数对象

  • 精髓:可以把函数当成变量去用

1.1函数可以被引用

def func():
    pass
# func=内存地址
f=func
print(f,func)
f()

1.2 函数可以作为容器类型的元素

def func():
    print('111')

l=[func,]
l[0]()

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

# 函数对象引用示范
'''
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]
}

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('输入的指令不存在')
'''

1.3 函数可以作为参数传入另外一个函数

def func():
    pass

def foo(x):
    print(x)

print(func)
foo(func)

1.4 函数的返回值可以是一个函数

def func():
    print('111')

def foo(x):
    return x

print(func)
res = foo(func) # foo(func的内存地址)
print(res)
res()

1.5 函数嵌套

  • 1.5.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
    
    res=max4(1,2,3,4)
    print(res)
    
  • 1.5.2 函数的嵌套定义:在函数内定义函数

    def circle(radius,action=0):
        """
        action参数
            0:求周长
            1:求面积
        """
        # 求圆形的周长=2 * pi * radius
        from math import pi
    
        def perimiter(radius):
            return 2 * pi * radius
    
        # 求圆形的面积=pi*(radius**2)
        def area(radius):
            return pi * (radius ** 2)
    
        if action == 0:
            res=perimiter(radius)
        elif action == 1:
            res=area(radius)
    
        return res
    
    res=circle(3,action=1)
    print(res)
    

二、闭包函数

  • 闭包函数=名称空间与作用域+函数嵌套+函数对象
  • 核心点:名字的查找关系是以函数定义阶段为准

2.1 闭与包

  • “闭”函数:该函数是内嵌函数

  • "包"函数:该函数包含对外层函数作用域名字的引用(不是对全局作用域)

    # 闭包函数:名称空间与作用域的应用+函数嵌套
    def f1():
        x = 2333
        def f2():
            print(x)
        f2()
        
    # 闭包函数:函数对象
    def f1():
        x = 2333
        def f2():
            print(x)
        return f2
    
    f = f1()
    f()
    

2.2 闭包的用途

  • 向函数传参的另一种方式
# 两种为函数体传参的方式
# 方式一:直接把函数体需要的参数定义成形参
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()

# 应用场景
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()
posted @ 2020-03-20 14:03  群青-Xi  阅读(163)  评论(0编辑  收藏  举报