python 生成器注意事项

1.长列表适合写成生成器

读取文件中的内容,可以形成列表项。长的列表可能使内存崩溃。此时可以使用生成器。

def read_content(file):
    with open(file) as f:
        for line in f:
            yield line

2.生成器的状态

生成器作为一个迭代器,有状态,只能使用一次,第二次将返回空。

解决办法:

  • 短列表,可以用list复制内容
  • 使用lambda表达式,形成一个新列表
  • 使用类,复写iter()函数

    class Reader():

    def __init__(self, file):
        self.fileName = file
    
    def __iter__(self):
        with open(self.fileName) as f:
            for line in f:
                yield line
    

3.变长参数中作用生成器(*arg)

变长参数,会首先转换为元组,所以如果是生成器,则会遍历所有元素,如果很多,则可能引起崩溃

4.参数数据收集器,变长参数(*arg,**argm)

*arg,收集所有除位置参数以外的参数

**argm,收集所有位置参数

调用过程中,参数加*与不加*的结果是不一样的。

def log(msg, *val, **kk):
    print(msg)
    print(val)
    print(kk)

if __name__=='__main__':
    list=["k",1,2]
    dict={"m":88,"n":99}
    log("tmp",11,22,list,dict,pp=66)
    log("tmp",11,22,*list,*dict,pp=66)
    log("tmp",11,22,*list,**dict,pp=66)

结果:
tmp
(11, 22, ['k', 1, 2], {'m': 88, 'n': 99})
{'pp': 66}

tmp
(11, 22, 'k', 1, 2, 'm', 'n')
{'pp': 66}

tmp
(11, 22, 'k', 1, 2)
{'m': 88, 'n': 99, 'pp': 66}

参考:

  1. my coding.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibingql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值