Python列表推导式与生成器表达式详解
本文详细解析Python中列表推导式和生成器表达式的核心用法。通过对比传统循环与推导式写法,演示如何高效进行数据转换、条件过滤及三元运算。同时介绍生成器表达式在节省内存方面的优势,涵盖元组、数组初始化及笛卡尔积生成等实际应用场景,帮助开发者写出更简洁高效的Python代码。
列表推导式基础用法
首先观察以下代码示例:
chars = "abcd"
tmp = []
for char in chars:
tmp.append(ord(char))
print(tmp)
这是传统的实现方式,旨在将字符串中的每个字符转换为对应的ASCII码,并依次存入临时数组tmp中。
使用列表推导式可以简化上述过程:
tmp = [ord(char) for char in chars]
运行结果输出为:[97,98,99,100]
列表推导式中的条件判断
在列表推导式中,还可以结合if和else语句进行条件处理。
当仅使用if条件时:
chars = "abcd"
tmp = [ord(char) for char in chars if ord(char)>=98]
print(tmp)
运行结果输出为:['b','c','d']
此外,还可以利用filter和map函数实现相同的功能:
tmp = list(filter(lambda x:x>=98,map(ord,chars)))
该语句的含义是:首先使用map函数遍历chars中的每个字符,并通过ord函数获取其ASCII码;接着使用filter函数筛选出大于等于98的ASCII码值,最后将这些符合条件的值存入列表。其中,lambda x:x>98定义了一个匿名函数用于判断条件。
当同时存在if和else时:
chars = "abcd"
tmp = [True if ord(char)>=98 else False for char in chars]
print(tmp)
运行结果输出为:[False, True, True, True]
通常情况下,建议保持列表推导式的简短性以提高代码可读性。
利用列表推导式计算笛卡尔积
接下来看另一个示例:利用列表推导式计算笛卡尔积,这里以衣服的颜色和尺寸组合为例。
colors = ["black","white"]
sizes = ["S","M","L"]
tshirts = [(color,size) for color in colors for size in sizes]
print(tshirts)
生成器表达式的应用与优势
生成器表达式可用于生成其他数据类型的序列。虽然列表推导式也能用于初始化元组、数组等其他类型,但生成器表达式是更优的选择。原因在于生成器表达式遵循迭代器协议,能够逐个产生元素,而非一次性构建完整的列表,从而节省内存。
生成器表达式的语法与列表推导式类似,区别仅在于将方括号改为圆括号。
以下是使用生成器表达式生成元组和数组的例子:
chars = "abcd"
tmp = tuple(ord(char) for char in chars)
print(tmp)
运行结果输出为:(97, 98, 99, 100)
import array
chars = "abcd"
a = array.array("I",(ord(char) for char in chars))
print(a)
运行结果输出为:array('I', [97, 98, 99, 100])
array类的构造方法需要提供两个参数,第一个参数指定数组中元素的存储格式。如果生成器表达式是唯一的参数,则无需额外括号;但在本例中并非唯一参数,因此必须使用括号将其包裹。
colors = ["black","white"]
sizes = ["S","M","L"]
for tshirt in ("%s %s" % (c,s) for c in colors for s in sizes):
print(tshirt)
运行结果输出为:
black S black M black L white S white M white L
以上便是本次介绍的所有相关知识点,感谢大家的学习以及对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









