闭包

我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。

# 闭包
# 外部函数的参数被内部函数引用,内部函数对外部参数的参数进行处理,返回一个结果,外部函数返回内部函数(引用内部函数)
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 函数高级功能的更多相关文章

  1. 12、Python函数高级(命名空间、作用域、装饰器)

    一.名称空间和作用域 1.命名空间(Namespace) 命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空 ...

  2. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  3. python爬虫高级功能

    上一篇文章中我们介绍了爬虫的实现,及爬虫爬取数据的功能,这里会遇到几个问题,比方站点中robots.txt文件,里面有禁止爬取的URL.还有爬虫是否支持代理功能.及有些站点对爬虫的风控措施.设计的爬虫 ...

  4. 五年级--python函数高级运用

    一.装饰器 二.迭代器 三.生成器 四.练习 一.装饰器 1.1 闭包函数用法 # 需求: # 执行一个函数前需要认证是否登录,如果登录则不需再登录. # 只认证一次,后续操作无需认证 # 要求认证使 ...

  5. Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)

    一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e.  substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...

  6. Python函数高级

    函数对象 在面向对象编程中 一切皆对象 函数在python中是第一类对象 函数可以这么用 可以被引用 def func(): print('hello world !') ​ f=func f() 可 ...

  7. Python爬虫之selenium高级功能

    Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...

  8. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  9. 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。

    写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...

随机推荐

  1. NOIP 模拟 $18\; \rm 导弹袭击$

    题解 \(by\;zj\varphi\) 一道凸包题 对于每个导弹,它的飞行时间就是 \(tim=\frac{A}{a_i}+\frac{B}{b_i}\) 我们设 \(x=\frac{1}{a_i} ...

  2. NOIP 模拟 6 大佬

    这道题是一道数学期望,考场上想的是,每相邻 \(k\) 天之间有 \(k-1\) 天是重合的,所以每两端之间肯定是有影响的. 结果啪啪打脸 这道题其实不用考虑每两段之间的影响,因为在上一段的每种排法, ...

  3. [ES6深度解析]12:Classes

    我们将讨论一个老问题:在JavaScript中创建对象的构造函数. 存在的问题 假设我们想要创建最典型的面向对象设计的示例:Circle类.假设我们正在为一个简单的Canvas库编写一个Circle. ...

  4. 高德地图——2D转换3D

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script ty ...

  5. Java - 记录01_开发环境搭建

    时间:2017-07-04 记录:byzqy 一.什么是JDK JDK(Java Development Kit):Java开发工具集,即Java语言的软件开发工具包. SDK(Software De ...

  6. 用CUDA写出比Numpy更快的规约求和函数

    技术背景 在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法,并且展示了GPU加速的实际效果.在可并行化的算法中,比如计算两个矢量的加和,或者是在分子动力学 ...

  7. 正整数a、b、c、d满足ab=cd,则a+b+c+d必定为合数。

    正整数a.b.c.d满足ab=cd,则a+b+c+d必定为合数. 证法一:记s=a+b+c+d.如果四个数全为1,s=4,显然是合数.考虑四个数非全1的情形,由对称性,不妨令a>1. 设p是a的 ...

  8. JVM加载class文件的一些理解

    Java是一种动态解释型语言,类(class)只有被加载到JVM中后才能运行.每当一个Java程序运行时,都会有一个对应的JVM实例,只有当程序运行结束后,这个JVM才会退出.JVM实例通过调用类的m ...

  9. 性能测试工具JMeter 基础(八)—— 测试元件: 逻辑控制器之事物控制器

    事物控制器是将控制器下的所有取样器作为一个事物统计.分析 事物控制器(Transaction Controller) 事务控制器一共有两个选项: Generate parent sample:默认不勾 ...

  10. openswan中DH算法说明

    Author       : Email         : vip_13031075266@163.com Date          : 2021.01.11 Copyright : 未经同意不得 ...