列表生成式和生成器表达式

列表生成式

列表生成式基本形式

# 列表生成式基本形式
l = ["egg%i" %i for i in range(50) if i < 26]
print(l)

列表生成式应用

# 列表生成式
# l = ["egg%i" %i for i in range(50) if i < 26]
# print(l)

# 列表生成式拼接文件名,运行结果
# ['c:\\egon\\egeon.txt',
#  'c:\\egon\\a\\a.txt',
#  'c:\\egon\\a\\alex.txt',
#  'c:\\egon\\a\\b\\b.txt', 
#  'c:\\egon\\a\\b\\zou.txt', 
#  'c:\\egon\\a\\b\\c\\c.txt']

import os
g = os.walk("c:\\egon")
l = ["%s\\%s" % (i[0], j)for i in g for j in i[2]]
print(l)

# 等价语句
# l = []
# for i in g:
#     for j in i[2]:
#         info = "%s\\%s" % (i[0] , j)
#         l.append(info)
# print(l)

列表生成式计算商品价格

# 列表生成式计算商品价格
# 在文件b.txt中有如下商品价格
# apple 10 3
# tesla 100000 1
# mac 3000 2
# lenovo  30000 3
# chicken 10 3
# 字符串分割后["apple", 10, 3]

cart = []      # 应付价格列表
with open("b.txt") as f:
    for line in f:
        info = line.strip().split()
        res = int(info[-1]) * int(info[-2])
        cart.append(res)
print(cart)          # [30, 100000, 6000, 90000, 30]
print(sum(cart))     # 196060


# 列表生成器
with open("b.txt") as f:
    cart = [int(line.split()[-1]) * int(line.split()[1]) for line in f]   # 应付价格列表
print(cart)   # [30, 100000, 6000, 90000, 30]
print(sum(cart))  # 196060

生成器表达式

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器应用1

def test():
    for i in range(4):
        yield i

g=test()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))   # [0, 1, 2, 3],执行此步骤时,此时g1生成器指针已经走到最后。下次调用无结果。
print(list(g2))   # []

总结
生成器表达式的优点:

1.生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

2.生成器还能有效提高代码可读性
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存<>br

posted @ 2017-04-12 20:28  pirate邹霉  阅读(126)  评论(0编辑  收藏  举报