python 函数名 、闭包 装饰器 day13
1,函数名的使用。
函数名是函数的名字,本质就是变量,特殊的变量。函数名()加括号就是执行此函数。
1,单独打印函数名就是此函数的内存地址。
def func1():
print(555)
print(func1)
# <function func1 at 0x0000027B7CF1A048>
2,函数名的赋值
def func():
print(666)
f = func
print(f())
3,函数名可以作为容器类数据的元素。
def f1():
print(111)
def f2():
print(222)
def f3():
print(333)
def f4():
print(444)
li = []
for i in range(1,5):
li.append('f'+str(i)) for i in li:
eval(i)()
4,函数名可以作为参数。
def f1():
print(666) def f2(x):
x() f2(f1)
5,函数名可以作为函数的返回值。
def f1():
print(666) def f2(x):
return x
f2(f1)()
函数又叫第一类对象(first-class object)指
1,可在运行期创建
2,可用作函数参数或返回值
3,可存入变量的实体。
2,闭包的使用
内部函数包含对外部作用域而非全局作用域变量的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
def wraaper():
def inner():
print(444)
return inner
wraaper()()
def wraaper():
def inner():
print(555)
inner()
wraaper()
判断闭包函数的方法__closure__
def wraaper():
name = 'taibai'
def inner():
print(name)
inner()
print(inner.__closure__)
wraaper()
#taibai
(<cell at 0x0000025B34990B58: str object at 0x0000025B34E14848>,)
name = '老男孩'
def wraaper(n):
def inner():
print(n)
inner()
print(inner.__closure__)
wraaper(name)
老男孩
(<cell at 0x0000024AF7810B58: str object at 0x0000024AF8343990>,)
这个也是闭包。
闭包的作用,当函数开始执行时,如果遇到闭包,它有一个机制,它会永远开辟一个内存空间,将闭包中的变量等值放入其中,不会随函数的执行完毕而消失。
from urllib.request import urlopen
content = urlopen('http://www.cnblogs.com/jin-xin/').read().decode('utf-8')
print(content)
from urllib.request import urlopen
def index():
ur1 ='http://www.xiaohua100.cn/index.html'
def get():
return urlopen(ur1).read()
return get() print(index()())
3,装饰器
装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
现在我有一个需求,我想让你测试这个函数的执行时间,在不改变这个函数代码的情况下:
import time
def func1():
print('所有痛苦都会过去')
def timmer(f):
def inner():
start_time = time.time()
f()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return inner func1 = timmer(func1)
func1()
但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。
import time
def timmer(f):
def inner():
start_time = time.time()
f()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return inner
@timmer
def func1():
print('继续努力加油自己') func1()
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return ret
return inner @timmer
def func1(a,b):
print('继续努力加油自己')
return 666 print(func1(1,2))
装饰器的开放关闭原则:
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
python 函数名 、闭包 装饰器 day13的更多相关文章
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- Python函数篇:装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- python函数:叠加装饰器、迭代器、自定义迭代器、生成式
一.叠加多个装饰器二.迭代器三.自定义迭代器四.xxx生成式 一.叠加多个装饰器 # 加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数 # 在加载完毕后,调用原函数其实就是在调用 ...
- python 函数基础及装饰器
没有参数的函数及return操作 def test1(): print ("welcome") def test2(): print ("welcomt test2&qu ...
- python函数学习之装饰器
装饰器 装饰器的本质是一个python函数,它的作用是在不对原函数做任何修改的同时,给函数添加一定的功能.装饰器的返回值也是一个函数对象. 分类: 1.不带参数的装饰器函数: def wrapper( ...
- python之嵌套 闭包 装饰器 global、nonlocal关键字
嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能 # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
随机推荐
- 【【洛谷P2678 跳石头】——%%%ShawnZhou大佬】
{dalao传送门} 这道题如果要使用暴力搜索直接求解会严重超时.实际上,我们可以发现,这个所谓的最短跳跃距离显然不能超过一个范围,而这个范围题目上已经给了出来.也就是说,答案是有一个确定的范围限制的 ...
- snpeff注释变异(variants)
1.进入网站http://snpeff.sourceforge.net/,下载snpeff: wget http://sourceforge.net/projects/snpeff/files/snp ...
- jmeter的介绍和使用一
一,jmeter介绍 1.官方网站下载jmeter,然后解压安装.我用的mac,用mac来讲解. 这是解压以后的包. 2.bin目录里面是一些可执行的文件 ,重点关注启动 如果是windows系统,直 ...
- Tomcat 下载安装与配置
一.下载 tomcat下载链接:https://tomcat.apache.org/ 1.进入tomcat官网后,选择需要下载的版本.我使用的是tomcat9,所以在这我选择tomcat9 2.选择z ...
- python学习笔记--文件重命名,删除及文件夹
文件重命名 import os os.rename('123.txt','456.txt') 删除文件 >>> import os >>> os.remove('4 ...
- 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能
在监控摄像机安装后,往往需要设置IP等信息,在IP不知道的情况下,IP搜索是一个很常见也必须的功能. 考虑到设备IP和当前局域网可能不在同一个网段,ARP是一个不错的选择. 首先安装WinPcap软件 ...
- C#梳理【集合Collection】
C# 集合(Collection) 集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支 ...
- python自动化开发-[第十三天]-javascript
今日概要 1.javascript简单语法 1.javascript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名S ...
- 将二维list某列组成新的list
# encoding: utf-8 import decimal import requests import logging import logging.config import random ...
- linux 优化(一)
uptime up 表示系统正在运行 10:54:19 表示当前时间 8 min 表示系统启动的总时间 1 user 表示正在登陆用户数 load average 表示系统平均负载,最后三个数字呢,依 ...