函数名、闭包、装饰器 day11
1, 函数名的内存地址,print(func)
2, 函数名可以赋值给其他变量
3, 函数名可以当做容器类的元素
4, 函数名可以当做函数的参数.
5, 函数名可以当做函数的返回值.
学名:第一对象
函数名的内存地址:
def func():
print(555)
print(func) # <function func at 0x00000000003E1E18> 结果:
def func1():
print(111)
f = func1
f() # func()
def func():
print(555)
def func1():
print(111)
def func2():
print(222)
def func3():
print(444)
l1 = [func(),func1(),func2(),func3()]
for i in l1:
i
def func2():
print(222)
def func3(x):
x() # func2()
func3(func2)
def func2():
print(222)
def func3(x):
print(a) # func2()
return a
a = 3
ret = func3(a)
print(ret)
ef func2():
print(222)
def func3(x):
print(a) # func2()
return a
a = 3
ret = func3(a)
print(ret)
二 闭包
内层函数,对外层函数(非全局)的变量的引用,叫做闭包
闭包函数:
内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
函数内部定义的函数称为内部函数由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!
我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?
是不是直接就把这个函数的名字返回就好了
这才是闭包函数最常用的用法
判断闭包的方法
#输出的__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():
name = 'alex'
def inner():
print(name)
inner()
print(inner.__closure__) # 检测是不是闭包 cell 就是b包
wrapper()
全局的name="alex"不是闭包:
name = 'alex'
def wrapper():
def inner():
print(name)
inner()
print(inner.__closure__) # 检测是不是闭包 None 就不是b包
wrapper()
闭包:
def wrapper(x):
def inner():
print(x)
inner()
print(inner.__closure__) # cell
wrapper('alex')
def wrapper(x):
def inner():
print(666)
inner()
wrapper('Alex')
def wrapper():
def inner():
print(666)
return inner
# wrapper() # inner
wrapper()()
闭包的用处:
如果说你内存函数是个闭包,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')()
def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func f = wrapper() # func
i = f() # inner
I()
三 装饰器
import time
def func():
print('嘻嘻更健康')
import time
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
import time
def func():
print('嘻嘻更健康')
# import time
# start_time = time.time()
# time.sleep(0.1)
# func()
# end_time = time.time()
# print('----> 执行效率%s'%(end_time - start_time)) def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
func()
f1 = func # func
func = timmer # timmer
func(f1)
import time
def func():
print('嘻嘻更健康')
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
func = timmer(func) # inner
func() # inner()
import time
def func():
print('嘻嘻更健康')
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
func = timmer(func) # inner
func() # inner()
import time
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
@timmer # func = timmer(func)
def func():
print('嘻嘻更健康')
func() # inner()
带参数的装饰器
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.time()
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('萌哥','杀毒软件')
def shouye():
pass
def riji():
pass
def wenzhang():
pass
带返回值的装饰器
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
ret = f(*args,**kwargs) #
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return ret
return inner @timmer # func = timmer(func)
def func(a):
return 222
print(func('萌哥'))
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
ret = f(*args,**kwargs) #
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return ret
return inner @timmer # func = timmer(func)
def func(a):
return 222
print(func('萌哥'))
通用装饰器
def wrapper(func):
def inner(*args,**kwargs):
'''执行函数前操作'''
ret = func(*args,**kwargs)
'''执行函数后的操作'''
return ret
return inner @wrapper
def func():
print(66)
func()
函数名、闭包、装饰器 day11的更多相关文章
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- 函数基础(三) 装饰器\闭包 day 12
目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...
- 闭包&装饰器详解
闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- Python闭包装饰器笔记
Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...
- python基础之函数当中的装饰器
在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- Python函数篇:装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
随机推荐
- [ JAVA编程 ] double类型计算精度丢失问题及解决方法
前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...
- Win2012 R2虚拟机自激活(AVMA)技术
只要你的宿主机是Windows Server 2012 R2 Datacenter且宿主机已经激活, 不管宿主机许可证是VL,OEM还是零售版,只要宿主主机处于激活状,在其上运行的任何R2 VM都将被 ...
- WinForm textbox 全选
原地址:忘了 textBox1.KeyPress += anyTextBox_KeyPress; private void anyTextBox_KeyPress(object sender, Sys ...
- kafka 消费者 timeout 6000
kafka 消费者 timeout 6000 1:查看zookeeper 的状态,kafka默认是自带zookeeper配置,我建议安装单独的zookeeper 服务,并且配置文件也很简单..直接改 ...
- Centos7永久修改hostname
hostnamectl set-hostname hdp-01 centos7中除了修改hosts文件和network文件后,还需修改etc/hostname文件,具体步骤如下 第一步:修改/etc/ ...
- EVIL TWIN AP
git clone https://github.com/P0cL4bs/3vilTwinAttacker.git cd 3vilTwinAttacker/ ./installer.sh --inst ...
- 解题(StringTongPei--字符串匹配(动态规划))
题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符:*:匹配0个或以上的字符(字符由英文字母和 ...
- day27 异常处理 和 网络协议
元类补充 class MyMeta(type): # 用于新建类对象 def __new__(cls,*args,**kwargs) print(MyMeta) print(*args) # 调用ty ...
- DataGridView中DataGridViewComboBoxColumn的一些相关应用(一)让其值改变时触发事件-转
转自 https://maodaili.de/mao.php?u=a%2FMrbEvUE8PnCuc7FrhJi0Rqd3kmOBHPZUbcJ1c2hbJUK0RYWpAf4lhIOddItP%2 ...
- Python3 round() 函数
Python3 round() 函数 Python3 数字 描述 round() 方法返回浮点数x的四舍五入值. 语法 以下是 round() 方法的语法: round( x [, n] ) 参数 ...