博客整理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)
原文地址:https://www.cnblogs.com/samoo/p/11574641.html