列表解析和生成表达式
如果想通过操作和处理一个序列来创建一个新的列表时
可使用列表解析和生成表达式
当求1~10内的被3或者5整除的数的和时
nums=[] for i in range(1,10): if i%3 == 0 or i%5 == 0 : nums.append(i) print(nums) print(sum(nums))
列表解析表达式为:
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
In [2]: [i*10 for i in range(10)]
Out[2]: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
In [8]: [i*10 for i in range(10) if i%2 == 0]
Out[8]: [0, 20, 40, 60, 80]
使用列表解析来解决之前问题
In [11]: [i for i in range(1,10) if i%3 == 0 or i%5 == 0]
Out[11]: [3, 5, 6, 9]
In [12]: sum([i for i in range(1,10) if i%3 == 0 or i%5 == 0])
Out[12]: 23
生成器表达式
(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)
生成器表达式并不真正创建数字列表,而是返回一个生成器,
这个生成器在每次计算出一个条目后,把这个条目 “产生” (yield)出来。
生成器表达式使用了"惰性计算" (lazy evaluation,也有翻译为延迟求值)
只有检索时才被赋值,所以子啊列表较长的情况下使用内存更有效
In [17]: (i for i in range(1,1000) if i%3 == 0 or i%5 == 0) Out[17]: <generator object <genexpr> at 0x00000035F36318E0> sum((i for i in range(1,10) if i%3 == 0 or i%5 == 0)) In [19]: g=(i for i in range(1,10) if i%3 == 0 or i%5 == 0) In [20]: for i in g: ...: print(i) ...: 3 5 6 9