Python 学习日记第七篇 -- 函数相关
2018-03-01 10:05
417 查看
一、装饰器前戏-闭包
简单来说,python中函数的闭包就是在内部函数里对外部作用域(但不是全局作用域)的变量进行引用,这么说,不太好理解,下面的示例帮助理解
上面的示例就是一个闭包,inner是个内部函数,inner里调用外部作用域变量a,a不是全局变量;这样构成了一个闭包。上面这个例子外部变量是给定的,那么我们通过传参来给定外部变量
二、装饰器
装饰器也是函数,它实现的功能是在不改动原有函数代码的条件下,添加新的功能,装饰器的返回值也是函数对象。
先来看一个简单的例子
这是甲写的一个函数,我们要记录执行函数的日志
如上,我们导入了logging模块,在fun1函数中加入日志记录,简单实现了功能,但是如果这样需要记录日志的函数有很多个,我们在一个个的加的话,就会有大量的重复,这种情况下,我们就需要使用装饰器,来抽离出与函数功能无关的重复代码。
下面是一个简单的装饰器:
函数outer就是一个装饰器函数,他把fun1包裹起来,但是fun1 = outer(fun1),这句需要在每一个需要被装饰的函数下重新赋值,这个怎们办呢,可以用装饰器特有的语法来解决
三、带参数的装饰器
上面的例子中,被装饰的函数不带参数,实际上更多情况下函数需要参数,我们来修改一下
上面的例子使被装饰的函数带上了参数,其实,装饰器还有更大的灵活性,装饰器本身也可以带参数传递
简单来说,python中函数的闭包就是在内部函数里对外部作用域(但不是全局作用域)的变量进行引用,这么说,不太好理解,下面的示例帮助理解
def outer(): a = 1 def inner(): # 内部函数inner print(a) # 调用外部环境变量 return inner f = outer() f()
上面的示例就是一个闭包,inner是个内部函数,inner里调用外部作用域变量a,a不是全局变量;这样构成了一个闭包。上面这个例子外部变量是给定的,那么我们通过传参来给定外部变量
def outer(a): def inner(): # 内部函数inner print(a) # 调用传入的外部环境变量 return inner f = outer(10) f()
二、装饰器
装饰器也是函数,它实现的功能是在不改动原有函数代码的条件下,添加新的功能,装饰器的返回值也是函数对象。
先来看一个简单的例子
def fun1(): print("111222333")
这是甲写的一个函数,我们要记录执行函数的日志
def fun1(): print("111222333")
logging.info("Program is running")
如上,我们导入了logging模块,在fun1函数中加入日志记录,简单实现了功能,但是如果这样需要记录日志的函数有很多个,我们在一个个的加的话,就会有大量的重复,这种情况下,我们就需要使用装饰器,来抽离出与函数功能无关的重复代码。
下面是一个简单的装饰器:
import logging
def outer(f):
def inner():
f()
logging.warn("Program is running")
return inner
def fun1(): print("111222333")
fun1 = outer(fun1)
fun1()
函数outer就是一个装饰器函数,他把fun1包裹起来,但是fun1 = outer(fun1),这句需要在每一个需要被装饰的函数下重新赋值,这个怎们办呢,可以用装饰器特有的语法来解决
import logging
def outer(f):
def inner():
f()
logging.warn("Program is running")
return inner
@outer
def fun1(): print("111222333")
@outer
def fun2():
print("444555666")
fun1()
fun2()
三、带参数的装饰器
上面的例子中,被装饰的函数不带参数,实际上更多情况下函数需要参数,我们来修改一下
import logging def outer(f): def inner(*args,**kwargs): f(*args,**kwargs) logging.warn("Program is running") return inner @outer def fun1(*args,**kwargs): print(args) fun1(1,2,3,4,5)
上面的例子使被装饰的函数带上了参数,其实,装饰器还有更大的灵活性,装饰器本身也可以带参数传递
import logging def outer(log_level): def decorator(f): def inner(*args,**kwargs): f(*args,**kwargs) if log_level == "warn": logging.warn("Program is running") return inner return decorator @outer(log_level="warn") def fun1(*args,**kwargs): print(args) fun1(1,2,3,4,5)
相关文章推荐
- Python 学习日记第七篇 -- 函数
- Python学习-反射相关函数
- 【Python学习日记】函数 和 参数
- 【Python学习日记】函数列表 动态创建函数 文件读取 迭代器
- Python 学习日记第四篇 -- 函数,文件
- python cookbook第三版学习笔记九:函数
- python 学习之二次函数求解以及异常处理
- Python学习21:Python中函数的用法,使用函数进行简单的数学运算
- Python基础学习代码之函数和函数式编程
- 零基础入门学习Python(18)--函数:灵活即强大
- 【Python学习日记】迭代器
- Python 学习日记第二篇 -- 列表,元组
- 第七篇 python基础之函数,递归,内置函数
- 学习python的相关网站
- 【Python学习日记】生成器 和 迭代器
- Python 学习笔记 - 3 创建函数
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- python(2)-函数相关
- python re模块学习--正则表达式函数
- Python学习笔记(二):函数