零基础入门学习Python(20)-lambda表达式、filter()、map() BIF

lambda表达式

lambda关键字的使用

  • Python允许使用lambda关键字来创建匿名函数
  • 基本语法:使用冒号(:)分隔函数的参数及返回值,冒号左边放置函数的参数,如果有多个参数,使用逗号(,)分隔即可;冒号右边是函数的返回值
  • 执行完lambda语句后实际上返回一个函数对象,如果要对它进行调用,只需要给它绑定一个临时的名字即可
>>> def ds(x):
	return 2 * x + 1

>>> ds(5)
>>> ds(5)
11
>>> lambda x : x * 2 + 1
<function <lambda> at 0x0000028207122820>
>>> g = lambda x : x * 2 + 1
>>> g(5)
11

在这里插入图片描述
在这里插入图片描述

  • 用完之后,内存的垃圾清洁器在它不使用的时候会自动把这个内容删除掉,不用去考虑其申请和释放资源
    两个参数的例子:
>>> def add(x,y):
	return x + y
>>> add(3,4)
7
>>> lambda x, y : x + y
<function <lambda> at 0x00000282071E3550>
>>> g = lambda x , y : x + y
>>> g(3,4)
7
>>> 

在这里插入图片描述

lambda表达式的重要作用

  • Python写一些执行脚本时,使用lambda就可以省下定义函数过程,比如我们只是需要写个简单的脚本来管理Linux服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简
  • 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用lambda就不需要考虑命名的问题了
  • 简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤

两个牛逼的BIF

filter()

  • filter()函数是一个过滤器,它的作用就是在海量的数据里面提取出有用的信息

  • filter()这个内置函数有两个参数:第一个参数可以是一个函数或None参数,第二个参数是一个可迭代对象
    【1】如果第一个参数是一个函数的话,则将第二个可迭代数据里的每一个元素作为函数的参数进行计算,把返回True的值给筛选出来,以列表形式输出
    【2】如果第一个参数是None,则将第二个参数里得True的值给筛选出来
    在这里插入图片描述

>>> filter(None,[1,0,0,23,False,True])
<filter object at 0x000002820712DF40>
>>> list(filter(None,[1,0,0,23,False,True]))
[1, 23, True]

在这里插入图片描述

>>> def odd(x):
	return x % 2

>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]

在这里插入图片描述

>>> list(filter(lambda x : x % 2, range(10)))
[1, 3, 5, 7, 9]

在这里插入图片描述

map()

  • 在编程领域,map一般作“映射”来解释
  • map()这个内置函数有两个参数,仍然是一个函数和一个可迭代对象,将可迭代对象的每一个元素作为函数的参数进行运算加工,直到可迭代序列的每个元素都加工完毕
>>> list(map(lambda x: x * 2, range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

在这里插入图片描述

  • map()的第二个参数是收集参数,支持多个可迭代对象,map()会从所有可迭代对象中依次取一个元素组成一个元组,注意,如果可迭代对象的长度不一致,则以较短的迭代结束为止
>>> list(map(lambda x, y : x + y,[1, 3, 5], [10, 30, 50, 66, 88]))
[11, 33, 55]

在这里插入图片描述

Task

0. 请使用lambda表达式将下边函数转变为匿名函数?

def fun_A(x, y=3):
        return x * y
go = lambda x , y = 3: x + y

在这里插入图片描述
1. 请将下边的匿名函数转变为普通的屌丝函数?

lambda x : x if x % 2 else None
def odd(x):
	if x % 2:
		return x
	else:
		return None

在这里插入图片描述
2. 感受一下使用匿名函数后给你的编程生活带来的变化?
a. Python 写一些执行脚本时,使用匿名函数就可以省下定义函数过程,比如说我们只是需要写个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用匿名函数就可以使得代码更加精简。
b. 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用匿名函数就不需要考虑命名的问题了
c. 简化代码的可读性,由于普通的屌丝函数阅读经常要跳到开头 def 定义部分,使用匿名函数函数可以省去这样的步骤。
3. 你可以利用 filter() 和 lambda 表达式快速求出 100 以内所有 3 的倍数吗?

list(filter(lambda x :not x % 3,range(1100)))

图示有点瑕疵,应该去0,从1开始算
在这里插入图片描述

4. 还记得列表推导式吗?完全可以使用列表推导式代替 filter() 和 lambda 组合,你可以做到吗?
列表推导式回顾
循环可以用来生成列表:

values = [10, 21, 4, 7, 12]
squares = []
for x in values:
    squares.append(x**2)
print(squares)

使用列表推导式:

values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values]
print(squares)

在这里插入图片描述
用列表推导式代替filter()、lambda组合筛选奇数

odd = [x for x in range(10) if x % 2 == 1]

在这里插入图片描述

5. 还记得 zip 吗?使用 zip 会将两数以元祖的形式绑定在一块,例如:

>>> list(zip([1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

但如果我希望打包的形式是灵活多变的列表而不是元祖(希望是 [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] 这种形式),你能做到吗?(采用 map() 和 lambda 表达式)

list(map(lambda x,y: [x,y],[1,3,5,7,9],[2,4,6,8,10]))

在这里插入图片描述
6. 请目测以下表达式会打印什么?

def make_repeat(n):
        return lambda s : s * n

double = make_repeat(2)
print(double(8))
print(double('FishC'))

16
FishCFishC

猜你喜欢

转载自blog.csdn.net/qq_44520665/article/details/114476445