codeAB 2019-11-01
python六剑客map、filter、reduce、lambda、切片、推导列表
python最有特点的一行代码,所有代码均可以借用一行代码(目标)
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
举例说明,比如我们有一个函数f(x)=x%2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现
一个最简单的例子,如基于f(x) = x²,map()作用于list [1, 2, 3, 4, 5, 6, 7, 8, 9]后的结果如下:返回结果仍为list
print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
# output
[1, 4, 9, 16, 25, 36, 49, 64, 81]
2、filter 两个参数(自定义函数名,列表)对列表中的元素过滤后输出
Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
选择大于等于5的数字
print(list(filter(lambda x:int(x)>=5,"123456789")))
print(list(filter(lambda x:int(x)>=5,[1, 2, 3, 4, 5, 6, 7, 8, 9])))
# output
[‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘]
[5, 6, 7, 8, 9]
3、reduce (函数名,列表)将列表中的元素逐一累计
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
python3.x中需要导包rom functools import reduce
一行代码实现累加、阶乘
from functools import reduce
# 累加
print(reduce(lambda x,y:x+y, [1,2,3,4,5]))
# 阶乘
print(reduce(lambda x,y:x*y,range(1,5)))
# output
15
24
4、lambda函数
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
语法:变量:运算表达式 如 x:x+1
引用: 函数名(变量赋值) num(1)
# 一个参数lambda函数
num = lambda x: x+1
print(num(2))
# 两个参数lambda函数
nums = lambda x,y:x+y
print(nums(2,3))
# output
3
5
5、推导列表
通过for 语句处理表达式里面的变量,如果还要加条件,就加if条件
列表推导式是Python基础,好用,而又非常重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以把列表推导式理解成一种集合了变换和筛选功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变。
li = [1,2,3,4,5,6,7,8,9]
print([x**2 for x in li])
print([x**2 for x in li if x>5])
# 字典推导
print(dict([(x,x*10) for x in li]))
print([ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ])
vec=[2,4,6]
vec2=[4,3,-9]
sq = [vec[i]+vec2[i] for i in range(len(vec))]
print(sq)
print([x*y for x in [1,2,3] for y in [1,2,3]])
testList = [1,2,3,4]
def mul2(x):
return x*2
print([mul2(i) for i in testList])
打印结果
[1, 4, 9, 16, 25, 36, 49, 64, 81]
[36, 49, 64, 81]
{1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90}
[(5, 9), (7, 9), (9, 9)]
[6, 7, -3]
[1, 2, 3, 2, 4, 6, 3, 6, 9]
[2, 4, 6, 8]
与zip结合
将a,b两个列表中相对应得值组合起来,形成一个新列表。例如包含x坐标的列表与y坐标的列表形成相对应的点坐标[x, y]列表。
a= [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
xy = [[x, y] for x, y in zip(a, b)]
print(xy)
# output
[[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]
6、切片
我们基本上都知道Python的序列对象都是可以用索引号来引用的元素的,索引号可以是正数由0开始从左向右,也可以是负数由-1开始从右向左。
在Python中对于具有序列结构的数据来说都可以使用切片操作,需注意的是序列对象某个索引位置返回的是一个元素,而切片操作返回是和被切片对象相同类型对象的副本。
# 如下面的例子,虽然都是一个元素,但是对象类型是完全不同的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0]
0
>>> alist[0:1]
[0]
通常一个切片操作要提供三个参数 [start_index: stop_index: step]
start_index是切片的起始位置
stop_index是切片的结束位置(不包括)
step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。
当 step 是正数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从左向右截取,
start_index和stop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置
必须在list[start_index]元素的【逻辑】位置右边,否则取不出元素。
# 比如下面的几个例子都是合法的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[1:5]
[1, 2, 3, 4]
>>> alist[1:-1]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> alist[-8:6]
[2, 3, 4, 5]
当 step 是负数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从右向左截取,
start_index和stop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置
必须在list[start_index]元素的【逻辑】位置左边,否则取不出元素。
# 比如下面的几个例子都是合法的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[-1: -5: -1]
[9, 8, 7, 6]
>>> alist[9: 5: -1]
[9, 8, 7, 6]
>>> alist[-1:1:-1]
[9, 8, 7, 6, 5, 4, 3, 2]
>>> alist[6:-8:-1]
[6, 5, 4, 3]
一些常用的切片操作
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 取前一部分
>>> alist[:5][0, 1, 2, 3, 4]
># 取后一部分
>>>> alist[-5:][5, 6, 7, 8, 9]
# 取偶数位置元素
>>> alist[::2][0, 2, 4, 6, 8]
# 取奇数位置元素
>>> alist[1::2][1, 3, 5, 7, 9]
# 浅复制,等价于list.copy()更加面向对象的写法
>>> blist = alist[:]
>>> blist[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 返回一个逆序列表,推荐reversed(list)的写法,更直观易懂。
>>> alist[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 在某个位置插入多个元素
>>> alist[3:3] = [‘a‘,‘b‘,‘c‘]
>>> alist[0, 1, 2, ‘a‘, ‘b‘, ‘c‘, 3, 4, 5, 6, 7, 8, 9]
# 在开始位置之前插入多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:0] = [‘a‘,‘b‘,‘c‘]
>>> alist[‘a‘, ‘b‘, ‘c‘, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 替换多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0:3] = [‘a‘,‘b‘,‘c‘]
>>> alist[‘a‘, ‘b‘, ‘c‘, 3, 4, 5, 6, 7, 8, 9]
# 删除切片>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del alist[3:6]
>>> alist[0, 1, 2, 6, 7, 8, 9]
Python的切片操作非常灵活、强大、简洁、优雅,如果能全面掌握和正确运用将会对你的编写Python代码水平会有很大提升。