Python之函数的本质、闭包、装饰器
函数名的本质
函数名本质上就是函数的内存地址。
1.可以赋值给其他变量,被引用
def func():
print('in func') f = func
print(f)
2.可以被当作容器类型的元素
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']()
3.可以当作函数的参数和返回值
def f1():
print('f1') def func1(argv):
argv()
return argv f = func1(f1)
f()
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。 #可以当做普通变量用!
闭包
闭包函数:
内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
def wrapper():
name='laozhang'
def inner():
print(name)
inner()
print(inner.__closure__) #检测是不是闭包 cell 就是b包
wrapper() '''
输出内容:
laozhang
(<cell at 0x0000000002167498: str object at 0x00000000026D6CB0>,)
'''
由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!
我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?
是不是直接就把这个函数的名字返回就好了?
这才是闭包函数最常用的用法
判断闭包函数的方法__closure__
#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner f = func()
f() #输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner f2 = func2()
f2()
闭包嵌套
def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func f = wrapper()
i = f()
i() '''
eva 1000
'''
闭包的用处:
如果说内存函数是个闭包,python内部有一个机制,遇到闭包,会在内存中开启一个内存空间(不会关闭),不会随着函数的结束而关闭,能够节省创建新内存的时间和使用频率。
应用:网页爬虫
from urllib.request import urlopen def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index()
content = xiaohua()
print(content)
装饰器
在不改变原函数的基础上,增加其他功能。(验证登录、测试时间、打印日志)
1.简单的装饰器
import time
def func():
print('更健康')
def timmer(f):
def inner():
start_time = time.clock()
time.sleep(0.1)
f()
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
func = timmer(func)
func() '''
更健康
执行时间为0.0998653700182556
'''
2.语法糖(简单版本的装饰器):
将@装饰器的函数名,放在被装饰的函数之前。
import time
def timmer(f):
def inner():
start_time = time.clock()
time.sleep(0.1)
f()
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
@timmer #相当于func = timmer(func)
def func():
print('更健康')
func() #inner() '''
更健康
执行时间为0.1004682374539092
'''
3.带参数的装饰器
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.clock()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
@timmer #相当于func = timmer(func)
def func(a):
print('%s更健康'%a)
@timmer #相当于func1 = timmer(func1)
def func1(a,b):
print('%s和%s更健康'%(a,b))
func('老哥') #
func1('老哥','杀毒软件') '''
老哥更健康
执行时间为0.10024377977801449
老哥和杀毒软件更健康
执行时间为0.09983056346016456
'''
4.带返回值的装饰器
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.clock()
time.sleep(0.1)
ret = f(*args,**kwargs) #
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return ret
return inner
@timmer #相当于func = timmer(func)
def func(a): #a:老哥
return 222
print(func('老哥')) '''
执行时间为0.0996239553012396
'''
5.通用装饰器
def wrapper(func):
def inner(*args,**kwargs):
'''执行函数前的操作'''
ret = func(*args,**kwargs)
'''执行函数后的操作'''
return ret
return inner
@wrapper
def func():
print(66) func()
Python之函数的本质、闭包、装饰器的更多相关文章
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- python 闭包@装饰器
1.装饰器 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- Python【第四篇】函数、内置函数、递归、装饰器、生成器和迭代器
一.函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 1.定义 def 函数名(参数): ...
- 【Python入门学习】闭包&装饰器&开放封闭原则
1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
随机推荐
- Quartz 定时任务时间设置
转自https://blog.csdn.net/zdx1515888659/article/details/79158169 quartz定时任务时间设置: 这些星号由左到右按顺序代表 : * * * ...
- WPF实现Windows资源管理器(附源码)
今天我来写一篇关于利用WPF来实现Windows的资源管理器功能,当然只是局部实现这个功能,因为在很多时候我们需要来实现对本机资源的管理,当然我们可以使用OpenFileDialog dialog ...
- npm 设置代理
设置代理 npm config set proxy http://username:password@server:portnpm config set https-proxy http://user ...
- CSAW 2016:Rock-100
ELF文件 拖进ida 震惊: 这一堆堆都是什么神仙函数呀!! f5看一下伪代码 可以看出来 其实看起来函数很多 但是真正管用的函数也就那么几个 如果sub_4017E6的值是0 那么就会输出flag ...
- Apache ab 单测 分布式
使用synchronized 处理并发 缺点:无法做到细粒度控制 只适合单点的情况 使用Redis作为分布式锁 setnx命令 设计模式 :使用 !setnx 加锁 getset命令
- java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=fun2], {ExactMatcher:fDisplayName=fun2(cn.itcast.demo2.fun1)], {LeadingIdentifierMatcher:fClassName=cn.itcast.demo2.fun1,fLeadi
Junit报的错误, 在测试方法前面没有添加注解@Test
- .net core compatibility windows & windows compatible Linux
Who is this package for? This package is meant for developers that need to port existing .NET Framew ...
- Spring03-AOP
一. AOP介绍 1. Aop介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编 ...
- 洛谷P1501 Tree II
LCT 还是LCT的板子,下放标记和那道线段树2一样,先放乘..之前用char忘记getchar,调了好久... 注意开long long!! #include <bits/stdc++.h&g ...
- 使用npm安装appium时的坑
使用命令安装appium 命令安装 npm install -g appium(如果安装失败那么就指定国内的淘宝源安装吧,官方源我应该试了n次费了很大劲才安装成功) 指定淘宝源安装:设置 npm 淘宝 ...