闭包

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

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

    在以上mybait入门的改进(增加了接口让增删改查 后期跟容易) 注意:主配置文件和映射配置文件内容不变,但是映射文件要和对应接口放于同目录下并且名称必须相同 一.接口创建 public interf ...

  2. 网络游戏逆向分析-4-分析喊话call参数来源

    网络游戏逆向分析-4-分析喊话call参数来源 好久没更新了,去实习去了,大家见谅一下. 前面找到了喊话功能call函数,然后分析了它的参数有五个,分别的四个push的和一个ecx: 第一次edx = ...

  3. docker harbor安装

    # 官网下载离线包,https://github.com/goharbor/harbor/releases src]# tar xf harbor-offline-installer-v1.8.3.t ...

  4. 【java文件处理】java项目路径下的文件下载处理

    1. controller类: package com.neo.controller; import javax.servlet.http.HttpServletResponse; import or ...

  5. 处理URLs

    问题 你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs. 方法 在你解析文档时确保有指定base URI,然后 使用 abs: 属性前缀来取得包含base URI ...

  6. 【AE】多表的联合查询

    多表的联合查询 // Create the query definition. IQueryDef queryDef = featureWorkspace.CreateQueryDef(); // P ...

  7. shiro登录源码

    //1.获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManage ...

  8. 运行uni-app到微信开发者工具

    1.工具及环境 HBuilder X 微信开发者工具 Node.js,测试:node -v(node安装) 和 npm -v(自带的npm也安装成功) 2.创建uni-app项目: 在点击工具栏里的文 ...

  9. Qt学习日记篇-Qt中使用Curl和jsonCpp

    1.Qt中安装并使用jsonCPP库 1.1  官网下载.https://sourceforge.net/projects/jsoncpp/    解压文件得到 jsoncpp-src-0.5.0 文 ...

  10. JS 处理图片平铺问题

    background: url("../../../assets/image/center.png") no-repeat; // 让图片不平铺   overflow: hidde ...