zoukankan      html  css  js  c++  java
  • python装饰器之函数作用域

    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]
  • 相关阅读:
    html实体引用
    nginx配置奇怪问题记录
    20191025-生产事故记录
    abp审计日志功能的关闭
    mysql根据一张表更新另一张表数据
    redis-cli连接redis服务器操作
    错误记录-MySql.Data.MySqlClient.MySqlException (0x80004005): Timeout expired.
    UID,GID,口令
    【搬砖】/etc/passwd 文件结构
    《图形学》实验五:改进的Bresenham算法画直线
  • 原文地址:https://www.cnblogs.com/zhenggaoxiong/p/9392480.html
Copyright © 2011-2022 走看看