函数名,闭包,装饰器

一:函数名

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

    

 

 
原文地址:https://www.cnblogs.com/leiwei123/p/8413105.html