【学习记录】函数式编程:map、lambda、filter


前言

见到过类似于下面这样一道题目

将以下代码用一行python表示

res=[]
i=300
while i<=500:
	if i%3==0 and i%5!=0:
		res.append(i)
	i+=1
print(res)

用一行代码表示就是

res1=list(filter(lambda x:x%5 and not x%3,range(300,501)))
print(res1)

一些学习记录以及思考,有误或不严谨的地方还请指出

1.lambda

直接看语法:使用冒号(:)分割函数的参数及返回值,冒号前面是参数,后面是函数的表达式或者说是返回值
例如 f = l a m b d a f=lambda f=lambda x : x + 1 x:x+1 x:x+1写成普通的函数就是

def f(x):
	return x+1

f=lambda x,y:x+y
#就等价于
def f(x,y):
	return x+y

2.filter

f i l t e r ( ) filter() filter()函数是一个过滤器,就是在数据中去提取出满足条件的信息。
基本用法:两个参数,第一个可以是函数也可以是None,也就是筛选的条件;第二个参数是一个可迭代对象,即我们要在这个可迭代对象中寻找满足条件(返回True值)的数据,拿最上面那个题来说
f i l t e r ( l a m b d a filter(lambda filter(lambda x : x % 5 x:x\%5 x:x%5 a n d and and $not x % 3 x\%3 x%3 , r a n g e ( 300 , 501 ) ) range(300,501)) range(300,501))
前面的 l a b m d a labmda labmda函数式返回该数是否 可以整除3但是不能整除5,后面的 r a n g e ( 300 , 501 ) range(300,501) range(300,501)即判断的数据范围
举简单的例子

list(filter(lamnda x:x%2,range(10)))
#返回 [1,3,5,7,9]
#这样就将[0,9]闭区间范围内的奇数过滤了出来
list(filter(None,[0,1,0,1,True,False]))
#返回[1,1,True]

3.map

m a p map map 即“映射”,用法:和 f i l t e r filter filter类似,两个参数,第一个是函数,第二个是可迭代对象,对可迭代对象中的每个元素都应用第一个函数知道所有元素都应用完毕。
经常在数据结构的题目中会用到,在ACM模式下
比如输入 10 10 10 9 9 9,分别把它们赋值给 m m m n n n

m,n=map(int,input().strip().split())
#这样就赋值结束

不熟悉字符串的话可能看起来有点模糊

list(map(lambda x:x+1,range(4)))
#要匹配的数是0 1 2 3
#最后返回[1,2,3,4]

注意到 m a p map map 后都加了 l i s t ( ) list() list() 来返回最后的结果,是因为 m a p ( ) map() map() 函数生成的结果序列不会把全部结果显示出来,要想获得结果序列,可以使用 l i s t ( ) list() list() 方法
上面我把“序列”加粗,是因为 m a p ( ) map() map()只能应用于序列,而无法应用于数据框

4. 数据框中的一些操作

在pandas DataFrame中与 m a p ( ) map() map()函数很类似的有 a p p l y ( ) apply() apply() a p p l y m a p ( ) applymap() applymap()

方法作用应用限制
apply()可以对数据框的某一行或某一列中的元素进行操作,也可以对所有元素序列和数据框中都可以
applymap()对数据框中的每一个元素进行操作只能应用于数据框

a p p l y m a p applymap applymap例子

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {
        "A":np.random.randn(3),
        "B":np.random.randn(3),
        "C":np.random.randn(3)
    }
)

在这里插入图片描述
保留两位小数

df2=df.applymap('{0:.02f}'.format)
print(df2)
#注意这样转换后的不再是浮点数,而是字符串

在这里插入图片描述
求A列值的总和
a p p l y apply apply例子
在这里插入图片描述
如果不规定 a x i s axis axis,apply方法会默认 a x i s = 0 axis=0 axis=0

原理这篇文章very nice!

https://zhuanlan.zhihu.com/p/100064394


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值