python 函数高级功能
闭包
我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
# 闭包
# 外部函数的参数被内部函数引用,内部函数对外部参数的参数进行处理,返回一个结果,外部函数返回内部函数(引用内部函数)
def a_func(n):
def b_func(m):
return n*m
return b_func # 注意是没有(),不是b_func()
# 外函数返回内函数的引用,这里的引用指的是内函数b_func在内存中的起始地址
a=a_func(3)
print(a(4))
print(a(10))
装饰器
装饰函数,增加被装饰函数的功能
装饰器不带参数,被装饰参数不带参数
import time
# 定义装饰函数
def timer(func):
# 统计执行时间
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print('运行的时间 %s' %(stop_time-start_time))
return wrapper
# 定义被装饰函数
@timer
def i_can_sleep():
time.sleep(3)
# 调用i_can-sleep方法
i_can_sleep()
# 执行顺序,首先将i_can_sleep()传给timer,也就是timer(i_can_sleep());
# 然后执行wrapper()函数
# 装饰器与闭包的不同点,装饰函数传入的参数是一个函数,闭包传入的参数
被装饰函数带参数
# 被装饰函数带参数,也就是装饰函数的外部函数带参数
# 发现需要先定义装饰函数
def tips(func):
def nei(a,b): # 装饰函数的内部函数需要接收被装饰函数的参数
print('start')
func(a,b)
print('end')
return nei
@tips
def sum(a,b):
print(a+b)
a=sum(8,9)
装饰器带参数
ef new_tips(args):
def tips(func):
def nei(a,b): # 装饰函数的内部函数需要接收被装饰函数的参数
print('start to %s' % args)
func(a,b)
print('end to %s' % args)
return nei
return tips
@new_tips('add')
def sum(a,b):
print(a+b)
a=sum(8,9)
还可以获取被装饰函数的一些信息
def new_tips(args):
def tips(func):
def nei(a,b): # 装饰函数内部函数需要接收被装饰函数的参数
print('func %s start to %s' % (func.__name__,args))
func(a,b)
print('func %s end to %s' % (func.__name__,args))
return nei
return tips
@new_tips('add_module')
def sum(a,b):
print(a+b)
a=sum(8,9)
@new_tips('sub_module')
def sub(a,b):
print(a-b)
全部代码
# 装饰器
import time
# 定义装饰函数
# 统计执行时间
def timer(func):
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print('运行的时间 %s' %(stop_time-start_time))
return wrapper
#
# # 定义被装饰函数
@timer
def i_can_sleep():
time.sleep(3)
# 调用i_can-sleep方法
i_can_sleep()
# 执行顺序,首先将i_can_sleep()传给timer,也就是timer(i_can_sleep());
# 然后执行wrapper()函数
# 装饰器与闭包的不同点,装饰函数传入的参数是一个函数,闭包传入的参数是一个变量
print('----------------------------------------------被装饰参数带参数------------------------------------------------')
# 被装饰函数带参数,也就是装饰函数的外部函数带参数
# 发现需要先定义装饰函数
def tips(func):
def nei(a,b): # 装饰函数内部函数需要接收被装饰函数的参数
print('start')
func(a,b)
print('end')
return nei
@tips
def sum(a,b):
print(a+b)
a=sum(8,9)
print('----------------------------------------------装饰器带参数------------------------------------------------')
# 装饰器带参数
def new_tips(args):
def tips(func):
def nei(a,b): # 装饰函数内部函数需要接收被装饰函数的参数
print('start to %s' % args)
func(a,b)
print('end to %s' % args)
return nei
return tips
@new_tips('add_module')
def sum(a,b):
print(a+b)
a=sum(8,9)
@new_tips('sub_module')
def sub(a,b):
print(a-b)
b=sub(102,98)
print('--------------------------------------------获取被装饰函数的一些信息--------------------------------------------------')
# 还可以获取被装饰函数的一些信息
def new_tips(args):
def tips(func):
def nei(a,b): # 装饰函数内部函数需要接收被装饰函数的参数
print('func %s start to %s' % (func.__name__,args))
func(a,b)
print('func %s end to %s' % (func.__name__,args))
return nei
return tips
@new_tips('add_module')
def sum(a,b):
print(a+b)
a=sum(8,9)
@new_tips('sub_module')
def sub(a,b):
print(a-b)
b=sub(10,7)
执行结果:
运行的时间 3.0007877349853516
----------------------------------------------被装饰参数带参数------------------------------------------------
start
17
end
----------------------------------------------装饰器带参数------------------------------------------------
start to add_module
17
end to add_module
start to sub_module
4
end to sub_module
--------------------------------------------获取被装饰函数的一些信息--------------------------------------------------
func sum start to add_module
17
func sum end to add_module
func sub start to sub_module
3
func sub end to sub_module
Process finished with exit code 0
python 函数高级功能的更多相关文章
- 12、Python函数高级(命名空间、作用域、装饰器)
一.名称空间和作用域 1.命名空间(Namespace) 命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空 ...
- python函数高级特性
掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...
- python爬虫高级功能
上一篇文章中我们介绍了爬虫的实现,及爬虫爬取数据的功能,这里会遇到几个问题,比方站点中robots.txt文件,里面有禁止爬取的URL.还有爬虫是否支持代理功能.及有些站点对爬虫的风控措施.设计的爬虫 ...
- 五年级--python函数高级运用
一.装饰器 二.迭代器 三.生成器 四.练习 一.装饰器 1.1 闭包函数用法 # 需求: # 执行一个函数前需要认证是否登录,如果登录则不需再登录. # 只认证一次,后续操作无需认证 # 要求认证使 ...
- Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...
- Python函数高级
函数对象 在面向对象编程中 一切皆对象 函数在python中是第一类对象 函数可以这么用 可以被引用 def func(): print('hello world !') f=func f() 可 ...
- Python爬虫之selenium高级功能
Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...
- Python函数装饰器高级用法
在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...
- 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。
写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...
随机推荐
- 解决Git中fatal: refusing to merge unrelated histories
原文链接: https://blog.csdn.net/wd2014610/article/details/80854807 Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题 ...
- mongodb+docker数据卷实现数据持久化
# 拉取镜像docker pull mongo:4.0.22# 启动容器,挂载本地目录 docker run -itd --name mongo -p 27017:27017 -v $PWD/mong ...
- Java静态内部类——重点是精妙的demo
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/cd18333612683/article/details/79129503什么是内部类大部分时候,类 ...
- 关于mysql的备份和恢复
备份:在登录之前(cmd中)mysqldump -u root -p [数据库名称] > c:/back.sql备份的话,肯定是DBA才能做,所以只能用root:恢复mysql -u root ...
- 打印菱形图案(PTA)
打印菱形图案 本题要求编写程序,打印一个高度为n的.由"*"组成的正菱形图案. 标题输入格式 输入在一行中给出一个正的奇数n. 输出格式 输出由n行星号"*"组 ...
- 利用元数据提高 SQLFlow 血缘分析结果准确率
利用元数据提高 SQLFlow 血缘分析结果准确率 一.SQLFlow--数据治理专家的一把利器 数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念.数据治 ...
- 4种Golang并发操作中常见的死锁情形
摘要:什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你.我俩都这么想,这事就解决不了了. 本文分享自华为云社区< ...
- MySQL列举常见的关系型数据库和非关系型都有那些?
关系型数据库: Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQL 非关系型数据库: NoSql.Cloudant.MongoDb.redis ...
- 你的 SQL 还在回表查询吗?快给它安排覆盖索引
什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键.聚集索引.辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引的叶子节点存储的是每 ...
- 性能测试工具JMeter 基础(三)—— 创建测试计划
如何创建一个完整的测试计划? 安装好JMeter后,通过根目录下的bin目录中的jmeter.bat启动JMeter 添加线程组(Thread Group) 在 Test Plan 鼠标右键 Add- ...