学习python笔记一:列表解析与生成器表达式的比较、应用与建议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maosilu_ICE/article/details/79883889

先看一道数学题:

'''

计算<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]

'''


猜你喜欢

转载自blog.csdn.net/maosilu_ICE/article/details/79883889