闭包函数与装饰器

闭包函数

函数的传参方式(闭包函数,把变量和函数一起包起来,下次要用直接调用)

def outter(x):
	def inner():
		print(x)
	return inner

爬虫运用闭包函数

方法一:函数
import request
def get_res(url):
	res = request.get(url)
	print(res.text)
get_res('https://www.baidu.com/')
get_res('https://www.taobao.com')
def func(url):
     def get_res():
         res = requests.get(url)
         print(res.text)
     return get_res

 baidu_spider = func('https://www.baidu.com')  # baidu_spider=get_res()
 baidu_spider()
 baidu_spider()

闭包函数: 传参的另外一种方式, 参数+函数包在一起返回出去

装饰器

import time

def index():
    print('hello index')
    time.sleep(1)


# 检测index的运行的时间,但是不能改变index的调用方式,以及index的源码

# 写一个装饰器

def deco(func):  # func = 真正的index
    """装饰器"""
    def f1():
        start = time.time()
        func()  # 真正的index()
        end = time.time()
        print(end-start)
    return f1

index = deco(index)  # index = f1
index()  ## 这个时候的index就是deco的参数了,真正的index在deco函数里面会调用

三层装饰器(了解)

# 三层装饰器: 给双层装饰器加参数


# 判断账号密码来自于哪个地方
def auth(engine):
    def login(func):
        def inner(*args, **kwargs):
            # 登录功能
            if engine == 'file':
                username = input('usrename:')
                pwd = input('pwd:')
                if username == 'nick' and pwd == '123':
                    print('登录成功')
                    res = func(*args, **kwargs)  # shopping()
                    return res
                else:
                    print('登录失败')

            elif engine == 'db':
                print('账号密码来自于数据库,非法请求')

        return inner
    return login

@auth('file')
def shopping():
    print('shopping')


# login = auth('db')  # login = login
# shopping = login(shopping)  # shopping = inner
shopping() # inner()
原文地址:https://www.cnblogs.com/oxtime/p/11341175.html