zoukankan      html  css  js  c++  java
  • 函数进阶 1------总结

    目录

    函数的进阶

    1. 闭包函数

    • 闭包函数:闭包函数把闭包函数内部的变量 +闭包函数内部的函数 这两者包裹在一起,然后通过返回值的形式返回处来。

      这样一来,就能在全局进行对闭包函数内部的函数的调用

    • 闭包函数至少得符合函数的嵌套

    def f1(url):  #f1就是闭包函数
        def spider():
            print(url)
        return spider  #函数对象
    taobao = f1('www.taobao.com') #这里的 taobao 就是函数 spider
    taobao() #打印结果: www.taobao.com
    

    2 .装饰器

    (1)二层装饰器

    • 装饰器就是对闭包函数的高级应用
    • 装饰器的性质和特点:
      • 装饰器的本质就是一个函数
      • 装饰器的功能就是给被装饰的函数增加功能,增加功能是必须满足一下两点
        1. 不改变被装饰函数的源代码
        2. 不改变被装饰函数的调用方式(就是说以前用 f1() 调用,装饰之后还用 f1() 调用,被装饰函数有多少形参,装饰后,调用f1()时,其括号中也得有多少实参,不能多也不能少)
    • 下面的例子是登陆装饰器
    def zhuangshi(func):  # 接收到值后,func 就是函数: hanshu
        def login(*args, **kwargs):
            while True:
                user_inp = input('请输入用户名:')
                pwd_inp = input('请输入密码:')
                with open('user_info.txt', 'r', encoding='utf8')as fr:
                    for user_info in fr:
    
                        user_name, pwd = user_info.strip().split(':')
                        if user_inp == user_name and pwd_inp == pwd:
                            print('登陆成功')
                            res = func(*args, **kwargs)
                            return res
                    else:
                        print('登录失败')
    
        return login
    
    
    @zhuangshi  # 双层装饰器,实现了:hanshu = zhuangshi(hanshu),必须放在被装饰函数的上一行
    def hanshu(x, y):
        return x + y
    
    print(hanshu(10, y=20))
    

    (2)三层装饰器

    • 就是在双层的外面再加一层函数

      在下面再return 一次第二层函数

    • 三层装饰器实现了向装饰器中传参事物功能

    username_list = []
    def sanceng(role):
        def login_deco(func):
            def wrapper(*args, **kwargs):
                if username_list:
                    print('已经登录,请勿重复登录')
                    res = func(*args, **kwargs)
                    return res
                username_inp = input('请输入用户名:')
                pwd_inp = input('请输入密码:')
    
                with open(f'{role}_info.txt', 'r', encoding='utf8') as fr: #选课系统中判断是哪一种登陆 :role为老师、学生和管理员
                    for user_info in fr:
                        username, pwd = user_info.strip().split(':')
                        if username_inp == username and pwd_inp == pwd:
                            print('登录成功')
                            username_list.append(username)
    
                            res = func(*args, **kwargs)
                            return res
                    else:
                        print('登录失败')
        
            return wrapper
        return login_deco
    
    @sanceng('user')
    def index(x, y):
        print('index')
        print('x,y', x, y)
        return 123
    
    res = index(10, 20)
    print(res)
    

    (3)装饰器模板

    # 二层装饰器模板
    def deco(func):
        def wrapper(*args, **kwargs):
            # 要加什么功能就加上去
            res = func(*args, **kwargs)
    
            return res
    
        return wrapper
    
  • 相关阅读:
    Integer中计算int位数的方法
    Spark学习---常见的RDD转和行动操作
    Spark学习---RDD编程
    《教父》中的经典台词以及英文原版
    关于MATSIM中,如何关闭自动加载dtd的问题
    源发行版8需要目标发行版1.8
    关于Mysql中GROUP_CONCAT函数返回值长度的坑
    【转】通过xml处理sql语句时对小于号与大于号的处理转换
    XmlDocument根据节点的属性值获取节点
    【转】使用SevenZipSharp压缩、解压文件
  • 原文地址:https://www.cnblogs.com/whkzm/p/11574961.html
Copyright © 2011-2022 走看看