• python 之闭包,装饰器,生成器


    一。可迭代的对象(也就是可以用for循环,generator 是生成器的意思)

    怎么判断是否可迭代呢?通俗的方法建立一个for循环

    高大上的方法是:

    In [40]: from collections import Iterable
    In [42]: isinstance("abc",Iterable)     ####是不是Iterable创建的实例,如果是就是True,不是则False
    Out[42]: True
    
    In [44]: isinstance(100,Iterable)
    Out[44]: False

     #########################闭包###########################

    运行结果:

     应用例子:

     #################装饰器#########################

    下图是装饰器原理图:

     

    完整版:

    [root@master gaoji]# cat  02-装饰器.py       
    #!/usr/local/bin/python3
    # -*- coding:utf-8 -*-
    
    
    
    def w(func):
        def inner():
            print('----正在验证权限----')
            func()
        return inner
    
    
    @w    ## @w等价于f1 = w(f1)
    def f1():
        print('----f1----')
    @w    ## @w等价于f1 = w(f1)
    def f2():
        print('---f2---')
    
    #f1 = w(f1)
    f1()
    #f2 = w(f2)
    f2()

    运行结果:

    [root@master gaoji]# python 02-装饰器.py 
    ----正在验证权限----
    ----f1----
    ----正在验证权限----
    ---f2---

     ##############两个装饰器###############

    [root@master gaoji]# vim 03-装饰器.py     
      1 #!/usr/local/bin/python3
      2 # -*- coding:utf-8 -*-
      3 
      3 
      4 def makeItaic(func):
      1 #!/usr/local/bin/python3
      2 # -*- coding:utf-8 -*-
      3 
      4 def makeItaic(func):
      5     def inner():
      6         print('--1--')
      7         return "<b>" +func() + "</b>"
      8     return inner
      9 def makeBolt(func):
     10     def inner():
     11         print('--2--')
     12         return "<i>" +func() + "</i>"
     13     return inner
     14 
     15 @makeItaic      #test1 = makeItaic(test1)
     16 @makeBolt       #test1 = makeBolt(test1)   返回值“<i>hello-world-1</i>”
     17 def test1():
     18     print('--3--')
     19     return 'hello-world-1'
     20 
     21 
     22 
     23 print(test1())

    结果:

    [root@master gaoji]# python3 03-装饰器.py 
    --1--
    --2--
    --3--
    <b><i>hello-world-1</i></b>

    流程图:

    很重要的一点:装饰器在装饰的函数调用前,就已经装饰好了

    装饰是倒着装饰,调用确实从上往下的

    ##############例子代码##############

    1.使用装饰器对无参数的函数进行装饰

    def func(functionName):
        print("---func---1---")
        def func_in():
            print("---func_in---1---")
            functionName()
            print("---func_in---2---")
    
        print("---func---2---")
        return func_in
    
    @func
    def test():
        print("----test----")
    
    
    #test = func(test)
    
    test()

    2.使用装饰器对有参数的函数进行装饰

    def func(functionName):
        print("---func---1---")
        def func_in(a, b):#如果a,b 没有定义,那么会导致16行的调用失败
            print("---func_in---1---")
            functionName(a, b)#如果没有把a,b当做实参进行传递,那么会导致调用12行的函数失败
            print("---func_in---2---")
    
        print("---func---2---")
        return func_in
    
    @func
    def test(a, b):
        print("----test-a=%d,b=%d---"%(a,b))
    
    
    test(11,22)

    3.使用装饰器对有不定长参数的函数进行装饰

    def func(functionName):
        print("---func---1---")
        def func_in(*args, **kwargs):#采用不定长参数的方式满足所有函数需要参数以及不需要参数的情况
            print("---func_in---1---")
            functionName(*args, **kwargs)#这个地方,需要写*以及**,如果不写的话,那么args是元祖,而kwargs是字典
            print("---func_in---2---")
    
        print("---func---2---")
        return func_in
    
    @func
    def test(a, b, c):
        print("----test-a=%d,b=%d,c=%d---"%(a,b,c))
    
    @func
    def test2(a, b, c, d):
        print("----test-a=%d,b=%d,c=%d,d=%d---"%(a,b,c,d))
    
    test(11,22,33)
    
    test2(44,55,66,77)

    4.使用装饰器对有返回值的函数进行装饰

    def func(functionName):
        print("---func---1---")
        def func_in():
            print("---func_in---1---")
            ret = functionName() #保存 返回来的haha
            print("---func_in---2---")
            return ret #把haha返回岛17行处的调用
    
        print("---func---2---")
        return func_in
    
    @func
    def test():
        print("----test----")
        return "haha"
    
    ret = test()
    print("test return value is %s"%ret)

    5.通用装饰器

    def func(functionName):
        def func_in(*args, **kwargs):
            print("-----记录日志-----")
            ret = functionName(*args, **kwargs)
            return ret
    
        return func_in
    
    @func
    def test():
        print("----test----")
        return "haha"
    
    @func
    def test2():
        print("----test2---")
    
    @func
    def test3(a):
        print("-----test3--a=%d--"%a)
    
    ret = test()
    print("test return value is %s"%ret)
    
    a = test2()
    print("test2 return value is %s"%a)
    
    
    test3(11)

    6.带有参数的装饰器

    def func_arg(arg):
        def func(functionName):
            def func_in():
                print("---记录日志-arg=%s--"%arg)
                if arg=="heihei":
                    functionName()
                    functionName()
                else:
                    functionName()
            return func_in
        return func
    
    #1. 先执行func_arg("heihei")函数,这个函数return 的结果是func这个函数的引用
    #2. @func
    #3. 使用@func对test进行装饰
    @func_arg("heihei")
    def test():
        print("--test--")
    
    #带有参数的装饰器,能够起到在运行时,有不同的功能
    @func_arg("haha")
    def test2():
        print("--test2--")
    
    test()
    test2()
  • 相关阅读:
    BZOJ 4358 坑 莫队+线段树 死T
    BZOJ 4321 DP
    两倍问题
    通宵教室
    [编程题]字符串模式匹配
    [编程题]表达式求值
    [编程题]美团骑手包裹区间分组
    1153 Decode Registration Card of PAT
    1154 Vertex Coloring
    1155 Heap Paths
  • 原文地址:https://www.cnblogs.com/shanhua-fu/p/7693910.html
Copyright © 2020-2023  润新知