函数(三) 装饰器函数

装饰器定义

     装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数值,将新的值赋值原来的函数

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 hahaha():
12     time.sleep(0.1)
13     print(‘aaaa‘)
14
15 hahaha()
16
17 输出结果
18 aaaa

2、假如我们不能修改这个函数的调用方式,也不能修改原代码,该怎么做到呢

 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 hahaha():
12     time.sleep(0.1)
13     print(‘aaaa‘)
14
15 hahaha = timmer(hahaha)       #timmer函数的地址给了hahaha  然后在进行调用
16 hahaha()
17
18 aaaa
19 0.10033607482910156

# hahaha = timmer(hahaha) #timmer函数的地址给了hahaha
# hahaha() #实际上执行的是timmer

3、函数传参

 1 def timmer(func):  #---> hahaha
 2     def inner(*args,**kwargs):         #动态参数接收从kkk传来的1,2并进行压缩成元组
 3         #args == (1,2)  kwargs == {}
 4         #*args == 1,2   **kwargs == a =1,b = 2
 5         func(*args,**kwargs)  # ---》kkk   #func把值传给kkk并还原,实际上就是解压之前动态参数接收的压缩的值,返回给kkk函数
 6     return inner
 7
 8
 9 def kkk(a,b):
10     print(a)
11
12 kkk = timmer(kkk)     #timmer函数里的func是kkk函数,然后返回inner函数给kkk
13 kkk(1,2)      #kkk函数调用并传参给inner(动态参数*args),
14
15 1

参数
#实参:调用函数的时候传入的参数
#形参
#位置参数:必须传值

1 def aaa(a,b):
2 print(a,b)
3 aaa(1,2)

#默认参数:可以不传

1 def bbb(x=10):      #默认参数 没上传参数的话用默认的参数,上传的话会用上传的参数。
2 print(x)
3 bbb() #x = 10
4 bbb(20) #x = 20

#动态参数

1 def ccc(*args):#1,2,3,4,5     #*args  会将ccc上传的参数以元组的方式存放
2 print(args)
3
4 ccc(1,2,3,4,5)#按位置传参数

解压传参

1 def ccc(*args):#1,2,3,4,5
2     print(args)
3
4 #ccc(1,2,3,4,5)#按位置传参数
5
6 t = (1,2,3,4,5)
7 ccc(t) # ((1, 2, 3, 4, 5),)
8 ccc(*t)  #(1, 2, 3, 4, 5)   #解压

按关键字传参

1 def ddd(**kwargs):   #kwargs接收传参然后以字典的方式存放
2     print(kwargs)
3
4 ddd(k = ‘a‘,j = ‘b‘)#按关键字传参数

打散赋值

 1 def ccc(*args):
 2     print(‘ccc:‘,args)  #(1,2,3,4,5)
 3     def inner(a,b,c,d,e):
 4         print(‘inner‘,a,b,c,d,e)
 5     inner(*args)  #*(1,2,3,4,5)  打散
 6
 7 def inner(a,b,c,d,e):     #接收解压的参数然后一一赋值
 8     print(‘inner‘,a,b,c,d,e)
 9 ccc(1,2,3,4,5)
10 inner(1,2,3,4,5)

4、语法糖

 1 def timmer(func):  #---> jjj
 2     def inner(*args,**kwargs):
 3         ret = func(*args,**kwargs)  # --->ret = jjj()
 4         print(ret)
 5         return ret
 6     return inner
 7
 8 @timmer  #jjj = timmer(jjj)  语法糖
 9 def jjj():
10     return 123
11
12
13 jjj()     #ret = jjj()
14
15
16 输出结果
17 123

5、装饰器函数

#装饰器的本质 :闭包函数
#功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
def timmer(func):
def inner(*args,**kwargs):
‘‘‘添加函数调用之前的扩展代码‘‘‘
ret = func(*args,**kwargs)
‘‘‘添加函数调用之后的扩展代码‘‘‘
return ret
return inner
#设计模式 原则 开放封闭原则
#对扩展是开放的
#对修改是封闭的

6、装饰器装饰两个函数

 1 def wrapper(func):#装饰
 2     def inner(*args,**kwargs):
 3
 4         ret = func(*args,**kwargs)
 5
 6         return ret
 7     return inner
 8
 9 @wrapper        #aaa = wrapper(aaa)
10 def aaa():
11     print(‘asghksdlhf‘)
12
13 @wrapper        #bbb = wrapper(bbb)
14 def bbb():
15     print(‘asghksdlhf‘)
16
17
18 aaa()
19 bbb()
20
21
22 #输出结果:
23 #asghksdlhf
24 #asghksdlhf
时间: 2024-10-01 07:03:17

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

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

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

python学习笔记4:高阶函数,装饰器,生成器,迭代器

一.高级函数1.把一个函数名当作实参传给另一个函数2.返回值包含函数名>>> def bar():... print ("in the bar")... >>> def foo(func):... res=func()... return res... >>> foo(bar)in the bar 二.嵌套函数在函数中定义另一个函数 三.装饰器装饰器本质上是函数,作用是装饰其他函数,就是为其他函数添加附加功能.原则1:不能修改被装饰

自己编写一个装饰器中的装饰器函数

看了"大道曙光"的<探究functools模块wraps装饰器的用途>的文章.基本上弄清了wraps的工作原理,为了检验一下自己理解的程度,于是动手写一个类似的 wraps函数,请大家指教. #!/usr/bin/env python # -*- coding: utf-8 -*- #filename : mywrapper.py #date: 2017-06-02 ''' wrapper function by my code.''' import functools i

02 - 函数与装饰器

函数与装饰器 函数 概念 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数的返回值 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式.不带参数值的return语句返回None. # return a,b,c等价于 return (a,b,c) def test(): a,b = 10,20 return a,b print(test()) 不定长参数传递 加了星号(*)的变量args会存放所有未命名的变量参数,args为元组; 而加**的变量kw

python 培训第三章 ,函数,装饰器,模块,内置函数之一函数

目录: 函数示例装饰器模块内置函数一.函数示例: 1.定义函数: def fun(args): '描述信息' 函数体 return 返回值 定义函数的三种形式: 无参函数def foo():print('in the foo') foo() 有参函数: def bar(x,y): print('in the bar') bar(1,2) 空函数: def func(): pass 空函数的应用示例: def put():pass def get():pass def cd():pass def

Python函数之装饰器

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

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

函数3—装饰器

1 为什么要用装饰器 开放封闭原则 :游戏上线后,尽量避免更改源代码和调用方式,但是出于需求必须为代码增加扩展性 2 什么是装饰器: 本质是一种函数 ,没有改动函数源代码和调用方式的情况下,给函数增加一种新的功能 利用了闭包的原理,闭包的作用就是可以在外部调用这个内部闭包函数,不用关心作用域的问题 3 装饰器的作用原理:将被装饰函数放入装饰器函数内部的一个闭包函数内,再在外部调用闭包函数 函数嵌套------->闭包---------->装饰器 #无参装饰器(被装饰函数无参)import ti

五、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