以下主要是针对Python3中列表推导式和lambda表达式介绍和示例。
了解列表推导式。
列表推导式的官方定义:一种采用简洁的方式来处理序列中的全部或部分元素,并返回结果列表。
定义中的序列实际上是指可迭代对象。
我们先来看一个例子,创建一个整数1~6平方的列表。
示例代码:
lst = [x * x for x in range(1, 7)] # 列表推导式:循环获取范围1~6的整数,计算乘积后添加到新列表。
print(lst) # 显示输出结果为:[1, 4, 9, 16, 25, 36]
上方代码中,创建列表时使用了列表推导式。
后方的for循环能够从1~6的范围取出整数,前方的计算公式将取出的整数自身相乘。
每一次循环都会取出数字和计算乘积,添加到一个新的列表中。
除了迭代取出元素和设定计算方法形成列表,列表推导式还能够设置条件,满足条件的元素才能够经过计算添加到列表。
例如,我们只需要1~6中偶数的平方。
示例代码:
lst = [x * x for x in range(1, 7) if x % 2 == 0] # 列表推导式:循环获取范围1~6的整数,符合条件时,计算乘积后添加到新列表。
print(lst) # 显示输出结果为:[4, 16, 36]
上方代码中,我们加入了条件,当取出的元素取余2为0时,进行计算。
由此我们能够看出列表推导式的组成为:[元素(或计算方法) for循环(允许多个) if语句]
再来看个例子,从整数列表中取出小于3的元素,并从平方列表中取出对应的元素,组成算式列表。
期待显示输出结果为:[‘1²=1’, ‘2²=4’, ‘3²=9’]
示例代码:(错误示例)
number = [1, 2, 3, 4, 5, 6] # 整数列表
square = [1, 4, 9, 16, 25, 36] # 平方列表
lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3]
print(lst)
上方代码运行结果为:
运行的结果和我们期待的不一样。
实际上,在列表推导式中有多个循环时,会出现嵌套循环的效果,而不是同步循环的效果。
也就是说,当前面的循环取出第1个元素,后方的循环会进行一轮迭代;当前面的循环取出第2个元素,后方的循环又会进行一轮迭代;以此类推,直到前方的循环完成一轮迭代为止。(可以观察显示结果的列表元素和排列顺序)
那么,如何能够得到正确的结果呢?
我们需要增加条件,当前方循环取出元素的平方等于后方循环取出元素的时候,再添加到列表。
示例代码:(正确)
number = [1, 2, 3, 4, 5, 6] # 整数列表
square = [1, 4, 9, 16, 25, 36] # 平方列表
lst = ['{0}²={1}'.format(str(x), str(y)) for x in number for y in square if x <= 3 and x * x == y]
print(lst) # 显示输出结果为:['1²=1', '2²=4', '3²=9']
以上代码等同于下方代码。
示例代码:
number = [1, 2, 3, 4, 5, 6]
square = [1, 4, 9, 16, 25, 36]
lst = [] # 此部分用列表推导式替代
for x in number: # 此部分用列表推导式替代
for y in square: # 此部分用列表推导式替代
if x <= 3 and x * x == y: # 此部分用列表推导式替代
lst.append('{0}²={1}'.format(str(x), str(y))) # 此部分用列表推导式替代
print(lst)
通过上方代码,大家可以看出,创建同样的列表,使用列表推导式更加简洁。
了解lambda表达式。
lambda表达式的官方定义:一个匿名内联函数,由一个表达式组成,在函数被调用时求值。
创建lambda函数的语法: lambda [参数] : 表达式
lambda表达式可用于函数的参数。
例如,我们从一个整数列表中筛选所有的偶数,可以使用filter函数。
这个函数的参数是function和iterable,也就是1个函数和1个可迭代对象。
示例代码:
def iseven(n): # 定义验证数字是否偶数的函数
if n % 2 == 0: # 判断参数是否为偶数
return True # 符合条件返回真值
else:
return False #否则返回假值
lst = list(filter(iseven, number)) # 通过函数iseven对每个number的元素进行验证,验证为真的保留,并将最终结果转换为list。
print(lst) # 显示输出结果为:[2, 4, 6]
从上面的示例中,我们能够看到函数(iseven)可以作为另外一个函数(filter)的参数,并通过这个函数对其它参数进行处理。
filter函数会把number的每一个元素作为函数iseven的参数传入,进行计算,并将返回结果。
不过这样的代码,很明显看上去有些复杂。
我们可以使用lambda表达式这种匿名函数作为参数,起到同样的作用。
number = [1, 2, 3, 4, 5, 6] # 整数列表
lst = list(filter(lambda x: x % 2 == 0, number)) # 通过lambda表达式对每个number的元素进行验证,并将所有验证结果转换为list。
print(lst) # 显示输出结果为:[2, 4, 6]
上方代码中,每一个number的元素都会作为lambda表达式的参数(冒号前面的x)进行验证,如果符合条件(冒号后方的表达式),则会保留元素。
很显然,在这种情况下通过lambda表达式可以让代码非常简化。