函数

一.  local()与globals()

a=0        #全局变量
def func():
    a=1        #局部变量
    b=2         #局部变量
    print(locals())       #打印所有局部变量
    print(globals())     #打印所有全局变量
    print(a+b)
func()

         查看一个函数的函数名:

def func():
    print('今天五一')

print(func.__name__)          #func  打印一个函数的函数名

二 .   闭包

    一个内层函数中,引用了外层函数(非全局)的变量,这个内层函数就可以成为闭包。

    在Python中,我们可以使用__closure__来检测函数是否是闭包。

def a():
    a=1
    def b():
        print(a)
    print(b.__closure__)       
    return b()
a()




#1

#(<cell at 0x00000244561C95B8: int object at 0x000000005DB16C10>,)

三.装饰器

def create_prople():
    print('女娲造人')

def a(f):
    def b():
        f()
        print('后羿射日')
    return b
create_people=a(create_prople)
create_people()

   语法糖:(不带返回值)

def a(f):              #装饰函数
    def b():
        f()
        print('后羿射日')
    return b
@a                    #装饰器语法糖( 相当于 #create_ people=a(create_people)  )
def create_prople():    #被装饰函数
    print('女娲造人')

create_prople()

  装饰器返回带返回值的函数

def a(f):               
    def b():
        print('后羿射日')
        r=f()
        return r
    return b
@a                 #create_ people=a(create_people)
def create_prople():
    return('女娲造人')

ret=create_prople()
print(ret)

    装饰器返回带参数的函数

def a(f):
    def b(*args,**kwargs):         #*args 任意多个参数  **kwargs 任意多个关键字参数
        print('后羿射日')
        r=f(*args,**kwargs)
        return r
    return b
@a
def create_prople(x,y):
    return('女娲造人',x,y)
@a
def func(x):
    return('大帅逼',x)
ret=create_prople(1,2)
print(ret)
rep=func(3)
print(rep)

   在一个有装饰器的函数中如何查看函数的函数名?

def a(f):
    def b(*args,**kwargs):         #*args 任意多个参数  **kwargs 任意多个关键字参数
        print('后羿射日')
        r=f(*args,**kwargs)
        return r
    return b
@a         #create_prople=a(create_prople)
def create_prople(x,y):
    return('女娲造人',x,y)

print(create_prople.__name__)         # b  (本应该输出create_people)

from functools import wraps         #导入wraps函数
def a(f):
    @wraps(f)                       #引用wraps
    def b(*args,**kwargs):         #*args 任意多个参数  **kwargs 任意多个关键字参数
        print('后羿射日')
        r=f(*args,**kwargs)
        return r
    return b
@a         #create_prople=a(create_prople)
def create_prople(x,y):
    return('女娲造人',x,y)

print(create_prople.__name__)         # 输出create_people

   装饰器传参数

# 装饰器带参数
FALL=True
def count(c):
    def a(f):
        def b(*args,**kwargs): #*args 任意多个参数  **kwargs 任意多个关键字参数
            if c:
                print('后羿射日')
                r=f(*args,**kwargs)
                return r
            else:
                r = f(*args, **kwargs)
                return r
        return b
    return a
#create_people=count(FALL)
@count(FALL)          # 相当于把@与count(FALL)分开,先执行count(FALL) 在执行@
def create_prople(x,y):
    return('女娲造人',x,y)

@count(FALL)
def zuiri():
    return ('夸父追日')
 

   多个装饰器修饰一个函数(函数先执行离它最近的装饰器)

#先执行@a2   在执行@a1
def
a1(f): def b(): print('aaaa') f() print('1111') return b def a2(f): def b1(): print('bbbb') f() print('2222') return b1 @a1 @a2 def f(): print('大帅逼 ') f() #bbbb #aaaa #大帅逼 #1111 #2222
原文地址:https://www.cnblogs.com/wm0217/p/10798097.html