zoukankan      html  css  js  c++  java
  • 装饰器、闭包 语法糖

     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()
    

      

  • 相关阅读:
    概率算法_二项分布和泊松分布
    数据库_存储过程简介(oracle版)
    机器学习算法_knn(福利)
    统计算法_概率基础
    统计算法_数值/线性关系度量
    Python总结
    Python 冒泡排序法分析
    Oracle练习详解
    LINUX基础了解
    LINUX下OA搭建
  • 原文地址:https://www.cnblogs.com/duanhaoxin/p/9183146.html
Copyright © 2011-2022 走看看