zoukankan      html  css  js  c++  java
  • 函数对象和闭包

    一丶函数对象

      函数对象指的是可以吧函数当做变量去使用,有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}
    ')
                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}
    ')
                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

      

  • 相关阅读:
    第二十节:Scrapy爬虫框架之使用Pipeline存储
    第十九节:Scrapy爬虫框架之Middleware文件详解
    第十八节:Scrapy爬虫框架之settings文件详解
    第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item
    第十六节:Scrapy爬虫框架之项目创建spider文件数据爬取
    第一节:python提取PDF文档中的图片
    第十五节:Web爬虫之selenium动态渲染爬取
    H5移动开发底部导航-博客园老牛大讲堂
    ajax跨域通信-博客园老牛大讲堂
    博客园模板2--博客园老牛大讲堂
  • 原文地址:https://www.cnblogs.com/bk134/p/12533046.html
Copyright © 2011-2022 走看看