有时简单的生成器可以用简洁的方式调用,就像不带中括号的链表推导式。这些表达式是为函数调用生成器而设计的。生成器表达式比完整的生成器定义更简洁,但是没有那么多变,而且通常比等价的链表推导式更容易记。
例如:
>>>sum(i*i for i in range(10)) # sum of squares
285
>>>xvec = [10, 20, 30]
>>>yvec = [7, 5, 3]
>>>sum(x*y for x,y in zip(xvec, yvec)) # dot product
260
>>>from math import pi, sin
>>>sine_table = {x: sin(x*pi/180) for x in range(0, 91)}
>>>unique_words = set(word for line in page for word in line.split())
>>>valedictorian = max((student.gpa, student.name) for student in graduates)
>>>data = 'golf'
>>>list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
Footnotes
[1] 有一个例外。模块对象有一个隐秘的只读对象,名为 __dict__ ,它返回用于实现模块命名空间的字典,命名 __dict__ 是一个属性而非全局命名。显然,使用它违反了命名空间实现的抽象原则,应该被严格限制于调试中。
列表推导式和生成器表达式以及字典推导式 通常被视为Python中函数式编程的一部分,列表推导允许您使用包含较少代码的for循环创建列表。
用[] 包围
用{} 包围
生成器表达式允许在没有yield关键字的情况下即时创建生成器。
语法和概念类似于列表推导的语法和概念:用()包围