美文网首页
python——迭代器,闭包

python——迭代器,闭包

作者: Jalynn葸 | 来源:发表于2018-05-03 11:28 被阅读13次

    迭代器

    可迭代对象

    可以用for循环的数据类型

    判断是否可迭代

    生成器一定是迭代器,可用next()的也可以迭代。

    >>> from collections import Iterable
    >>> isinstance("abc",Iterable)
    True #是迭代器对象
    >>> isinstance(100,Iterable)
    False
    >>> isinstance((x for x in range(10)),Iterable) #生成器也是迭代器
    True
    
    iter()

    可把列表等,转化为可迭代对象

    闭包

    函数的引用
    def test():
            print("__________")
    b = test
    b()
    运行结果:
    __________
    
    闭包

    在函数里面再定义一个函数,并且这个函数用到了外面函数的变量,那么将这个函数用到的一些变量

    def test(number):
        print("$$$$$$$$$$$$$$$")
        def test_in(number2):
            print("%%%%%%")
            print(number+number2)
        print("***********************")
        return test_in
    
    ret = test(100)
    print("&"*30)
    ret(1)
    ret(100)
    ret(200)
    运行结果:
    $$$$$$$$$$$$$$$
    ***********************
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    %%%%%%
    101
    %%%%%%
    200
    %%%%%%
    300
    
    闭包的应用
    def test(a,b):
        def test_in(x):
            print(a*x + b)
        return test_in
    line1 = test(1,1)
    print(line1(5))
    line2 = test(2,2)#
    print(line2(1))
    运行结果:
    6
    4
    

    装饰器

    def test1():
        print("---1---")
    def test1():
        print("-------2------")
    
    test1()
    运行结果:
    -------2------
    
    def w1(func):
        def inner():
            print("---验证权限---")
        func()
        return inner
    def test1():
        print("-------1------")
    def test2():
        print("------2-------")
    test1 = w1(test1)
    test1()
    运行结果:
    ------1-------
    ---验证权限---
    

    上面等价于下面:

    def w1(func):
        def inner():
            print("---验证权限---")
        func()
        return inner
    @w1
    def test1():
        print("-------1------")
    def test2():
        print("------2-------")
    
    test1()
    
    def w1(func):
        def inner():
            print("---验证权限---")
            if False:
                func()
            else:
                print("没有权限")
        return inner
    #test1 = w1(test1)
    @w1
    def test1():
        print("-------1------")
    def test2():
        print("------2-------")
    test1()
    运行结果:
    ---验证权限---
    没有权限
    

    两个装饰器的执行顺序和运行结果

    def w1(func):
        print("---正在装饰1---")
        def inner():
            print("正在验证权限1")
            func()
        return inner
    
    def w2(func):
        print("---正在装饰2222---")
        def inner():
            print("正在验证权限2")
            func()
        return inner
    @w1
    @w2
    def test1():
        print("-------1------")
    test1()
    运行结果:
    ---正在装饰2222---
    ---正在装饰1---
    正在验证权限1
    正在验证权限2
    -------1------
    
    def func(funcName):
        print("-----func---1-----")
        def func_in():
            print("-----func_in---1-----")
            funcName()
            print("-----func_in---2-----")
        print("-----func---2-----")
        return func_in
    def test():
        print("-------test-----")
    test = func(test)
    test()
    ------------------------------------------------------------
    def func(funcName):
        print("-----func---1-----")
        def func_in():
            print("-----func_in---1-----")
            funcName()
            print("-----func_in---2-----")
        print("-----func---2-----")
        return func_in
    @func
    def test():
        print("-------test-----")
    #test = func(test)
    test()
    result:
    -----func---1-----
    -----func---2-----
    -----func_in---1-----
    -------test-----
    -----func_in---2-----
    
    含有参数的装饰器
    def func(funcName):
        print("-----func---1-----")
        def func_in(a,b):#如果没有a,b则会导致后面调用失败
            print("-----func_in---1-----")
            funcName(a,b)#如果没有a,b则会导致后面调用失败
            print("-----func_in---2-----")
        print("-----func---2-----")
        return func_in
    @func
    def test(a,b):
        print("a = %d, b = %d"%(a,b))
    #test = func(test)
    test(11,22)
    运行结果
    -----func---1-----
    -----func---2-----
    -----func_in---1-----
    a = 11, b = 22
    -----func_in---2-----
    
    不定长参数的装饰器
    def func(funcName):
        print("-----func---1-----")
        def func_in(*args,**kwargs):#如果没有a,b则会导致后面调用失败
            print("-----func_in---1-----")
            funcName(*args,**kwargs)#如果没有a,b则会导致后面调用失败
            print("-----func_in---2-----")
        print("-----func---2-----")
        return func_in
    @func
    def test(a,b,c,d):
        print("a = %d, b = %d"%(a,b))
    
    #test = func(test)
    test(11,22,33,66)
    运行结果:
    -----func---1-----
    -----func---2-----
    -----func_in---1-----
    a = 11, b = 22 c = 33
    -----func_in---2-----
    
    使用装饰器对有返回值的函数进行装饰
    def func(funcName):
        print("-----func---1-----")
        def func_in():
            print("-----func_in---1-----")
            ret = funcName() #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
            print("-----func_in---2-----")
            return ret
        print("-----func---2-----")
        return func_in
    @func
    def test():
        print("-------test-----")
        return "哈哈哈哈哈哈"
    ret = test()
    print(ret)
    运行结果:
    -----func---1-----
    -----func---2-----
    -----func_in---1-----
    -------test-----
    -----func_in---2-----
    哈哈哈哈哈哈
    
    通用的装饰器
    def func(funcName):
    #通用装饰器
        def func_in(*args,**kwargs):
            print("记录日志")
            ret = funcName(*args, **kwargs) #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
            return ret
        return func_in
    @func
    def test():
        print("-------test-----")
        return "哈哈哈哈哈哈"
    @func
    def test2():
        print("------test2--------")
    
    @func
    def test3(a):
        print("----------aaaaa = %d"%a)
    ret = test()
    print(ret)
    a = test2()
    print(a)
    test3(22)
    运行结果:
    记录日志
    -------test-----
    哈哈哈哈哈哈
    记录日志
    ------test2--------
    None
    记录日志
    ----------aaaaa = 22
    
    带有参数的装饰器

    1、先执行func_arg("ahhahah")函数,这个函数return 的结果是func这个函数的引用
    2、@func
    3、使用@func对test进行装饰

    def func_arg(arg):
        def func(funcName):
            def func_in():
                print("-----记录日志------%s"%arg)
                funcName() #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
            return func_in
        return func
    @func_arg("hahahha")
    def test():
        print("-------test-----")
    test()
    运行结果:
    -----记录日志------hahahha
    -------test-----
    

    相关文章

      网友评论

          本文标题:python——迭代器,闭包

          本文链接:https://www.haomeiwen.com/subject/wqdcrftx.html