zoukankan      html  css  js  c++  java
  • 博客整理day12

    Python day 12

    闭包函数

    ​ 闭(封闭,函数内部函数)包(包含):函数内部函数对外部作用域而非全局作用域的引用.

    两种为函数传参的方法

    1. 使用参数

      def func(x):
          print(x)
      
      func(1)
      
    2. 包给函数

      def func(x):
      #    x = 1
          def f1():
              print(x)
          return f1
      
      f2 = func(2)
      

    装饰器

    无参装饰器

    什么是装饰器

    ​ 装饰器本质上也是函数,装饰器是为被装饰对象添加额外的功能

    要注意的两点:

    • 装饰器本身是可以任意调用的函数对象
    • 被装饰的对象也是可以任意可调用的函数对象

    装饰器的实现必须遵循两个原则

    1. 不修改被装饰对象的源代码
    2. 不修改被装饰对象的调用方式
    

    装饰器的用法

    import time
    
    def index():
        print('welcome to index')
        time.sleep(1)
        
        return 123
    
    def home(name):
    	print(f'welcome {name} to page')
        time.sleep(1)
        
        return name
    
    def time_count(func):
        #func = 最原始的index
        def wrapper(*args,**kwargs):
        	start = time.time()
            res = func(*args,**kwargs)
            end = time.time()
            print(f'{func} time is {start - end}')
            
            return res
       	return wrapper
    
    home = time_count(home)
    home('simple')
    
    index = time_count(index)
    index()
    

    装饰器语法糖

    #在被装饰函数上面单独写上@装饰器名
    @time_count
    # @time_count 就等于 home = time_count(home)
    def home(name):
    	print(f'welcome {name} to page')
        time.sleep(1)
        
        return name
    

    装饰器模板

    def deco(func):
        def wrapper(*args,**kwargs):
            res = func(*args,**kwargs)
            return res
        return wrapper
    

    有参装饰器

    #三层函数
    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:
                    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('admin')
    def index(x, y):
        print('index')
        print('x,y', x, y)
        return 123
    
    res = index(10, 20)
    
  • 相关阅读:
    VM虚拟机Linux和主机数据传输
    Linux CentOS 虚拟机下联网
    SQL 注入漏洞
    BurpSuite 各模块使用
    御剑指纹识别
    C#数组2(多维数组)
    C#数组1
    C#简单的枚举及结构
    ABAP性能1 | LOOP嵌套LOOP代码分析 (转)
    占位符使用(竖式计算)
  • 原文地址:https://www.cnblogs.com/samoo/p/11574641.html
Copyright © 2011-2022 走看看