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]

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

时间: 2024-10-11 23:12:47

python装饰器之函数作用域的相关文章

python装饰器之自己的理解,欢迎更正

pre.cjk { font-family: "Nimbus Mono L", monospace } h2.western { font-family: "Liberation Sans", sans-serif; font-size: 16pt } h2.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 16pt } h2.ctl { font-family: "Fr

Python装饰器函数

装饰器函数 这里定义了一个func函数,打印'我是func函数' def func(): print('我是func函数'); time.sleep(1); 假设,想要在func()函数的基础之上新增的一个功能,计算func函数执行所用的时间 import time;#时间模块,处理时间操作 #开闭原则,对扩展开放,对修改封闭 def func(): print('我是func函数'); time.sleep(1);#休眠一秒 #tools方法就是func方法的装饰器 def tool(): d

Python装饰器之 property()

1. 何为装饰器? 官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. Python中总共包括三个内置装饰器: ① staticmethod ② classmethod ③ property 更加详细的解释,请点击(传送门) 2. 属性函数 property() 浅谈

28、python基础学习-函数作用域

1 #!/usr/bin/env python 2 #__author: hlc 3 #date: 2019/6/1 4 5 # if True : 6 # x = 3 7 # print(x) # 3 8 9 # def f() : 10 # x = 3 11 # print(x) # NameError: name 'x' is not defined 12 """ 13 作用域介绍:python中的作用域分四种情况 14 L:local,局部作用域,即函数中定义的变量:

python函数作用域+装饰器

今天记录的是一个小小的知识点 ->函数作用域+装饰器: LEGB:L>E>G>B L;local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 Coding && Result: 闭包(Closure):内部函数中对enclosing作用域的变量进行引用. 闭包的作用: 1)封装 2)代码复用 函数的实质和属性: 1)函数是一个对象 2)函数执行完成之后内部变量回收 3)函数是对象就有属性 4

Python高阶函数与函数装饰器-day4

上节回顾 高阶函数 闭包函数 函数装饰器 模块导入 一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python 装饰器 二 (装饰带参数的函数)

#!/usr/bin/env python #_*_coding=utf-8_*_ #Author: xieyixue #mail: [email protected] #Created Time: 2015年07月01日 星期三 00时28分03秒 def deco(func): '''定义装饰器接受参数,参数为被装饰的函数 ''' def _deco(*arg, **kwarg): '''定义方法执行被装饰的函数,接受2个参数''' #执行前-->执行 print("before&qu

python+selenium自动化软件测试:装饰器之用例失败后截图

对于用例失败截图,很多小伙伴都希望用例执行失败的时候能自动截图,想法是很好的,实现起来并不是那么容易,这里小编分享下最近研究装饰器,打算用装饰器来实现自动截图. 一.函数作为形参1.函数的参数也可以是另外一个函数,也就是说传的参数不仅可以是常见的字符串.数字等,也可以是一个函数.2.定义aaa为一个加法函数,bbb为减法函数.3.calculate这个函数传三个参数,第一个参数是一个函数,另外两个参数是函数的两个参数. 二.万能装饰器1.由于不知道我们被调用的函数到底有几个参数,这时候就可以写一