闭包

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

# 闭包
# 外部函数的参数被内部函数引用,内部函数对外部参数的参数进行处理,返回一个结果,外部函数返回内部函数(引用内部函数)
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. noip34

    因为改不动T3而来水博客的屑 昨晚没睡好,大致看了一遍题面后,选择了死亡231,然后就死的很惨. T1 一开始大致看题面的时候,就略了一眼,加上没读全题,啥思路也没有,最后四十分钟滚回来看了看,发现就 ...

  2. NOIP 模拟 $38\; \rm c$

    题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过 ...

  3. 两款轻量级服务器 Http-server && SimpleHTTPServer

    Http-server # 全局安装 npm install http-server -g # 启动服务 # 禁用缓存 http-server -c-1 # 在当前目录下的www启动服务器 http- ...

  4. SpringBoot监听redis订阅监听和发布订阅

    前言 我们可以在redis中发布一条订阅到通道中,所有监听了这个通道的都可以收到这个发布的内容! redis订阅监听配置类 代码如下: RedisListenerConfig.java package ...

  5. WPF 获取主线程

    WPF线程获取UI线程   WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Act ...

  6. Spring详解(十)------spring 环境切换

    软件开发过程一般涉及"开发 -> 测试 -> 部署上线"多个阶段,每个阶段的环境的配置参数会有不同,如数据源,文件路径等.为避免每次切换环境时都要进行参数配置等繁琐的操 ...

  7. 关于对String中intern方法的理解

    在java的String中有个一直被我们忽视了的方法intern方法:它的官方解释是:一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于 ...

  8. Jmeter的默认字体和窗口的设置方法(一次改动,永久生效!!!)

    因为每次打开jmeter看到的界面不如意,而且会影响工作发挥和效率,为了给大家带来良好的工作体验,为此给出最完美的设置方法,如下: 第一步: 找到jmeter所在目录--->bin---> ...

  9. 高并发HHTP实践

    当今,正处于互联网高速发展的时代,每个人的生活都离不开互联网,互联网已经影响了每个人生活的方方面面.我们使用淘宝.京东进行购物,使用微信进行沟通,使用美图秀秀进行拍照美化等等.而这些每一步的操作下面, ...

  10. 解决win10 cmd运行python弹出windows应用商店下python应用程序

    方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...