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}
参考: