day12-闭包函数、装饰器

闭包函数

返回闭包函数内部函数的函数

import requests
def func1(url):  #闭包函数
    def spider():
        responce = requests.get(url)
        print(url)
    return spider  #函数对象
taobao = func1('www.taobao.com')
baidu = func1('www.baidu.com')
taobao()
baidu()
闭包函数:闭包函数把  闭包函数内部的变量 + 闭包函数内部的函数 这两者包裹在一起 然后通过返回值的形式返回出来

装饰器

装饰器的本质是一个给函数增加功能的函数

给函数增加功能的函数,注意:

1、不改变原函数的源代码

2、不改变原函数的调用方式

def func2():
    return 

def func1(func2):  #装饰器模板
    '''装饰器'''
    def wrapper(*args, **kwargs):
        res = func2(*args, **kwargs)
        return res
    return wrapper
func2 = func1(func2)  #func2 = wrapper

装饰器语法糖

在被装饰函数正上方,并且是单独一行写上@装饰器名

user_session = ['ad']
def login():
    print('欢迎带到登陆功能!')
    return '土鳖'

def func1(func2):
    '''装饰器'''
    def wrapper(*args, **kwargs):
        if not user_session:
            res = login()
            return res
        res = func2(*args, **kwargs)
        return res
    return wrapper

@func1  #相当于  shopping = func1(shopping)
def shopping(name):
    print('欢迎来到购物功能')
    print(name)
    return '真有钱'
@func1  #相当于  shopping_car = func1(shopping_car)
def shopping_car():
    print('欢迎来到购物车功能')
    return '肾都没了'

res = shopping('slk')
print(res)
res = shopping_car()
print(res)

三层装饰器

def fun(y = 1):
    def fun1(fun2):
        def wrapper(*args, **kwargs):
            if y == 1:
                res = fun2(*args, **kwargs)
                return res
            return 999
        return wrapper
    return fun1

@fun()  #fun有默认参数也要加括号
def n(x):

    if x > 10:
        return '大于10'
    else:
        return '小于10'


res = n(66)
print(res)

迭代器

#可迭代对象:含有__iter__方法的就叫可迭代对象
#迭代器:含有__iter__和__next__方法的就叫迭代器
#生成器:含有yield关键字的函数就叫生成器

posted on 2019-09-23 22:38  shenblogs  阅读(94)  评论(0)    收藏  举报

导航