列表推导
Python语言魅力在于简洁,这能从最常见的创建列表体现出来,比如我们想把字符串"abc"转换成新列表["a", "b", "c"],常规写法:
- symbols = "abc"
- codes = []
- for symbol in symbols:
- codes.append(symbol)
- print(codes) # ["a", "b", "c"]
用到了for循环和列表append方法。实际上可以不用append方法,直接:
- symbols = "abc"
- codes = [symbol for symbol in symbols]
这叫做列表推导,是更加Pythonic的写法。
无论是编写效率还是可阅读性,列表推导都更胜一筹,可以说是构建列表的快捷方式。但是不能滥用,通用原则是,如果列表推导的代码超过了两行,就要考虑用append了。这不是规定,完全可以凭借自我喜好来选择。
笛卡尔积是指多个序列中元素所有组合,我们用列表推导来实现笛卡尔积:
- colors = ["black", "white"]
- sizes = ["S", "M", "L"]
- tshirts = [(color, size) for color in colors for size in sizes]
一行代码搞定!Life is short,use Python,list comprehension is wonderful,amazing。
注意这行代码有两个for循环,等价于:
- for color in colors:
- for size in sizes:
运行结果是:
- [('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
如果换一下顺序:
- [(color, size) for color in colors for size in sizes]
等价于:
- for size in sizes:
- for color in colors:
运行结果是不同的,观察第2个元素:
- [('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
生成器表达式
一般接触到生成器时,都要讲yield关键字,看似有点复杂,然而却很简单,生成器就像列表推导一样,只不过是用来生成其他类型序列的,比如元组:
- symbols = "abc"
- codes = (symbol for symbol in symbols)