python学习【第五篇】python函数 (二)
一、装饰器
装饰器:本质就是函数,功能是为其它函数添加附加功能
装饰器的原则:
- 不修改被修饰函数的源代码
- 不修改被修饰函数的调用方式
装饰器的知识储备:
装饰器 = 高阶函数 + 函数嵌套 + 闭包
二、高阶函数
高阶函数的定义:
- 函数的接收参数是一个函数名
- 函数的返回值是一个函数名
- 满足上述条件任意一个都可以是高阶函数
import time
def fun1():
time.sleep(0.5)
print("hello")
def computing_run_time(fun):
"""
计算函数运行时间
:param fun:
:return:
"""
start_time = time.time()
fun()
end_time = time.time()
print("运行时间%s" % (end_time - start_time))
computing_run_time(fun1)
"""
优点:在不修改函数源代码的前提下,给函数添加了额外的功能
缺点:改变了调用方式
"""
函数的接收参数是函数名
import time
def fun1():
time.sleep(0.5)
print("hello")
def computing_run_time(fun):
"""
计算函数运行时间
:param fun:
:return:
"""
fun()
return fun
fun1 = computing_run_time(fun1)
fun1()
"""
优点:没有改变函数的调用方式
缺点:不能为函数添加新的功能
"""
函数的返回值是函数名
注:仅仅是高阶函数不能满足装饰器的需求
三、函数嵌套和闭包
"""
闭包:首先必须是内部定义的函数,该函数包含对外部作用域而不是全局作用域名字的引用
定义:内部函数的代码包含对外部函数的代码的引用,但一定不是对全局作用域的引用
"""
def fun1():
print("fun1")
name = 1
def fun2():
print("fun2")
print(name)
def fun3():
print("fun3")
print(name)
fun3()
fun2()
fun1()
四、装饰器示例
无参装饰器
def outer(fun):
def wrapper():
fun()
return wrapper
加上参数
def outer(fun):
def wrapper(*args, **kwargs):
fun(*args, **kwargs)
return wrapper
简单装饰器
import time
def outer(func):
"""
计算程序的运行时间
:param func:
:return:
"""
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
stop_time = time.time()
print("函数运行的时间为:%s" % (stop_time-start_time))
return result
return wrapper
@outer # 语法糖 等价于 : cal = outer(cal) 把wrapper函数的函数地址赋值给cal
def cal(list1):
result = 0
for i in list1:
time.sleep(0.1)
result += i
return result
res = cal(range(20))
print(res)
注:
函数cal的执行流程,先执行装饰器的outer函数,outer将函数的返回值赋值给变量cal,所以调用cal() 等价于 cal = outer(cal), cal() 等价于这两步
多层装饰器
装饰器中含有函数参数
def before(name):
print("before:%s" % name)
return "before"
def after(name):
print("after:%s" % name)
return "after"
# 外层的参数只是为了将值传递到里层
def outer(before_func, after_func):
def middle(main_func):
def wrapper(*args, **kwargs):
before_result = before_func(*args, **kwargs)
print("before_result:%s" % before_result)
main_result = main_func(*args, **kwargs)
print("main_result: %s" % main_result)
after_result = after_func(*args, **kwargs)
print("after_result: %s" % after_result)
return main_result
return wrapper
return middle
@outer(before, after)
def index(name):
print("index")
return name
result = index("aaa")
print(result)
python学习【第五篇】python函数 (二)的更多相关文章
- Python学习【第九篇】函数
函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...
- Python 学习 第八篇:函数2(参数、lamdba和函数属性)
函数的参数是参数暴露给外部的接口,向函数传递参数,可以控制函数的流程,函数可以0个.1个或多个参数:在Python中向函数传参,使用的是赋值方式. 一,传递参数 参数是通过赋值来传递的,传递参数的特点 ...
- Python 学习 第七篇:函数1(定义、调用和变量的作用域)
函数是把一些语句集合在一起的程序结构,用于把复杂的流程细分成不同的组件,能够减少代码的冗余.代码的复用和修改代码的代价. 函数可以0个.1个或多个参数,向函数传递参数,可以控制函数的流程.函数还可以返 ...
- Python 学习 第五篇:语句和语法
Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...
- Python学习第五篇——如何访问字典
# the example_1 aim to tell how to use dctionary,and how to access list or dictionary infos={"f ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...
- 第五篇python进阶之深浅拷贝
目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...
- 第五篇.python进阶
目录 第五篇.python进阶 1. 异常处理 2. 数字类型内置方法 2.定义: 3.常用操作+内置方法: 4.存一个值or多个值: 5.有序or无序: 6.可变和不可变 1.用途: 2.定义: 3 ...
- Python 学习 第十篇 CMDB用户权限管理
Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...
随机推荐
- django迁移model到别的app中
举例: 移动 users.AccessKey 到 authentication.AccessKey中 1. 移动models到新的app中 $ mv users/models/access_key.p ...
- Linux信号(signal) 机制分析(转)
[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
- gdb调试多进程和多线程命令(转)
1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...
- Oracle 官网 jdk1.6 下载地址
在oracle官方网站下载地址 http://www.oracle.com/technetwork/java/archive-139210.html http://www.oracle.com/tec ...
- C语言-编译
编译的时候只是需要知道函数原型(即只需要 xxx.h 文件即可), 不需要知道函数定义, 在链接阶段可以把 xxx.c 生成的 xxx.o 链接进去, 以知道函数定义 编译时,编译器需要的是语法的正确 ...
- 通过Spring使用远程访问和web服务
http://docs.huihoo.com/spring/zh-cn/remoting.html Spring2 提供的remote包学习笔记
- 带圈圈的数字1~50,求50以上,不要word的
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿
- 傻瓜方法求集合的全部子集问题(java版)
给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...
- 用户输入URL后发生了什么,以及优化问题
用户角度:1.打开浏览器2.输入URL3.按下回车4.浏览器呈现画面 当用户输入页面地址后,浏览器获得用户希望访问的地址,便向该站点服务器发起一系列的请求,这些请求不光包括对页面的请求,还包括对页面中 ...
- Backup and Recovery Basics1
一.Backup and Recovery Overview 1.Backup and Recovery Overview 1.1 What is Backup and Recovery? 一般,备份 ...