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) 实际赋值的 ...
随机推荐
- P1024 一道naive的二分
好吧,这道题思路还是比较简单的.整个程序大体上很快就打出来了,然后修改了解为整数的情况. 但是交上去一直是50分,最后我很无耻的看了题解,然后抄了一个玄学if回来,瞬间AC,不知道为什么... 这句就 ...
- 常用的git操作
(转)仅供自己学习,特此转发记录 链接:Git命令清单
- C++ template一些体悟(1)
#include <iostream> using namespace std; template<typename T> class testClass { public: ...
- linux 下配置svn
1.以前配置好的,没做笔记,忘记了.现在重新回忆 查找svn目录:find / -name svn 找到/projects/svn cd /projects/svn 看里面的配置: 查看配置 [roo ...
- spring的设计模式
spring中用到哪些设计模式 1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFacto ...
- 运用tp5上传图片,并生成缩略图
最近想做个相册,需要用到上传图像,并且考虑到性能问题,还要生成缩略图,就学习下.在网上看了很多大神写的文章,经过各种调试总算出来了,分享下.不好之处,多多指教 ps:运用tp5图片类生成缩略图 ...
- lucene的CRUD操作Document(四)
IndexWriter writer = new IndexWriter(Directory, IndexWriterConfig); 增加文档:writer.addDocument(); 读取文档: ...
- Linux下weblogic10.3.6(jar)版本安装详解
一.安装前的准备 安装weblogic是需要JDK环境的,虽然weblogic有自带的JDK,但是我一般是自己选择JDK进行安装,如果你要自行安装,可以参考我的另一篇博客 https://www.cn ...
- VSCode 配置
官网 https://code.visualstudio.com/ 便携化 Windows,Linux 在 Code.exe 所在目录创建 data 目录 macOS 在 Code.exe 所在目录创 ...
- 5、MyBatis-parameterType 入参封装 Map 流程
以如下入参为例,MyBatis 版本为 3.5.0 public MyUser selectMyUserIdAndAge(Integer id, @Param("user") My ...