列表解析和生成表达式

列表解析和生成表达式
如果想通过操作和处理一个序列来创建一个新的列表时
可使用列表解析和生成表达式
当求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