目录
1·filter()函数
2·reduce()函数
3·匿名函数的介绍
匿名函数语法
匿名函数的应用
匿名函数作为函数返回值使用
匿名函数作为实参传入
4·高阶函数
5·闭包
6·装饰器
一.filter函数的定义:
filter()函数是一个过滤函数,将不符合条件的元素过滤掉,将符合条件的元素重新生成一个新的列表
例:
需求:返回1–10的奇数列表
思路1:利用for循环 + 步长 提取奇数,然后添加进新的列表
···
li = []
for i in range(1, 11, 2):
li.append(i)
print(li)
···
**思路2:**使用条件判断取余来完成
···
li = []
for i in range(1, 11):
if i %2 == 1:
li.append(i)
print(li)
···
思路3:使用filter()函数来过滤
def is_odd(n): # 自定义过滤规则的函数 传入一个变量n来接收
return n % 2 == 1 # 返回一个条件 n %2 == 1 取奇数
print(list(filter(is_odd,range(1, 11))))
filter()函数里面是要传入参数的,第一个参数is_odd是自定义函数的引用,第二个参数range(1,11)是一个可迭代对象,遍历这个对象再传给is_odd, 使用filter函数通过设定条件来过滤不符合条件的元素,然后将符合条件的元素强转为列表list
二·reduce()函数:
在prthon2中它是一个内置的方法,但是在prthon3中它不是,使用时需要调用
例:
需求:实现6!的阶乘
from functools import reduce # 首先导入reduce模块
def multi(x,y): # 自定义一个的函数 传入两个变量x,y来接收
return x * y # 返回x y的乘积
print(reduce(multi, range(1, 7)))
range(1,7)遍历的结果是[1,2,3,4,5,6],reduce()的功能就是先传入两个值1和2,然后再用他两的乘积去乘以第3位数,以此类推(((((1*2)*3)*4)*5)6)。
三·匿名函数介绍:
当我们在传入函数时,有些时候不需要去重复调用该函数,直接传入匿名函数更方便,也无需担心函数名冲突,并且还可以将匿名函数赋值给一个变量,再利用变量来调用该函数
匿名函数语法:
匿名函数的表达式为:lambda x: xx
- 关键字lambda表示匿名函数
- 冒号前面的x表示函数参数
- x*x是匿名函数的表达式。注意 匿名函数只能有一个表达式不用写 return ,返回值就是该表达式的结果
#将匿名函数赋值给f,传入2用匿名函数的参数来接收,x*x就是表达式,也就是返回值
f = lambda x: x*x
print(f(2)) # 打印结果为 4
同样的来求阶乘6!的乘积
from functools import reduce # 首先导入reduce模块
print(reduce(lambda x,y: x*y,range(1, 7)))
使用匿名函数lambda显得更简洁,然后再用reduce求6!的阶乘
匿名函数的应用
1·直接作为函数返回值使用.
下面举一个例子。但现实中很少这样使用
def test(i, j): # 定义一个函数
return lambda : i*j # 匿名函数作为返回值使用
res = test(6, 5) # 这里的res 其实就等于 lambda : i*j
print(res())
匿名函数作为实参:
def test1(i, j, func):
res = func(i * j)
return res
print(test1(11, 11, lambda i, j: i * j))
这里的lambda i,j: i*j 就是作为实参来使用的
知识点扩充:
需求:以元素绝对值进行排序
li = [-2, 3, -5, 1, 4]
li.sort(key=abs)
print(li)
sort()是从小到大排序,sort(key=abs) 是引用abs指定以绝对值排序
四·高阶函数
实际上,我们学习过的map(),filter()等都是高阶函数。那么只要满足以下一个条件的就是高阶函数。
• 函数名作为参数传入
• 函数名作为返回值
五·闭包
闭包的定义需要满足以下三个条件:
• 在一个外函数中定义了一个内函数
• 内函数里运用了外函数的临时变量
• 并且外函数的返回值是内函数的引用
闭包现象:一般情况下,当test()函数调用完毕后,number变量就会被释放,但在闭包中外函数发现自己的临时变量将来会被内函数用到,所以在自身调用结束时,在返回内函数的同时,会将外函数的临时变量和内函数绑定在一起。
例:
代码如下:
def test(number):
print("–1--")
def test_in(number_in): # 1.内部函数
print("--2--")
print(number_in)
return number + number_in # 2.外部环境的变量引用
print("--3--")
return test_in # 3.内部函数test_in返回
res = test(20) # res = test_in
res1 = res(30)
print(res1)
六·装饰器
什么是装饰器?
在不改变源代码的情况下,为函数添加了新的功能
由于我们在开发中要遵守封闭开放原则,所以python开发者开始使用装饰器,装饰器也就是说在不改变源代码的情况下为函数添加新的功能。并且使用@符号,@符号为语法糖
什么是时间戳?就是1970年至今的秒
什么是开放,封闭原则?
封闭-----》已经实现固定功能的代码块,尽量不做修改
开放-----》 允许拓展新的功能
注意:一般情况,只有满足闭包现象的才能作为装饰器
例:
需求:实现计算函数运行时间的功能
import time
def calcu_time(func):
def test_in():
start = time.time()
func()
end = time.time()
print(“spend {}”.format(end - start))
return test_in
@calcu_time
def test1():
print("—test1—")
time.sleep(2)
@calcu_time
def test2():
print("—test2—")
time.sleep(3)
test1()
test2()
扩展:
给装饰器传参,实现 “验证成功”
思路:在现有的闭包基础上再见一个闭包,也就是在最外层再定义一个函数