内置函数
一、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.....