python3中filter、map、reduce、apply、zip函数用法总结


参考: https://blog.csdn.net/qq_32618817/article/details/80633848
参考: https://blog.csdn.net/blwinner/article/details/81944142
参考: https://blog.csdn.net/weixin_46649052/article/details/107048132
参考: https://blog.csdn.net/qiang12qiang12/article/details/81174949

filter函数

描述: filter的主要作用是通过function对iterable中的元素进行过滤,并返回一个迭代器(iterator),其中是function返回True的元素。如果function传入None,则返回所有本身可以判断为True的元素。
例1

l = [x for x in range(10)]
print(list(filter(lambda x : x%2 == 0 ,l)))
# 因为filter返回的是一个iterator,所以输出的时候需要用list进行转换
# 输出[0,2,4,6,8]

例2

l = [x for x in range(0, 10)]
print(list(filter(None, l)))
#输出[1,2,3,4,5,6,7,8,9]

和例1的输入略有区别,输入是0~9,filter的第一个参数传入了None,所以在迭代过程中,0被判断为False从而被过滤,1-9被保留下来。这个方法可以替代for循环的数据拾取。

通过上面的例子可以看出,调用filter时并没有触发过滤过程,因为调用filter函数只是返回了一个iterator,它是惰性计算,只有next或者list的时候,才真正开始计算过程。

filter高级用法
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
        
def _not_divisible(n): 
    return lambda x : x%n>0
 
def primes():
    yield 2
    it = _odd_iter()
    ftr = filter(_not_divisible(2), it) #1
    while True:
        n = next(ftr )        #2
        yield n                
        ftr = filter(_not_divisible(n), ftr ) #3
        
for n in primes():
    if n < 100:
        print('now:',n)
    else:
        break

1.其实filter返回的是一个filter对象。#3行通过重复赋值,可以向filter中添加多个过滤器。例子中,就是通过每次执行#3行,把当前素数作为新的被除数条件加入到过滤器ftr 中,所以在for循环的后续迭代中,每次都增加一个素数条件进入过滤器。
通过这种重复赋值的方法,可以给filter添加多个过滤函数,极大的加强了过滤功能。

2.filter的第二个参数可以传入iterator。当然,此时就不能用list取filter的结果,只能用next(filter对象)取下一个过滤结果为True的元素。

map函数

在python3中map被封装成了一个类,功能依旧是将function作用于要被遍历的序列,但是最后返回的结果就是一个map对象(python2中返回的是一个列表)

map(func, seq1[, seq2,])

python 3 的map()函数
描述:
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法:
map() 函数语法:map(function, iterable, …)
参数:
function – 函数
iterable – 一个或多个序列
返回值:
Python 2.x 返回列表。
Python 3.x 返回迭代器。
示例:
python2:

def square(x) :               # 计算平方数
    return x ** 2
map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
>>>
[1, 4, 9, 16, 25]

python3:

def square(x) :            
    return x ** 2
map(square, [1,2,3,4,5])
>>>
<map at 0x1acd1c94be0>

python3可将map转换为list:

def square(x) :            # 计算平方数
    return x ** 2
A=list(map(square, [1,2,3,4,5]))   # 计算列表各个元素的平方
print(A)
>>>
[1, 4, 9, 16, 25]
print(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))  # 使用 lambda 匿名函数
print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])))
# 提供了两个列表,对相同位置的列表数据进行相加
print(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
print(list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])))
<map object at 0x000001ACD1CA7668>
[1, 4, 9, 16, 25]
<map object at 0x000001ACD1CA7710>
[3, 7, 11, 15, 19]

例子

list(map(str, [1, 2, 3]))的执行结果为['1','2','3']

reduce函数

python3中不能直接使用reduce(),需要先利用下面一行代码导入函数

from functools import reduce

reduce()函数语法
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据,用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

reduce(function, iterable[, initializer])

参数说明:

  • function – 函数,有两个参数
  • iterable – 可迭代对象
  • initializer – 可选,初始参数

reduce()举例

from functools import reduce

def f(x, y):
    return x + y

print(reduce(f, [1, 2, 3]))
print(reduce(f, [1, 2, 3], 0))

输出:

6
6

zip函数

描述:
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表

如果各个迭代序列的元素个数不一致,则返回长度与最短的对象相同

利用 * 号操作符,可以将元组解压为列表。
zip 语法:

zip([iterable, ...])

参数说明:
iterabl – 一个或多个迭代序列
实例:

# zip 的使用方法:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
 
>>> a1, a2 = zip(*zip(a,b))          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>

apply函数

功能: 是pandas中的函数,应用对象为pandas中的DataFrame或者Series。大致有两个方面的功能:一是直接对DataFrame或者Series应用函数,二是对pandas中的groupby之后的聚合对象apply函数
调用: apply(function,axis),function表明所使用的函数,axis表明对行或者列做运算
例子:

import numpy as np
a = np.random.randint(low=0,high=4,size=(2,4))
data = pd.DataFrame(a)
data.apply(lambda x:x*10)

输出:
在这里插入图片描述

总结

1、filter和map都是python内置的函数,可以直接调用,reduce在functools模块,apply在pandas模块
2、要过滤删减序列用filter;要对多个序列做函数运算用map;在pandas里面直接调用apply,尤其是聚合对象,当然还有agg,日后补充。reduce用得少。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值