9.10. 生成器表达式

某些简单的生成器可以写成简洁的表达式代码,所用语法类似列表推导式,将外层为圆括号而非方括号。 这种表达式被设计用于生成器将立即被外层函数所使用的情况。 生成器表达式相比完整的生成器更紧凑但较不灵活,相比等效的列表推导式则更为节省内存。

示例:

  1. >>> sum(i*i for i in range(10)) # sum of squares
  2. 285
  3.  
  4. >>> xvec = [10, 20, 30]
  5. >>> yvec = [7, 5, 3]
  6. >>> sum(x*y for x,y in zip(xvec, yvec)) # dot product
  7. 260
  8.  
  9. >>> from math import pi, sin
  10. >>> sine_table = {x: sin(x*pi/180) for x in range(0, 91)}
  11.  
  12. >>> unique_words = set(word for line in page for word in line.split())
  13.  
  14. >>> valedictorian = max((student.gpa, student.name) for student in graduates)
  15.  
  16. >>> data = 'golf'
  17. >>> list(data[i] for i in range(len(data)-1, -1, -1))
  18. ['f', 'l', 'o', 'g']

备注

  • 1
  • 存在一个例外。 模块对象有一个秘密的只读属性 dict,它返回用于实现模块命名空间的字典;dict 是属性但不是全局名称。 显然,使用这个将违反命名空间实现的抽象,应当仅被用于事后调试器之类的场合。