第十讲 函数(下)

目录

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: x
x

  • 关键字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()

扩展:

给装饰器传参,实现 “验证成功”
思路:在现有的闭包基础上再见一个闭包,也就是在最外层再定义一个函数

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值