先看一道数学题:
'''
计算<1000的,能被3或者5整除的所有自然数的和'''
x = range(1000)
# 第一种方法
li = []
for i in x :
if i%3==0 or i%5==0:
li.append(i)
s = sum(li)
print(s)
# 第二种方法:列表解析
print(sum([i for i in x if i%3==0 or i%5==0]))
# 第三种方法:生成器表达式,不会占用太多的内存空间
'''
生成器表达式:
A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them.
生成器表达式并不真正创建数字列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。
生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需要调用(call by need)的方式翻译为惰性更好一些),只有在检索时才能被赋值(evaluated),
所以在列表比较长的情况下使用内存上更有效。
'''
print(sum((i for i in x if i%3==0 or i%5==0)))
'''
建议:
(1)当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性。代码如下:
for item in sequence :
process(item)
(2)当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析。
例如复制一个列表时,使用:L1 = list(L) 即可
不必使用:L1 = [x for x in L]
(3)如果需要对每个元素都调用并且返回结果时,应使用 L1 = map(f, L),而不是 L1 = [f(x) for x in L]
'''