函数对象和闭包

一丶函数对象

  函数对象指的是可以吧函数当做变量去使用,有4种使用方法

  1.函数可以赋值

def func():
    print('from func')
f=func 
# print(f,func)
f()

  2.可以当做参数传给另外一个函数

def func():
    print('from func')
def foo(x): # x = func的内存地址
    x()
foo(func) # foo(func的内存地址)

  3.可以当做另外一个函数的返回值

def func():
    print('from func')
def foo(x): # x=func的内存地址
    return x # return func的内存地址
res=foo(func) # foo(func的内存地址)
print(res) # res=func的内存地址
res()

  4.可以当做容器类型的一个元素

def func():
    print('from func')
l=[func,]
print(l)
l[0]()

dic={'k1':func}
print(dic)
dic['k1']()  
def login():
    '''登入功能'''
    while True:
        inp_name = input('输入账号:').strip()
        with open('a.txt','rt',encoding='utf-8')as f:
            for i in f:
                name,pwd = i.strip().split(':')
                if name == inp_name:
                    while True:
                        inp_pwd = input('输入密码:').strip()
                        if inp_pwd == pwd:
                            print('登入成功')
                            return inp_name
                        else:
                            print('密码错误')
            else:
                print('无此用户')

def aaa():
    pass




def pay_money(username):
    '''充值'''
    dic = {}
    with open('b.txt','rt',encoding='utf-8')as f:
        for i in f:
            name,money = i.strip().split(':')
            dic[name] = int(money)
    while True:
        inp_money = input('输入要充值的金额:').strip()
        if not inp_money.isdigit():
            print('充值的钱必须是10的倍数')
            continue
        dic[username] += int(inp_money)
        with open('b.txt','w',encoding='utf-8')as w:
            for name,money in dic.items():
                w.write(f'{name}:{money}\n')
            print('充值成功')
        break


def cut_money(username):
    '''提现'''
    dic = {}
    with open('b.txt','rt',encoding='utf-8')as f:
        for i in f:
            name,money = i.strip().split(':')
            dic[name] = int(money)
    while True:
        inp_money = input('输入要提现的金额:').strip()
        if not inp_money.isdigit():
            print('提现的钱必须是10的倍数')
            continue
        dic[username] -= int(inp_money)
        with open('b.txt','w',encoding='utf-8')as w:
            for name,money in dic.items():
                w.write(f'{name}:{money}\n')
            print('提现成功')
        break

def check_money(username):
    '''余额查询'''
    with open('b.txt','rt', encoding='utf-8')as f:
        for i in f:
            name,money = i.strip().split(':')
            if username == name:
                print('您的余额为:{}'.format(money))
                break

dic = {
    '0':['退出',None],
    '1':['充值',pay_money],
    '2':['转账',aaa],
    '3':['提现',cut_money],
    '4':['查询余额',check_money],
}

def decide_cmd(name):
    '''判断输入的命令'''
    while True:
        for k in dic:
            print(k,dic[k][0])
        cmd = input('请输入命令编号>>: ').strip()
        if not cmd.isdigit():
            print('必须输入命令编号的数字,傻叉')
            continue
        if cmd == '0':
            break
        if cmd in dic:
            dic[cmd][1](name)
        else:
            print('没有此命令')

if __name__ == '__main__':
    name = login()
    if name:
        decide_cmd(name)
函数对象的应用案例

  

 二丶函数的嵌套

  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)
案例1求大小
def circle(radius,action=0):
    from math import pi
    def perimiter(radius):
        return 2*pi*radius
    def area(radius):
        return pi*(radius**2)
    if action == 0:
        return perimiter(radius)
    elif action == 1:
        return area(radius)

res = circle(33,action=0)
print(res)
案例2求圆的面积或周长

   

三丶函数闭包

  1.大前提

    闭包函数=名称空间与作用域+函数嵌套+函数对象

    核心点:名字的查找关系是以函数定义阶段为准

  2.什么是函数闭包  

    "闭"函数指的该函数是内嵌函数

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

def f1():
    x = 33333333333333333333
    def f2():
        print(x)
    f2()
x=11111
def bar():
    x=444444
    f1()
def foo():
    x=2222
    bar()
foo()

  3.为何要有闭包函数=>闭包函数的应用

    两种为函数体传参的方式

    方式一:直接把函数体需要的参数定义成形参

def f2(x):
    print(x)
f2(1)
f2(2)
f2(3)

    方式二:

def f1():
    x=3
    def f2():
        print(x)
    return f2
x=f1()
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()
View Code

  

猜你喜欢

转载自www.cnblogs.com/bk134/p/12533046.html