列表推导是Python语言中用来构建列表的一种快捷便利的方式,而生成器表达式可以用来构建其他类型的序列。它们的使用,可以使代码更具有可读性和更有效率。
举一个例子,将一个字符串的元素转化为新的列表。
第一种方法,使用for循环:
>>> string='hello,
>>> new_list=[]
>>> for s in string:
... new_list.append(s)
...
>>> new_list
['h', 'e', 'l', 'l', 'o', ',', 'p', 'y', 't', 'h', 'o', 'n']
第二种方式,使用列表推导:
>>> string='hello,python'
>>> new_list=[s for s in string]
>>> new_list
['h', 'e', 'l', 'l', 'o', ',', 'p', 'y', 't', 'h', 'o', 'n']
以上两种构建列表的方式,哪一种更简单,更具可读性已经一目了然。
不过,虽然列表推导如此简捷,但也不可以被滥用。一般而言,当列表推导的代码过长时(代码超过两行),就破坏了其简短可读的原则。此时,并不适合使用列表推导。
虽然也可以用列表推导来构建元组等其他序列,但生成器表达式却是更好的选择。这是因为生成器表达式遵循了迭代器协议,能逐个的产生元素,而不是一次性构建整个序列。这显然要比列表推导节省内存。
生成器表达式的语法和列表推导差不多。如下:
>>> string='hello,python'
>>> tuple(s for s in string)
('h', 'e', 'l', 'l', 'o', ',', 'p', 'y', 't', 'h', 'o', 'n')