函数名,闭包,装饰器
一:函数名
1, 函数名的内存地址,print(func)
2, 函数名可以赋值给其他变量
3, 函数名可以当做容器类的元素
def f1():print('f1') def f2():print('f2')def f3():print('f3')l = [f1,f2,f3]d = {'f1':f1,'f2':f2,'f3':f3} # #调用 l[0]() d['f2']()
View Code
4, 函数名可以当做函数的参数.
5, 函数名可以当做函数的返回值.
def func2():print(222) def func3(x):# print(x) # x=func2()return x f = func2 f() #func2() ret = func3(func2) # ret=func2 ret() #func2() func3(func2)()def f1():print('f1') def func1(argv):argv() #f1()return argv f = func1(f1) f()
View Code
二:闭包
1, 内层函数,对外层函数(非全局)的变量的引用,叫做闭包。
def func():name = 'eva'def inner():print(name) #此处打印的name是对上一层函数(外部作用域非全局作用域)变量的引用。return inner f = func() f()
View Code
2, 闭包函数的检测:方法__closure__
def func():name = 'eva'def inner():print(name)print(inner.__closure__) #此处打印的有cell元素,故inner是闭包函数。return inner f = func() f()name = 'egon' def func2():def inner():print(name)print(inner.__closure__) #此处打印的是None,说明此内部函数inner不是闭包函数。return inner f2 = func2() f2()
View Code
3,闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包, 他会在内存中开启一个内存空间,不会随着函数的结束而关闭。
from urllib.request import urlopen print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read()) def index(url):content = urlopen(url).read()def get():with open('爬虫','a') as f1:f1.write(content.decode('utf-8'))return get index('http://www.cnblogs.com/jin-xin/articles/8259929.html')()
View Code
三:装饰器
1,什么是装饰器?
装饰器实际上是一个python函数,它可以让其它函数在不需要任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于切面需求的场景,比如:性能检测,缓存等。
2,简单的装饰器
比如给函数加一个性能检测的装饰器,程序如下:
import time def timmer(f): #f=funcdef inner():start_time = time.time()time.sleep(0.1)f() #func()end_time = time.time()print('----> 执行效率%s' % (end_time - start_time))return inner @timmer # func = timmer(func) def func():print('书法大赛') func() # inner()
View Code
3,带参数的装饰器,程序如下:
import time def timmer(f): #f=funcdef inner(*args,**kwargs):print(*args,**kwargs)start_time = time.time()time.sleep(0.1)f("张三") #func("张三")end_time = time.time()print('----> 执行效率%s' % (end_time - start_time))return inner @timmer# func = timmer(func) func=inner def func(a):print('%s书法大赛'%a) func("aaa") #inner("aaa")
View Code
4,带返回值的装饰器,程序如下:
import time def timmer(f): #f=funcdef inner(*args,**kwargs):start_time = time.time()time.sleep(0.1)ret = f(*args,**kwargs) # 222end_time = time.time()print('----> 执行效率%s' % (end_time - start_time))return retreturn inner @timmer # func = timmer(func) def func(a):return 222 print(func('萌哥')) #inner("萌哥')
View Code
5,通用装饰器,程序如下:
def wrapper(func):def inner(*args,**kwargs):'''执行函数前操作'''ret = func(*args,**kwargs)'''执行函数后的操作'''return retreturn inner @wrapper #func=wrapper(func) def func():print(66) func()
View Code
转载于:https://www.cnblogs.com/leiwei123/p/8413105.html
函数名,闭包,装饰器相关推荐
- 函数进阶---闭包/装饰器/迭代器/生成器---高级特性
待完成... 转载于:https://www.cnblogs.com/py-coder/p/10037232.html
- python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...
一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...
- py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())
#py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...
- Python 进阶_闭包 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- day4----函数-闭包-装饰器
day4----函数-闭包-装饰器 本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时, ...
- python基础之函数当中的装饰器
在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...
- SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理
SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...
- python入门day11闭包装饰器
目录 闭包 例子 同级闭包 装饰器引入 装饰器使用 无参例子 有参例子 可变参数例子 带关键字参数的装饰器 双层装饰器 装饰器带参数 装饰器的应用 闭包 def func():a=100def inn ...
- python中的json函数_python中装饰器、内置函数、json的详解
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
最新文章
- nagios自写插件—check_file
- 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压
- 赠书 | 《数据驱动:从方法到实践》预售正式开启
- Servlet之Tomcat配置与启动(一)
- JavaScript窗体控制函数
- 施耐德EVlink 电动车充电站有新漏洞,可导致电动车遭劫持
- 高位在前和低位在前区别_前、后级功放、合并功放区别是什么?
- 数据库设计—— 使用Java实现数据库编程
- jeb java_jeb2 java 脚本插件
- 华为RH2288做raid方法
- GBase 8s 导入导出工具 unload/load
- 中投民生:外资狂卖122亿,贵州茅台被抛售10亿,究竟发生了什么事?
- STC89C52RC定时器2串口通信
- 开发者收益路径—广告变现,App商业化如何有效增收?
- ES--索引生命周期管理
- 想成为一名合格的前端工程师,需要掌握哪些技能?
- 测试眉形的有哪个软件_拍照测眉毛_有没有一种软件可以通过拍照帮人设计眉毛_彩妆阁...
- 美图秀秀上传图片案例1
- 创业规划 - 我的闪存
- 2.15 Rhcs套件----实现高可用并配置网络硬盘,实现全局文件系统
热门文章
- sql 训练及总结
- Debian 9 + Windows 10 双系统安装体验
- linux关防火墙和SElinux
- 阻止默认事件event.preventDefault();
- Cordova开发总结(插件篇)
- indexOf(String.indexOf 方法)
- 程序执行系统VC++程序出现“试图执行系统不支持的操作”
- JavaScript正则表达式使用详解
- SharePoint 2010新特性文档集
- PCD Lesson2:PCD文件的write