Python小技巧之列表推导式到匿名函数
最近又看了一遍python的基础知识,所谓温故而知新,哈哈哈,所以在这里写下自己的一些见解,我觉得在实战过程中还是非常有用的一些小技巧,也分享给大家,如果写的不好,请大家留言或者私信我,一起学习一下!
下面进入正题:
列表推导式
个人觉得列表推导式非常强大,在实战中也经常用到
所谓列表推导式就是使用列表结合for循环快速创建一个新的列表,列表推导式返回的是一个列表类型
Python在执行列表推导式时,会对可迭代对象 L 进行迭代,将每一次迭代的值赋给循环变量 x ,然后收集变量表达式 x ** 2 的计算结果,最终由这些结果构成了新的列表,也就是列表推导式所返回的值。
只要支持 for 循环进行迭代的对象,都可以对它使用列表推导式。
举例(找出列表中所有’a’的元素,并添加到新列表)
list = ['a','b','a','d','e','a','g']
result = []
for i in list:
if i == 'a':
result.append(i)
print(result)
结果
['a', 'a', 'a']
那么有了列表推导式,我们可以改写成
print([i for i in list if i == 'a'])
结果
['a', 'a', 'a']
如果我们列表中的元素还需要做其他运算,比如:
def add(parms):
res = ''.join(parms + 'pple')
return res
再结合上面的列表推导式
print([add(i) for i in list if i == 'a'])
结果
['apple', 'apple', 'apple']
列表推导式的一般语法可以表示为 [ expression for item in list ],如果你希望加上一些布尔型条件语句,那么上面的语法可以修改为 [ expression for item in list if conditional ] 或者
[
expression for x in X [if condition]
for y in Y [if condition]
…
for n in N [if condition]
]
举例(为了方便好看,写成下面格式)
print(
[
(x, y, z) for x in range(6) if x % 3 == 0
for y in range(6) if y % 3 == 1
for z in range(6) if z % 2 ==1
])
结果
[(0, 1, 1), (0, 1, 3), (0, 1, 5), (0, 4, 1), (0, 4, 3), (0, 4, 5), (3, 1, 1), (3, 1, 3), (3, 1, 5), (3, 4, 1), (3, 4, 3), (3, 4, 5)]
Lambda 和 Map
Lambda 是一种匿名函数,也非常好用的,它不需要定义函数名,可以做最直观的运算
还是以上面的例子为例
def add(parms):
res = ''.join(parms + 'pple')
return res
直接写成
add = (lambda parms: ''.join(parms+ 'pple'))
print(add('a'))
结果
apple
那么我们为什么要用上面的表达式?很大一部分原因在于,当我们想执行一些简单运算时,可以不需要定义真实函数就能完成。例如排序列表元素,一种直观的方法可以使用 sorted() 方法:
print(sorted([0, -3, 3, -2, 2], key=lambda x: x ** 2, reverse=True))
结果
[-3, 3, -2, 2, 0]
上面就是根据每个元素的二次方进行从大到小的排列
Map 是一个简单的函数,属于python的内置函数,它可以将某个函数应用到其它一些序列元素,例如列表
最简单的例子
x = map(lambda x: x ** 2,[1,2,3])
print(list(x))
结果
[1, 4, 9]
注意:map函数返回的迭代器只能迭代一次,迭代之后会自动清空
x = map(lambda x: x ** 2,[1,2,3])
print(list(x))
print(list(x))
结果
[1, 4, 9]
[]
上面输出了两次,第一次有数据,第二次为空,所以我们在开发过程中,将map函数返回的迭代器保存转为list,可以多次使用
x = map(lambda x: x ** 2,[1,2,3])
y = list(x)
print(y)
print(y)
结果
[1, 4, 9]
[1, 4, 9]
有兴趣的朋友可以看看源码