python中列表表达式和lamda函数的使用

什么是列表解析式?

列表解析式是将一个列表(实际上适用于任何可迭代对象(iterable))转换成另一个列表的工具。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。

如果你熟悉函数式编程(functional programming),你可以把列表解析式看作为结合了filter函数与map函数功能的语法糖:

numbers = [1,2,3,4,5,6,7]
doubled_odds = [n * 2 for n in numbers if n % 2 == 1]
print(doubled_odds)
[2, 6, 10, 14]

从循环到解析式

每个列表解析式都可以重写为for循环,但不是每个for循环都能重写为列表解析式。

from urllib.parse import quote
citys = ['安徽','广东','江苏','北京','浙江']
for city in citys:
    print('https://www.baidu.com/s?wd=%s'% quote(city))
https://www.baidu.com/s?wd=%E5%AE%89%E5%BE%BD
https://www.baidu.com/s?wd=%E5%B9%BF%E4%B8%9C
https://www.baidu.com/s?wd=%E6%B1%9F%E8%8B%8F
https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC
https://www.baidu.com/s?wd=%E6%B5%99%E6%B1%9F

你可以将上面的for循环改写成这样的列表解析式:

urls_list =  ['https://www.baidu.com/s?wd=%s' % quote(city) for city in citys]
print('\n'.join(urls_list))
https://www.baidu.com/s?wd=%E5%AE%89%E5%BE%BD
https://www.baidu.com/s?wd=%E5%B9%BF%E4%B8%9C
https://www.baidu.com/s?wd=%E6%B1%9F%E8%8B%8F
https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC
https://www.baidu.com/s?wd=%E6%B5%99%E6%B1%9F

嵌套循环
那么嵌套循环(nested loop)又该怎样改写为列表解析式呢?

下面是一个拉平(flatten)矩阵(以列表为元素的列表)的for循环:

flattened = []
for row in matrix:
    for n in row:
        flattened.append(n)

下面这个列表解析式实现了相同的功能:

flattened = [n for row in matrix for n in row]

列表解析式中的嵌套循环读起来就有点绕口了。

注意:我本能地会想把这个列表解析式写成这样:


flattened = [n for n in row for row in matrix]

但是这行代码是错误的。这里我不小心颠倒了两个for循环的顺序。正确的代码是之前那个。

如果要在列表解析式中处理嵌套循环,请记住for循环子句的顺序与我们原来for循环的顺序是一致的。

当然还可以进行判断:

断行前:

doubled_odds = [n * 2 for n in numbers if n % 2 == 1]
断行后:

doubled_odds = [
    n * 2
    for n in numbers
    if n % 2 == 1
]

匿名函数lambda的用法

Python中,lambda函数也叫匿名函数,及即没有具体名称的函数,它允许快速定义单行函数,类似于C语言的宏,可以用在任何需要函数的地方。这区别于def定义的函数
lambda与def的区别:

1)def创建的方法是有名称的,而lambda没有。

2)lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)。

3)lambda只是一个表达式,而def则是一个语句。

4)lambda表达式” : “后面,只能有一个表达式,def则可以有多个。

5)像if或for或print等语句不能用于lambda中,def可以。

6)lambda一般用来定义简单的函数,而def可以定义复杂的函数。

7)lambda函数不能共享给别的程序调用,def可以。

lambda语法格式:

lambda 变量 : 要执行的语句m

# 1、单个参数的:
g = lambda x : x ** 2
print(g(3))
# 2、多个参数的:
s = lambda x, y, z : (x + y) ** z
print(s(1,2,2))
9
9

lambda表达式会返回一个函数对象,如果没有变量接受这个返回值的话,它很快就会被丢弃。也正是由于lambda只是一个表达式,所以它可以直接作为list和dict的成员。如:

list_a = [lambda a: a**3, lambda b: b**3]
print(list_a[0])
g = list_a[0]
g(2)
<function <lambda> at 0x0000000005BFCAE8>





8

这里就没法用def语句代替了,语句是不能嵌套在里面的。lambda表达式中,冒号前面是参数,可以有多个,用逗号分隔,冒号右边是返回值。
lambda具体用不用,视情况而定吧,有时候使用lambda可以简化代码。



   转载规则


《python中列表表达式和lamda函数的使用》 旋律JOJO哒 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录