[2, 4, 6, 8, 10]
除了传入一个可迭代对象这种常见的模式外,map()还支持传入多个可迭代对象。
map(func, iterable1, iterable2)
在传入多个可迭代对象的情况下,map()会依次从所有可迭代对象中依次取一个元素,组成一个元组列表,然后将元组依次传给 func;若可迭代对象的长度不一致,则会以 None 进行补上。
通过以下示例应该就比较容易理解。
plus = lambda x,y : (x or 0) + (y or 0)
map(plus, [1,2,3], [4,5,6])
[5, 7, 9]
map(plus, [1,2,3,4], [4,5,6])
[5, 7, 9, 4]
map(plus, [1,2,3], [4,5,6,7])
[5, 7, 9, 7]
在上面的例子中,之所以采用x or 0的形式,是为了防止None + int出现异常。
需要注意的是,可迭代对象的个数应该与 func 的参数个数一致,否则就会出现异常,因为传参个数与函数参数个数不一致了,这个应该比较好理解。
plus = lambda x,y : x + y
map(plus, [1,2,3])
Traceback (most recent call last):
File "", line 1, in
TypeError: () takes exactly 2 arguments (1 given)
另外,map()还存在一种特殊情况,就是 func 为 None。这个时候,map()仍然是从所有可迭代对象中依次取一个元素,组成一个元组列表,然后将这个元组列表作为结果进行返回。
map(None, [1,2,3,4])
[1, 2, 3, 4]
map(None, [1,2,3,4], [5,6,7,8])
[(1, 5), (2, 6), (3, 7), (4, 8)]
map(None, [1,2,3,4], [5,6,7])
[(1, 5), (2, 6), (3, 7), (4, None)]
map(None, [1,2,3,4], [6,7,8,9], [11,12])
[(1, 6, 11), (2, 7, 12), (3, 8, None), (4, 9, None)]
reduce()
reduce()函数的调用形式如下所示:
reduce(func, iterable[, initializer])
reduce()函数的功能是对可迭代对象(iterable)中的元素从左到右进行累计运算,最终得到一个数值。第三个参数 initializer 是初始数值,可以空置,空置为 None 时就从可迭代对象(iterable)的第二个元素开始,并将第一个元素作为之前的结果。
文字描述可能不大清楚,看下reduce()的源码应该就比较清晰了。
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
try:
initializer = next(it)
except StopIteration:
raise TypeError('reduce() of empty sequence with no initial value')
accum_value = initializer
for x in it:
accum_value = function(accum_value, x)
return accum_value
再加上如下示例,对reduce()的功能应该就能掌握了。
plus = lambda x, y : x + y
reduce(plus, [1,2,3,4,5])
15
reduce(plus, [1,2,3,4,5], 10)
25
filter()
filter()函数的调用形式如下:
filter(func, iterable)
filter()有且仅有两个参数,第一个参数是一个函数名,第二个参数是一个可迭代的对象,如列表、元组等。
filter()函数的调用形式与map()比较相近,都是将第二个参数(iterable)中的每一个元素分别传给第一个参数(func),依次执行函数得到结果;差异在于,filter()会判断每次执行结果的bool值,并只将bool值为true的筛选出来,组成一个新的列表并进行返回。
mode2 = lambda x : x % 2
filter(mode2, [1,2,3,4,5,6,7,8,9,10])
[1, 3, 5, 7, 9]
zip()
zip()函数的调用形式如下:
zip([iterable, ...])
zip()函数接收一个或多个可迭代对象,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
zip([1, 2, 3], ["a", "b", "c"])
[(1, 'a'), (2, 'b'), (3, 'c')]
dict(zip([1, 2, 3], ["a", "b", "c"]))
{1: 'a', 2: 'b', 3: 'c'}
dict(zip([1, 2, 3], ["a", "b"]))
{1: 'a', 2: 'b'}
打包元组个数与最短列表个数一致。
enumerate()
enumerate()函数的调用形式如下:
enumerate(iterable, [start=0])
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(['Spring', 'Summer', 'Fall', 'Winter'])
<enumerate object at 0x1031780>
list(enumerate(['Spring', 'Summer', 'Fall', 'Winter']))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
all()、any()
all()、any()函数的调用形式如下:
all(iterable)
any(iterable)
这两个函数比较简单,即判定一个可迭代对象是否全为 True 或者有为 True 的。
all([0, 1, 2])
False
any([0, 1, 2])
True
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。