Effective Python 读书笔记: 第9条: 用生成器表达式来改写数据量较大的列表推导

# -*- 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() 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值