Python骚操作从列表推导和生成器表达式出发

列表推导

Python语言魅力在于简洁,这能从最常见的创建列表体现出来,比如我们想把字符串"abc"转换成新列表["a", "b", "c"],常规写法:


  1. symbols = "abc" 
  2. codes = [] 
  3. for symbol in symbols: 
  4.     codes.append(symbol) 
  5. print(codes)  # ["a""b""c"

用到了for循环和列表append方法。实际上可以不用append方法,直接:


  1. symbols = "abc" 
  2. codes = [symbol for symbol in symbols] 

这叫做列表推导,是更加Pythonic的写法。

无论是编写效率还是可阅读性,列表推导都更胜一筹,可以说是构建列表的快捷方式。但是不能滥用,通用原则是,如果列表推导的代码超过了两行,就要考虑用append了。这不是规定,完全可以凭借自我喜好来选择。

笛卡尔积是指多个序列中元素所有组合,我们用列表推导来实现笛卡尔积:


  1. colors = ["black""white"
  2. sizes = ["S""M""L"
  3. tshirts = [(color, sizefor color in colors for size in sizes] 

一行代码搞定!Life is short,use Python,list comprehension is wonderful,amazing。

注意这行代码有两个for循环,等价于:


  1. for color in colors: 
  2.     for size in sizes: 

运行结果是:


  1. [('black''S'), ('black''M'), ('black''L'), ('white''S'), ('white''M'), ('white''L')] 

如果换一下顺序:


  1. [(color, sizefor color in colors for size in sizes] 

等价于:


  1. for size in sizes: 
  2.     for color in colors: 

运行结果是不同的,观察第2个元素:


  1. [('black''S'), ('white''S'), ('black''M'), ('white''M'), ('black''L'), ('white''L')] 

生成器表达式

一般接触到生成器时,都要讲yield关键字,看似有点复杂,然而却很简单,生成器就像列表推导一样,只不过是用来生成其他类型序列的,比如元组:


  1. symbols = "abc" 
  2. codes = (symbol for symbol in symbols) 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章