python:内置函数zip、map、filter

内置函数

一、zip

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,zip的作用:压缩任意多个[0,N]参数,形成新的复合元组

a, b = [0, 1], [2, 3]
ab = zip(a, b)
print(list(ab))
# [(0, 2), (1, 3)]

每个tuple中包含的是原有序列中对应序号位置的元素,然后返回由这些tuples组成的list。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。

a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b,c)
print(list(zipped))
#[(1, 4, 4), (2, 5, 5), (3, 6, 6)]
l1 = ['a','b','c','e','f','g']
l2 = [1,2,3]
l3=['A','B','C']
L4=['','','niu']
#zip,就是把俩list,合并到一起,如果想同时循环2个list的时候,
for a,b,c,d in zip(l1,l2,l3,L4):
    print(a,b,c,d)
#结果  
# a 1 A 牛
# b 2 B 牛
# c 3 C niu

在所有参数长度相同的情况下,zip()与map()类似,没有参数的情况下zip()返回一个空list。

a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b,c)
print(list(zipped))
print(list(zipped))
#结果:
# [(1, 4, 4), (2, 5, 5), (3, 6, 6)]
# []

编写过示例代码之后会发现zip()之后的结果只能“使用一次”。如代码示例中所写,第二次使用list(ab_zip_obj))输出ab_zip_obj的内容是[],这是为什么呢?查看python3提供zip()的源代码,zip()实际上是一个生成器对象,故使用list()获取zip()结果时,已经相当于是完成一次迭代遍历,第二次再次使用list()时迭代已经结束,所以返回[]

二、map:

map函数会根据提供的函数对指定序列做映射。
map函数的定义:map(function, sequence[, sequence, ...]) -> list
通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个集合。
function可以理解为是一个一对一或多对一函数,map的作用是以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的list。

print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])))
#返回结果为: #[1, 4, 9, 16, 25]
def my(num):
    return str(num)
lis = [1,2,3,4,5,6,7,8,9]
res = list(map(my,lis))#map参数第一个是函数名,第二个是要循环的内容,返回结果是个map object地址,所以要用list强制转换下
print(res)#最终会将lis中的内容循环调用my函数,res=['1','2','3','4','5','6','7','8','9']
def my(num1,num2):
    return (num1,num2)
lis = [1,2,3,4,5]
lis1=['a','b','c','d']
res = list(map(my,lis,lis1))#map参数第一个是函数名,剩下的是要循环的内容,函数有几个参数,就要写入几个变量,返回结果是个map object地址,所以要用list强制转换下
print(res)#最终会将lis和lis1中的内容循环调用my函数,res=[(1,'a')(2,'b')(3,'c')(4,'d')]

三、filter

filter和map表面上看是一样的,都是循环调用函数,区别在于:filter是带有过滤性的,它会将要循环的内容代入函数后,结果为真的对应的内容返回

filter函数的定义:filter(function or None, sequence) -> list, tuple, or string
function是一个谓词函数,接受一个参数,返回布尔值True或False。
filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。
返回值的类型和参数sequence的类型相同
def is_even(x):
    return x & 1 != 0
print(list(filter(is_even, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])))
#[1, 3, 5, 7, 9]
def even(num):
    if num%2==0:
        return True
    return False
lis = [1,2,3,4,5,6,7,8,9]
res = filter(even,lis)
print('filter..',list(res))  #filter只保留,返回为真的数据。将lis循环滴入even函数后,能够返回True的lis中的数据,会被打印出来,所以最终结果就是2,4,6,8
#如果改程序用map的话,函数返回什么就会打印什么,最终结果是False,True,False,True.....
原文地址:https://www.cnblogs.com/hwtfamily/p/9084491.html