码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器之函数作用域

时间:2018-07-30 22:39:58      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:理解   函数对象   lob   color   cal   闭包   sum   返回   glob   

1.函数作用域LEGB

L:local函数内部作用域

E:enclosing函数内部与内嵌函数之间

G:global全局作用域

B:build-in内置作用域

passline = 60
def func(val):
    passline = 90
    if val >= passline:
        print(pass)
    else:
        print(failed)
    def in_func()
        print(val)
    in_func()

def Max(val1,val2):
    return max(val1,val2)
func(89)
print(Max(90,100))

 

2.闭包理解与使用

闭包概念:Closure:内部函数中对enclosing作用域的变量进行引用

 

函数实质与属性

1:函数是一个对象

2:函数执行完成后内部变量回收

3:函数属性

4:函数返回值

闭包作用

1:封装

2:代码复用

passline = 60#100
def func(val):
    print(%x%id(val))
    passline = 90
    if val >= passline:
        print(pass)
    else:
        print(failed)
    def in_func():#(val,)
        print(val)
    in_func()
    return in_func


f = func(89)
f()
print(f.__closure__)


29198a8
failed
89
89
(<cell at 0x7fe62bbf42f0: int object at 0x29198a8>,)
[Finished in 0.0s]
def func_150(val):
    passline = 90
    if val >= passline:
        print(%d pass%val)
    else:
        print(failed)
    
def func_100(val):
    passline = 60
    if val >= passline:
        print(%d pass%val)
    else:
        print(failed)



def set_passline(passline):
    def cmp(val):
        if val >= passline:
            print(pass)
        else:
            print(failed)
    return cmp
f_100 = set_passline(60)
f_150 = set_passline(90)
print(type(f_100))
print(f_100.__closure__)

f_100(89)
f_100(59)
f_150(89)
f_150(59)
pass
failed
failed
failed
[Finished in 0.0s]
def my_averge(*arg):
    print(in my_averge)
    return sum(arg)/len(arg)

def my_sum(*arg):
    print(in my_sum)
    return sum(arg)

def dec(func):
    def in_dec(*arg):
        print(in dec arg = , arg)
        if len(arg) == 0:
            return 0
        for val in arg:
            if not isinstance(val, int):
                return 0
        return func(*arg)
    return in_dec

#dec return in_dec -> my_sum
#my_sum = in_dec(*arg)
my_sum = dec(my_sum)
print(my_sum(1, 2, 3, 4, 5))
print(my_sum(1, 2, 3, 4, 5, 6))
print(my_averge(1, 2, 3, 4, 5))
my_averge = dec(my_averge)
print(my_averge(1, 2, 3, 4, 5, 6))
(in dec arg = , (1, 2, 3, 4, 5))
in my_sum
15
(in dec arg = , (1, 2, 3, 4, 5, 6))
0
in my_averge
3
(in dec arg = , (1, 2, 3, 4, 5, 6))
0
[Finished in 0.0s]

3.装饰器

1:装饰器用来装饰函数

2:返回一个函数对象

3:被装饰函数标识符指向返回的函数对象

4:语法糖 @deco

def dec(func):
    print(call dec)
    def in_dec(*arg):#my_sum
        print(in dec arg = , arg)
        if len(arg) == 0:
            return 0
        for val in arg:
            if not isinstance(val, int):
                return 0
        return func(*arg)
    return in_dec

@dec
def my_sum(*arg):#my_sum = in_dec
    print(in my_sum)
    return sum(arg)

print(my_sum(1, 2, 3, 4, 5))

#my_sum = dec(my_sum)

 
#deco(bar) -> in_deco
#bar = in_deco
#bar() in_deco() bar()
def deco(func):
    def in_deco(x,y):
        print(in deco)
        func(x,y)
    print(call deco)
    return in_deco
@deco
def bar(x,y):
    print(in bar,x+y)
print(type(bar))
bar(1,2)
call dec
(in dec arg = , (1, 2, 3, 4, 5))
in my_sum
15
call deco
<type function>
in deco
(in bar, 3)
[Finished in 0.0s]

 

python装饰器之函数作用域

标签:理解   函数对象   lob   color   cal   闭包   sum   返回   glob   

原文地址:https://www.cnblogs.com/zaorunzi/p/9392480.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!