一、ruduce函数
reduce(function, sequence[, initial]) -> value 其中包含三个参数,第一个是传入的函数,第二个是是一个可迭代类型的参数,第三个是初始值
情况一:不传入第三个参数,即不传入初始值,默认会以 可迭代类型的参数的 第一个参数作为初始值。
比如下面的操作:
我们这里选取下面的代码讲解:
from functools import reduce
print( reduce( lambda x,y:x-y,range(-5,-1) ) )
这里我们不传入初始值的时候,结果是 4,为什么呢,它底层的执行步骤是这样的
初始值是可迭代类型第一个值,即 -5
第一步:-5-(-4)得到-1
第二步:-1-(-3)得到 2
第三步: 2-(-2)得到 4
结果 4
如果是下面的代码,步骤解析如下:
from functools import reduce
print( reduce( lambda x,y:x+y, range(-5,-1) ) )
第一步:-5+(-4)=(-9)
第二步:(-9)+(-3)=(-12)
第三步:(-12)+(-2)=(-14)
结果 -14
情况二:传入第三个参数,即传入初始值
比如下面的操作:
from functools import reduce
print( reduce( lambda x,y:x-y, range(-5,-1) ,0 ) )
运行得到的结果是 14
第一步:0-(-5)=5
第二步:5-(-4)=9
第三步:9-(-3)=12
第四步:12-(-2)=14
结果 14
如果是下面的代码,
from functools import reduce
print(reduce(lambda x,y:x+y,range(-5,-1),0))
步骤解析如下:
0+(-5)=-5
-5+(-4)=(-9)
(-9)+(-3)=(-12)
(-12)+(-2)=(-14)
结果 -14
二、map函数
实际上map函数就相当于for循环遍历列表
map(function, iterable, ...)
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
实例
以下实例展示了 map() 的使用方法:
三、案例:
求 100 内的所有质数
from functools import reduce
print( reduce( lambda mylist,y:not 0 in map(lambda x:y%x,mylist) and mylist+[y] or mylist,range(2,100),[ ] ) )
该表达式reduce函数传入三个参数,第一个是匿名函数,第二个是range(2,100),第三个是 [ ]
首先先讲解 condition and expr1 or expr2
如果 condition 为真,expr1 为真,expr2不做处理,直接返回 expr1
如果 condition 为假,expr1 不做处理,直接返回 expr2
如果 condition 为真,expr1 为假,直接返回 expr2
这里要注意:如果 expr1 表达式为真,那么 condition and expr1 or expr2 可以简化为
condition 为真,返回 expr1
condition 为假,返回 expr2
即相当于 if else 语句
讲解代码
其中,reduce的函数的初始值是 空列表 [ ] mylist,其中 not 0 in map(lambda x:y%x,mylist) 表示数字y 能否被 mylist 中任何一个数字整除,如果整除的结果是非0,添加到mylist中,即执行mylist+[y] 得到一个新列表;如果是0,则仍然是mylist
举例:range中第一个数字是2, 2%[]列表是结果是[],即非0,把2加到mylist中,
接着第二个数字是3,3%mylist中的数字每一个数字,而mylist此时只有数字2,即3%2,结果非0,把3加到mylist中