python函数三 (装饰器)

一。函数名(学名:第一类对象)

函数名本质上就是函数的内存地址。通俗点就是特殊的普通变量

def func():
    print(111)
func()
print(func)
# 结果:
# 111
# <function func at 0x00000150713F6048>

1.可以被引用(即可以赋值给其他变量)

def func():
    print(‘in func‘)
f = func
f()
# 结果:
# in func

2.可以被当作容器类型的元素

def func():
    print(111)
def func2():
    print(222)
def func3():
    print(333)
li = [func(),func2(),func3()]
for i in li:
    i
# 结果: 111      222      333

3.可以当作函数的参数和返回值

def func():
    print(111)
func()
def func2():
    return func
f = func2()
f()
# 结果:         从上到下运行,遇见func()后调用函数打印一个111,
# 111            之后到f = func2(),调用func2()返回给f一个值func,
# 111            最后f()即func()再次调用后打印一个111

第一类对象(first-class object)指

1.可在运行期创建

2.可用作函数参数或返回值

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‘)()
index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()
index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()
index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()
index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()
def index():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read()
    return get

爬网页(闭包用处)

判断是否是闭包函数:__closure__

ef func():
    name = ‘alex‘
    def func2():
        print(name)
    func2()
    print(func2.__closure__)               #含有 cell  就是闭包  None  不是闭包
func()
# 结果:
# alex
# (<cell at 0x0000011AD42A75B8: function object at 0x0000011AD6178A60>, <cell at 0x0000011AD42A75E8: str object at 0x0000011AD6177378>)

name = ‘alex‘
def func():
    def func2():
        print(name)
    func2()
    print(func2.__closure__)                #     None   不是闭包
func()
# 结果:
# alex
# None

def func(x):
    def func2():
        print(x)
    func2()
    print(func2.__closure__)
func(‘alex‘)
# 结果:
# alex
# (<cell at 0x0000029D98CE75B8: str object at 0x0000029D98D77538>,)

三。在外层函数内部执行内部函数

def func():
    def func2():
        print(111)
    func2()
func()

def func():
    def func2():
        print(111)
    return func2
func()()

四。装饰器

比如计算一个函数的执行效率

1.最low的写法

import time
def func():
    print(‘我们都一样‘)
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print(‘------的执行效率%s‘%(end_time-start_time))
# 结果:
# 我们都一样
# ------的执行效率0.10034990310668945

2.进阶写法

import time
def func():
    print(‘我们都一样‘)
def timmer():
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print(‘------的执行效率%s‘%(end_time-start_time))
timmer()
# 虽然也可以运行,但是影响了func()的正常运行,还可以在进阶

3.简单的装饰器

import time
def func():
    print(‘我们都一样‘)
def timmer(f):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print(‘------的执行效率%s‘%(end_time-start_time))
    return inner
func = timmer(func)
func()
# 可以理解为func,timmer,inner通过赋值转换,加参数,最后只剩一个func,
# 这样就可以运行程序,又可以知道执行效率

4.带返回值的装饰器(语法糖的用法)

@timmer           相当于 #func = timmer(func)    即待求的函数名 = 新函数名(待求的函数名)

import time
def timmer(func):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = func(*args,**kwargs)
        end_time = time.time()
        print(‘------执行效率%s‘%(end_time-start_time))
        return ret
    return inner

@timmer
def func():
    return ‘天若有情天亦老,人间正道是沧桑‘
# func()         打印返回值的话不能写这步,否则函数会在调用一次,多打印一次执行效率
print(func())
# 结果:
# ------执行效率0.1002659797668457
# 天若有情天亦老,人间正道是沧桑

5.通用装饰器

def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘执行函数前的操作‘‘‘
        ret = func(*args,**kwargs)
        ‘‘‘执行函数后的操作‘‘‘
        return ret
    return inner

@wrapper
def func():
    print(111)
func()

原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8406462.html

时间: 2024-10-08 04:43:43

python函数三 (装饰器)的相关文章

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

五、python函数、装饰器、内置函数、json及模块

一.递归调用 1.一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999次,超过就会出错2.递归必须有一个明确的结束条件3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少4.递归效率不高,少用递归 eg:def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') r

Python函数之装饰器

装饰器 一.装饰器的意义 比如:以下函数是供我们调用的,但是我们需要在每个函数中都添加同一个功能,该如何做到呢? 对于函数开放封闭原则,我们一般不允许修改.所以我们引入了装饰器: def outer(func): def inner(): print("添加在原函数之前") r = func() #保留原函数的返回值 print('添加在原函数之后') return r #将保留的返回值返回回去 return inner @outer #等价于f1 = outer(f1) def f1

Python函数加工厂-装饰器

引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * r return s 调用s函数:输入4,输出半径为4的圆的面积.a相当于面积的容器 a = s(4) print(a) 2.装饰器是用来装饰函数的函数.其需要输入的原材料为某个函数 以下是装饰器的固定格式: 1 def timer(func): 2 def inner(*args,**kwarg

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

函数(三) 装饰器函数

装饰器定义    装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数值,将新的值赋值原来的函数 2. 装饰器语法 1.函数名可以当作函数的参数 1 import time 2 def timmer(func): 3 #函数名可以当做函数的参数 4 def inner(): 5 start = time.time() 6 func() 7 end = time.time() 8 print(end - start) 9 return inner 10 11 def hahah

Learn Python—函数(装饰器)

装饰器 开放封闭原则 开放:对函数的扩展是开放的 封闭:对函数的修改是封闭的 装饰器的作用 在不更改原函数调用方式的前提下,对原函数添加新功能 # ①引子--为什么要有装饰器 为了在不修改原函数的基础上为函数添加新功能,产生了装饰器 # ②简单装饰器 def deco(f): def wrapper(): """原函数前添加的功能""" f() """原函数后添加的功能""" retur

python函数_装饰器

理解: 装饰器:我在知乎看到这样一个比方(我们的函数好比内裤,作用是遮羞.但在一些特定的环境,内裤明显满足不了我们的需求,冬天它没法为我们防风御寒.所以有了长裤,装饰器就像长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效) 装饰器是对原函数的一种扩展,本质是一个python函数,在原函数不需要做任何代码变动的前提下增加额外功能,在场景:插入日志.性能测试.事务处理.权限校验等应用广泛.遵守封闭开放原则,对源代码修改封闭,对功能外部增加开放. 需求: 在电商平台中,我们可以看到,在不同

Python函数与装饰器入门一

语句简写 三元运算(三目运算) 解决if,else条件的简写. v = A if 条件 else B # 如果条件为真,就把A赋值给V,否则赋值B lambda表达式 简单函数的简写 def func(a1,a2): return a1+a2 #这种简单返回数值的函数形式,可以简化为: func = lambda a1,a2:a1+a2 #这种简便写法叫做lambda表达式,和上面的形式没有区别 两者可以相互结合,实现简写 func = lambda a1,a2: a1 if a1>0 else

python函数下篇装饰器和闭包,外加作用域

装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数的功能. 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被装饰函数的调用方式 装饰器 = 高阶函数+函数嵌套+闭包 高阶函数 1.函数接受的参数是一个函数名 2.函数的返回值是一个函数名 3.只有上述条件满足一个就是高阶函数 def foo(