一、闭包
- 闭包就是指有权访问另一个函数作用域中的变量的函数。
- 创建闭包最常见方式,就是在一个函数内部创建另一个函数。
特性:
函数里面嵌套函数
外部函数的返回值时内部函数的引用
内部函数可以使用外部函数的变量
def timeit(name):
def wrapper():
print('wapper'+ name)
print('timeit')
return wrapper()
timeit(name='jia')
二、装饰器
装饰器是什么
- 装饰器指的是为被装饰器对象添加额外功能的工具/函数
- 如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。
装饰器的实现必须遵循两大原则:
封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
开放: 对扩展开发
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能
装饰器的实现
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
import time
def timeit(f): # f=add
def wrapper(x,y):
start = time.time()
result = f(x,y) #f实质上是add函数
end = time.time()
print("han shu yun xing shi jian wei %.4f" %(end-start))
return result
return wrapper
@timeit #语法糖:把函数add传入到装饰器timeit中去,add=timeit(add)
def add(x,y):
return x+y
result = add(1,3)
print(result)
装饰器的写法
一个简单的计算时间的模板
#计算被装饰函数运行时间的装饰器
from functools import wraps
import time
def timeit(func): #闭包
@wraps(func) #保留被装饰函数的属性信息和帮助文档
def wrapper(*args,**kwargs):
start_time = time.time() #执行被装饰函数之前,记录当前时间
result = func(*args,**kwargs) #执行被装饰函数
end_time = time.time() #执行被装饰函数之后,记录当前时间
print(f"the {func.__name__} running time is {end_time-start_time} seconds")
return result
return wrapper()
我们来引用这个装饰器模板
@timeit #语法糖
def login():
print("login")
print(help(login))
多装饰器规则
装饰器执行顺序:自上而下执行
被装饰执行顺序:自下而上执行
一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是自下而上(就近原则),而调用的顺序是自上而下(顺序执行)
三、内置高阶函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。
什么是高阶函数?
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式
1.map()
map() 会根据提供的函数对指定序列做映射。
当序列多于一个时,map可以并行(注意是并行)地对每个序列执行如下图所示的过程
result = map(lambda x: x ** 2, [1,2,4,5])
print(list(result))
result = map(lambda x,y: x + y, [1,2,3], [4,5,6] )
print(list(result))
2.reduce()
reduce() 函数会对参数序列中元素进行累积
from functools import reduce
result = reduce(lambda x,y:x+y,[1,2,3,4,5])
print(result)
3.filter()
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
result = filter(lambda x: x % 2 == 0,[1,2,4,5,8])
print(list(result))
result = filter(lambda x: x % 2 != 0,[1,2,4,5,8])
print(list(result))
4.sorted()
sorted() 函数对所有可迭代的对象进行排序操作。返回重新排序的列表。
sorted(iterable, key=None, reverse=False)
key: 主要是用来进行比较的元素,只有一个参数,
reverse: 排序规则,True 降序 ,False 升序(默认)。
python排序sort()和sorted()的区别是什么?
- 排序对象不同: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
- 返回值不同: list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
result = sorted([1,5,3,8,79])
print(list(result))
result = sorted([1,5,3,8,79], reverse=True)
print(list(result))
result = sorted([1,0,3,0,79], key=lambda x:0 if x==0 else 1)
print(result)