# -*- encoding: utf-8 -*-
import os
'''
第9条: 用生成器表达式来改写数据量较大的列表推导
关键:
1 列表推导缺点
对输入序列中的每个值可能要创建仅包含一个元素的列表,输入数据多,可能导致崩溃
因为把输入数据每一项都保存在内存中。
2 生成器表达式
优点: 不把输出序列都呈现出来,估值为迭代器,迭代器每次根据生成器
表达式产生一项数据。
使用方式: 将列表推导用的[]替换为(),就构成生成器表达式。
与列表推导的不同点: 生成器表达式返回的是迭代器(还未计算好),而列表推导返回的是数组(全部计算好)
迭代器使用: 采用next(iterator)来获取每一项值
样例:
iter = (len(line) for line in open(fileName))
iter = ((a, a**0.5) for a in iter)
3 总结
列表推导可能会因为输入数据过多而占用很多内存,
生成器表达式返回迭代器,每次产生一个值,内存占用极少
可将一个生成器表达式返回的迭代器用在另一个生成器表达式中
参考:
Effectiv Python 编写高质量Python代码的59个有效方法
'''
def writeFile(fileName, datas):
with open(fileName, 'wb') as fr:
data = "\n".join(datas)
fr.write(data)
def getData():
data1 = "Hello World"
data2 = "I like python very much."
data3 = "I want to be professional on python."
data4 = "Anyone who does not kill me will make me stronger."
data5 = "Work hard."
data = [data1, data2, data3, data4, data5]
return data
def generateFile(fileName):
data = getData()
writeFile(fileName, data)
def useGenerator(fileName):
iter = (len(line) for line in open(fileName))
iter = ((a, a**0.5) for a in iter)
for value in iter:
print value
def process():
fileName = "./data.txt"
generateFile(fileName)
useGenerator(fileName)
if __name__ == "__main__":
process()
Effective Python 读书笔记: 第9条: 用生成器表达式来改写数据量较大的列表推导
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/88812049
今日推荐
周排行