zoukankan      html  css  js  c++  java
  • 函数名,闭包,装饰器

    一:函数名

    1, 函数名的内存地址,print(func)
    2, 函数名可以赋值给其他变量
    3, 函数名可以当做容器类的元素

    def f1():
         print('f1')
    def f2():
         print('f2')
     def f3():
         print('f3')
     l = [f1,f2,f3]
     d = {'f1':f1,'f2':f2,'f3':f3}
    # #调用
    l[0]()
    d['f2']()
    View Code

    4, 函数名可以当做函数的参数.
    5, 函数名可以当做函数的返回值.

    def func2():
        print(222)
    def func3(x):
        # print(x)  # x=func2()
        return x
    f = func2
    f()        #func2()
    ret = func3(func2)  # ret=func2
    ret()              #func2()
    func3(func2)()
    
    def f1():
        print('f1')
    def func1(argv):
        argv()       #f1()
        return argv
    f = func1(f1)
    f()
    View Code

    二:闭包

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

    def func():
        name = 'eva'
        def inner():
            print(name)  #此处打印的name是对上一层函数(外部作用域非全局作用域)变量的引用。
        return inner
    f = func()
    f()
    View Code

    2, 闭包函数的检测:方法__closure__

    def func():
        name = 'eva'
        def inner():
            print(name)
        print(inner.__closure__) #此处打印的有cell元素,故inner是闭包函数。
        return inner
    f = func()
    f()
    
    
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__) #此处打印的是None,说明此内部函数inner不是闭包函数。
        return inner
    f2 = func2()
    f2()
    View Code

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

    from urllib.request import urlopen
    print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read())
    def index(url):
        content = urlopen(url).read()
        def get():
            with open('爬虫','a') as f1:
                f1.write(content.decode('utf-8'))
        return get
    index('http://www.cnblogs.com/jin-xin/articles/8259929.html')()
    View Code

    三:装饰器
    1,什么是装饰器?

    装饰器实际上是一个python函数,它可以让其它函数在不需要任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于切面需求的场景,比如:性能检测,缓存等。

    2,简单的装饰器

    比如给函数加一个性能检测的装饰器,程序如下:

    import time
    def timmer(f):   #f=func
        def inner():
            start_time = time.time()
            time.sleep(0.1)
            f()       #func()
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
        return inner
    @timmer  # func = timmer(func)
    def func():
        print('书法大赛')
    func() # inner()
    View Code

    3,带参数的装饰器,程序如下:

    import time
    def timmer(f):  #f=func
        def inner(*args,**kwargs):
            print(*args,**kwargs)
            start_time = time.time()
            time.sleep(0.1)
            f("张三")   #func("张三")
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
        return inner
    @timmer# func = timmer(func)       func=inner
    def func(a):
        print('%s书法大赛'%a)
    func("aaa")       #inner("aaa")
    View Code

    4,带返回值的装饰器,程序如下:

    import time
    def timmer(f):  #f=func
        def inner(*args,**kwargs):
            start_time = time.time()
            time.sleep(0.1)
            ret = f(*args,**kwargs)  # 222
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
            return ret
        return inner
    @timmer  # func = timmer(func)
    def func(a):
        return 222
    print(func('萌哥'))     #inner("萌哥')
    View Code

    5,通用装饰器,程序如下:

    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前操作'''
            ret = func(*args,**kwargs)
            '''执行函数后的操作'''
            return ret
        return inner
    @wrapper        #func=wrapper(func)
    def func():
        print(66)
    func()
    View Code

        

     

     
  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8413105.html
Copyright © 2011-2022 走看看