python基础之 装饰器,内置函数
1.闭包回顾
在学习装饰器之前,可以先复习一下什么是闭包?
在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包!
def wrapper():
money =10
def inner(num):
nonlocal money
money +=num
print(money)
print(inner.__closure__) #不返回none的话就是闭包
return inner
wrapper()(100)
装饰器的本质就是闭包
2.装饰器
装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
#简单的装饰器
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()
这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)
3.装饰器语法糖
import time
def timer(func):
def inner():
start = time.time()
func()
print(time.time() - start)
return inner @timer 等价于func1 = timer(func1),@timer会先拿到下面函数的名字,然后把拿到名字的函数传给timer装饰器函数
def func1():
print('in func1')
func1()
def timer(func):
def inner(a):
start = time.time()
func(a)
print(time.time() - start)
return inner @timer
def func1(a):
print(a) func1(1)
装饰器——带参数的装饰器
import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
print(time.time() - start)
return re
return inner @timer #==> func1 = timer(func1)
def func1(a,b):
print('in func1') @timer #==> func2 = timer(func2)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over' func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))
装饰器——hold带参数的装饰器
上面的装饰器已经非常完美了,但是有我们正常情况下查看函数信息的方法在此处都会失效:
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方,显示被装饰的函数
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
@deco
def index():
'''哈哈哈哈'''
print('from index') print(index.__doc__) #显示被装饰函数的注释
print(index.__name__) #显示被装饰的函数名
4.开放封闭原则
开放对扩展代码--->新添加的功能
封闭修改源代码--->不要修改源代码
改变了人家调用方式---->不能改变其原有的调用方式
5.带参数的装饰器
假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
一个一个的取消掉? 没日没夜忙活3天。。。
过两天你领导想通了,再让你加上。。。 def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer @outer(False)
def func():
print(111) func()
6.多个装饰器装饰一个函数
def wrapper1(func):
def inner():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
print('wrapper1.inner',id(inner))
return inner
def wrapper2(func):
def inner():
print('wrapper2 ,before func')
func()
print('func',id(func))
print('wrapper2 ,after func')
print('wrapper2.inner',id(inner))
return inner
@wrapper2 # wrapper1.inner = wrapper2(wrapper1.inner) == wrapper2.inner
@wrapper1 # f = wrapper1(f)===>f =wrapper1.inner
def f():
print('in f')
f()
print(id(f)) #装饰器是函数最上面的装饰器开始调用,但是执行是从上面的装饰器开始执行的
#嵌套装饰器的返回值,返回给上一层 wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper1.inner 189913016
func 189913016
wrapper2 ,after func
wrapper2.inner 189913560
189913560 多层嵌套装饰器的返回值(函数对象),返回给上一层,意义是:给装饰器在加上一个装饰器
7.装饰器执行流程及原理,作用
装饰器的组成:
1.闭包 2.语法糖
装饰器的作用:
1.装饰器本质上是一个高级Python函数,通过给别的函数添加@标识的形式实现对函数的装饰
2.它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
装饰器的原理:就是利用闭包函数来实现,闭包函数的原理就是包含内层函数的return和外层环境变量
8.高级内置函数
***#高级函数默认已经帮我们做了一次for循环的过程****
lambda:
是匿名函数,不需要定义,直接调用,可以配合其他高级函数一起使用
lambda x:x>3 第一个是参数,第二个是返回值(可以做filter的过滤条件) sorted:
排序,sorted([1,3,4,2,7,6]) 默认是升序排序,加上reverse=True是降序,
sorted(li,key=func)可以有两个参数,第一个参数必须是可迭代对象,第二个参数key是指定的排序规则,可以是函数,也可以是表达式
sorted配合lambda
li =['你好啦啦啦啦','我很好','大家都好']
print(sorted(li,key=lambda x:len(x))) filter:
是过滤函数,filter(func,li),第一个参数是一个函数的内存地址,第二个参数是可迭代对象,和sorted正好相反
filter配合lambda
li = [1,3,6,2,5,4,8,11,23,45,14] #排除小于5的并排序
print(sorted(filter(lambda x:x>5,li)))# 既然是过滤函数,就得有过滤条件,正好lambda的第二个参数是返回值,就可以以其为过滤条件 map/reduce
map:
map(func,li)函数接收两个参数,一个是函数,一个是Iterable,
map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
map映射函数, 这里面的map(lambda x:x*x,ls) ,第一个lambda x:x*x是map的第一个参数函数内存地址,第二个ls是可迭代对象,和filter是一样的位置传参数li111 = [1,2,3,4] map应用
1.将li111 = [1,2,3,4]快速转成str
print(list(map(str,li111))) #将int快速转成str 2.
ls= [1,2,3,4,5]
print(list(map(lambda x:x*x,ls)))
reduce:(感觉有点像递归函数)
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
第一个参数是函数的内存地址,第二个参数是可迭代对象第一个参数是函数的内存地址,第二个参数是可迭代对象
他调用的方法中必须要两个参数,第一个参数一直使用return出来的值,第二个参数是循环可迭代对选对象的元素
from functools import reduce
li111 = [1,2,3,4]
def func23(x,y):
return x*10 +y
print(reduce(func23,li111))
zip:函数是python代码中非常常用的一个操作。
其以可迭代对象为输入参数,将可迭代对象里元素分别取出再组合成一个个元组,返回一个列表。
a = ['name', 'age', 'sex']
b = ['alex', 35, 'Male']
print(dict(zip(a,b)))
什么情况需要加list()函数转化一下?
map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
9.内置函数
https://docs.python.org/zh-cn/3.7/library/functions.html 文章:https://www.cnblogs.com/eric_yi/p/7255455.html
文章:https://www.cnblogs.com/cicaday/p/python-decorator.html
文章:https://yiyibooks.cn/xx/python_352/library/index.html
python基础之 装饰器,内置函数的更多相关文章
- python基础--定义装饰器(内置装饰器)
装饰器的定义: 装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景中,比如-- >插入 ...
- python 函数 装饰器 内置函数
函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...
- python基础12_匿名_内置函数
一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python学习 day12 (3月18日)----(装饰器内置函数)
读时间函数: # import time # def func(): # start_time = time.time() # 代码运行之前的时间 # print('这是一个func函数') # ti ...
- Python基础(七)内置函数
今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...
- Python基础(十一)--内置函数
内置函数 数学类 abs():绝对值 round():四舍五入 >>> round(1.3747,1) 1.4 sum():求和 >>> sum({1:'dj',2 ...
- 【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)
''' 关键字: False:bool数据类型 True:bool数据类型 None:表示数据的内容为空 and:逻辑运算符:与 or:逻辑运算符:或 not:逻辑运算符:非 in:身份运算符,判断变 ...
- 【python基础】常用的内置函数
python基础之内置函数 参考: http://www.runoob.com/python/python-built-in-functions.html -zip() zip函数接受任意多个(包括0 ...
随机推荐
- 大一上c语言学习总结
一: 近期C语言知识点易错点整理(1)main()----在c语言中称之为“主函数”,一个c程序有且仅有一个main函数,任何一个c程序总是从main函数开始执行,main函数后面的一对圆括号不能省略 ...
- Make Eudict for reviewing example sentences
Recently, I've started an activity of recording typical and nice English sentences from dictionaries ...
- ansible的logging模块用来写日志
[root@node-1 library]# cat dolog.py #!/bin/env python ANSIBLE_METADATA = { 'metadata_version': 'alph ...
- 4.2模拟赛 wormhole(期望DP Dijkstra)
\(\color{white}{orzmjt又切题了...}\) \(Description\) 给定一张有向图,每条边在每一时刻有\(p_i\)的概率存在.求最优策略下从\(1\)走到\(n\)最少 ...
- 置信区间-显著性-P-值
1.置信区间:误差范围(区间)在统计概率中就叫做置信区间:简单来说置信区间就是误差范围 我们用中括号[a,b]表示样本估计总体平均值的误差范围的区间,由于a和b的确切数值取决于你希望自己对于“该区间包 ...
- [LeetCode] Insert into a Cyclic Sorted List 在循环有序的链表中插入结点
Given a node from a cyclic linked list which is sorted in ascending order, write a function to inser ...
- Git 经常用到的命令
1.克隆master分支之外的分支: 首先克隆项目 1>Git clone git@192.168.0.201:frontend/mn.git 然后转换到克隆下来的文件夹 2>cd 文件名 ...
- word/pdf互转的链接
参考链接 http://www.greenxf.com/soft/98467.html
- nginx r日志中午出现\xE5\x88\x98\xE4\xB8\x96\xE5\xA5\x87
参考文档: https://www.cnblogs.com/hark0623/p/5715726.html https://www.cnblogs.com/fqfanqi/p/7900758.html ...
- 触发器中的after与before理解
做一个表的insert的trigger,目的是只修改插入行的字段. CREATE OR REPLACE TRIGGER TR_RME_SLOT BEFORE INSERT ON RME_SLOT FO ...