filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
>>> list(filter(lambda x:x%2,[1,2,3,4])) [1, 3] >>> list(filter(lambda x:x>='A' and x <='Z',"AaBbCc")) ['A', 'B', 'C'] 栗子: >>> def is_odd(n): ... return n%2==1 ... >>> tmplist = filter(is_odd,[1,2,3,4,5,6,7,8,9,10]) >>> newlist = list(tmplist) >>> print(newlist) [1, 3, 5, 7, 9]
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
例1: >>> list(map(lambda x:str(x)+"*",[1,2,3,4])) ['1*', '2*', '3*', '4*'] 例2: >>> list(map(lambda x:x ** 2,[1,2,3,4])) #使用lambda匿名函数 [1, 4, 9, 16] 例3: >>> def square(x): ... return x**2 ... >>> map(square,[1,2,3,4]) #py3map返回迭代器 <map object at 0x000001199BF08A90> >>> list(map(square,[1,2,3,4])) [1, 4, 9, 16] 例4: >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) <map object at 0x000001199BF08A58> >>> list(map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])) [3, 7, 11, 15, 19]
lambda匿名函数
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法:lambda [arg1 [,arg2,.....argn]]:expression
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值
>>> def func(x): ... return x**2 ... >>> print(func(4)) 16 #上面函数例子用lambda实现: >>> g = lambda x:x**2 >>> print(g(4)) 16 #混合使用栗子: >>> filter(lambda x:True if x>0 else False,[1,2,-1,-2]) <filter object at 0x0000000003F54D68> >>> list(filter(lambda x:True if x>0 else False,[1,2,-1,-2])) [1, 2]
reduce
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
语法:reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
>>> from functools import reduce >>> def add(x,y): ... return x+y ... >>> reduce(add,[1,2,3,4]) 10 #相当于: >>> reduce(lambda x,y:x+y,[1,2,3,4]) 10
>>> s=[1,4,7,9,10] >>> s[:] [1, 4, 7, 9, 10] >>> s[::-1] [10, 9, 7, 4, 1]
列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
>>> [x+1 for x in range(1,10,2)] [2, 4, 6, 8, 10] >>> [x*y for x in range(1,10,2) for y in range(3)] [0, 1, 2, 0, 3, 6, 0, 5, 10, 0, 7, 14, 0, 9, 18] 列表推导式可以使用复杂表达式或嵌套函数: >>> [str(round(355/113,i)) for i in range(1,6)] ['3.1', '3.14', '3.142', '3.1416', '3.14159'] 集合也支持推导式: >>> a = {x for x in 'abracadabra' if x not in 'abc'} >>> a {'r', 'd'}
字典推导可以用来创建任意键和值的表达式词典: >>> {x: x**2 for x in (2, 4, 6)} {2: 4, 4: 16, 6: 36}