zoukankan      html  css  js  c++  java
  • python之路——函数(进阶)

    函数名(第一对象)

    1. 函数的内存地址,print(func)

    def func():
        print(222)
    print(func)

    2. 函数名可以赋值给其他变量

    def func():
        print(222)
    f = func
    print(f())

    3. 函数名可以当作容器类的元素

    def func1():
        print(111)
    def func2():
        print(222)
    def func3():
        print(333)
    li = [func1,func2,func3]
    for i in li:
        i()

    4. 函数名可以当作函数的参数

    def func1():
        print(111)
    def func2(x):
        x()
    func2(func1)

    5. 函数名可以当作函数的返回值

    def f1():
        print('f1')
    
    def func1(argv):
        argv()
        return argv
    
    f = func1(f1)
    f()

    闭包:(cell)

    1. 内层函数,对外层函数(非全局)的变量的引用,叫闭包

    def wrapper():
        name = 'alex'
        def inner():
            print(name)
        inner()
        print(inner.__closure__)  #检查是不是闭包
        return inner
    
    f = wrapper
    f()

    #输出的__closure__有cell元素 :是闭包函数
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f2 = func2()
    f2()

    #输出的__closure__为None :不是闭包函数

    2. 在外层函数的内部执行 inner()

    def wrapper():
        name = 'alex'
        def inner():
            print(name)
        inner()
        print(inner.__closure__)  #检查是不是闭包
        return inner
    
    f = wrapper
    f()

    闭包的好处:如果说内存函数是个闭包,python内部有一个机制,遇到闭包,它会在内存中开启一个内存空间,不会随着函数的结束而关闭。

    装饰器:

    1,  简单的装饰器

    import  time
    def func1():
        print('in func1')
    
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    func1 = timer(func1)
    func1()
    View Code

    2,  带参数的装饰器

    import time
    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    
    @timer
    def func1(a):
        print(a)
    func1(1)
    View Code

    3,  带返回值的装饰器

    4,  通用的的装饰器

    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
    
    @timer   #==> func1 = timer(func1)
    def func1(a,b):
        print('in func1')
    
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
    
    func1('aaaaaa','bbbbbb')
    print(func2('aaaaaa'))
    
    装饰器---hold住所有参数的装饰器
    View Code

    5,  语法糖 @

    import time
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    @timer   #==> func1 = timer(func1)
    def func1():
        print('in func1')
    
    
    func1()
    
    装饰器---语法糖

    开放封闭原则:

    1.对扩展是开放的,为什么要对扩展开放呢?

        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

    2.对修改是封闭的为什么要对修改封闭呢?

        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了这个开放封闭原则。

    装饰器的主要功能和固定结构

    #固定格式
    
    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前的操作'''
            ret = func(*args,**kwargs)
            '''执行函数后的操作'''
            return ret
        return inner
    def func():
        print(666)

    多个装饰器装饰一个函数

    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print('''执行函数前要做的''')
                ret = func(*args,**kwargs)
                if flag:
                        print('''执行函数后要做的''')
                return ret
            return inner
        return timer
    
    @outer(False)
    def func():
        print(111)
    func()
    View Code
  • 相关阅读:
    CodeForces
    网络流
    poj 2185
    树的分治学习
    数位DP
    URAL 1969. Hong Kong Tram
    hdu 4759 Poker Shuffle
    hdu3712 Detector Placement
    分块思想
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/lzg-lzg/p/8406719.html
Copyright © 2011-2022 走看看