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) 实际赋值的 ...
随机推荐
- bzoj2434 阿狸的打字机
题目链接 思路 可以发现,其实题目中所描述的操作,就是在\(AC\)自动机上走的过程.输出就是打上标记.删除就是返回父亲节点. 然后看询问.每次询问字符串\(x\)在字符串中\(y\)出现的次数.其实 ...
- C# http请求带请求头部分
直接上代码 前台调用: <script type="text/javascript"> function zLoginCheck() { var Account = ' ...
- Pandas库中的DataFrame
1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...
- react-native实现电影列表
页面运行效果 代码: import React, { Component } from "react"; import { Image, FlatList, StyleSheet, ...
- python 二维数组读入
study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二维数组键盘输入 1 m = int( ...
- IT项目管理分享7个开源项目管理工具
在一项调查中,有 71% 的组织表示他们在开发过程中会用到敏捷方法. 此外,用敏捷方法管理项目比传统方法管理项目成功率高 28%.在这次工具推荐中,我们从一些比较受欢迎的开源项目管理工具中摘取了支持敏 ...
- ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...
- JS事件(三)部分常用事件
1.滚动条事件scroll EventUtil.addHandler(window,"scroll",function(event){ if(document.compatMode ...
- ELK-6.5.3学习笔记–使用filebeat管理微服务日志
微服务日志打印. 转载于http://www.eryajf.net/2369.html 上边是输出了nginx日志,从而进行展示,以及各种绘图分析,而现在的需求是,要将微服务当中的日志汇总到elk当中 ...
- BZOJ2815 拓扑排序 + LCA
https://www.lydsy.com/JudgeOnline/problem.php?id=2815 作为一个DAG图,结点之间又有这么明显的等级之分,很容易想到的是拓扑排序. 但是不管是正向的 ...