装饰器、闭包 语法糖

 1. 函数名的使用, 第一类对象
        1. 函数名可以像变量一样进行赋值操作
        2. 函数可以作为容器(list, tuple, dict)的元素, 保存在容器内
        3. 函数可以作为返回值返回
        4. 函数可以作为参数进行传递

def func1():
     print("我是func1")

def func2():
 print("我是func2")

def func3():
 print("我是func3")

 lst = [func1, func2, func3]
 for e in lst:
     e() # e表示的是lst中的每一个函数. 函数()执行函数. e() 执行每一个函数

def func1():
    print("哈哈")
    def func2():
        print("呵呵")
        def func3():
            print("嘻嘻")
        return func3
    return func2
fn = func1() # 哈哈
print("============>")
fn()    #

def func(fn):
    fn()
def func1():
    print("你好")

func(func1)


2. 闭包
    目的: 让内存永远的记住一个变量
    在内层函数中访问外层函数的局部变量. 叫闭包. 这个时候. 外层的这个局部变量将会常驻内存
        
from urllib.request import urlopen
def func():
    content = urlopen("http://www.xiaohua100.cn/index.html").read()
    def inner():
        print("abc")
    return inner

fn = func()
print(fn.__closure__)   # 检查闭包

3. 装饰器(初识)
    开闭原则(开放封闭原则): 对添加功能开放. 对修改代码封闭.

        语法糖:
            @装饰器名字
        总结:
            def wrapper(fn):
                def inner(*args, **kwargs):
                    '''目标函数之前你要做什么'''
                    ret = fn(*args, **kwargs)
                    '''目标函数之后你要做什么'''
                    return ret
                return inner

            @wrapper
            def target():
                pass
def create_people():
    print("捏泥人, 吹口气")

# 装饰器的雏形
def water(fn):
    def inner():
        print("浇水")
        fn()    # 目标函数被执行
    return inner
create_people = water(create_people)
create_people()

def yue(name, name2, name3, name4, name5):
    print("约一约", name, name2, name3, name4, name5)

def wen_wu(fn):
     def inner(*args, **kwargs):  # 聚合
        print("问问wusir")
        ret = fn(*args, **kwargs)   # 打散
        print("傻逼, 骗我")
        return ret
     return inner

@wen_wu # dajia = wen_wu(dajia)
def dajia(name):
    print("我要干你", name)
    return "伤啊"

# dajia = wen_wu(dajia)
ret = dajia("徐阳")
print(ret)

def zaoren():
    print("捏人")

def water(fn):
    def inner():
        print("浇水")
        fn()
    return inner
zaoren = water(zaoren)
zaoren()

  

猜你喜欢

转载自www.cnblogs.com/duanhaoxin/p/9183146.html
今日推荐