上一节(6.4生成器表达式)|下一节(7.2匿名函数)7.1可变参数本节介绍可变(variadic)参数。有时可变参数使用*args和**kwargs表示。可变位置参数(*args)如果一个函数接受任意数量的(位置)参数,那么我们说该函数使用可变参数。示例:deff(x,*args):...函数调用:f(1,2,3,4,5)附加参数作为元组传递:deff(x,*args):#x->1#args->(2,3,4,5)变量关键字参数(**kwargs)一个函数也可以接受任意数量的关键字参数。示例:deff(x,y,**kwargs):...函数调用:f(2,3,flag=True,mode='fast',header='debug')附加参数作为字典传递:deff(x,y,**kwargs):#x->2#y->3#kwargs->{'flag':True,'mode':'fast','header':'debug'}是的可变位置参数与可变关键字参数相结合函数可以接受可变非关键字参数和可变关键字参数。deff(*args,**kwargs):...functioncall:f(2,3,flag=True,mode='fast',header='debug')这些参数分为位置参数和关键字参数两种部分。deff(*args,**kwargs):#args=(2,3)#kwargs->{'flag':True,'mode':'fast','header':'debug'}...以上函数接受任意数量的位置参数和关键字参数。在编写包装器或将参数传递给另一个函数时使用。传递元组和字典元组可以扩展为可变参数:numbers=(2,3,4)f(1,*numbers)#同f(1,2,3,4)字典也可以扩展为关键字参数:options={'color':'red','delimiter':',','width':400}f(data,**options)#同f(data,color='red',delimiter=',',width=400)练习练习7.1:变量参数的简单示例尝试定义以下函数:>>>defavg(x,*more):returnfloat(x+sum(more))/(1+len(more))>>>avg(10,11)10.5>>>avg(3,4,5)4.0>>>avg(1,2,3,4,5,6)3.5>>>注意*收集所有其他参数。 练习7.2:将元组和字典作为参数传递假设您从文件中读取数据并获得一个元组。例如:>>>data=('GOOG',100,490.1)>>>现在,假设您要根据上述数据创建一个Stock对象。如果直接传递数据,它将不起作用:>>>fromstockimportStock>>>s=Stock(data)Traceback(mostrecentcalllast):File"",line1,inTypeError:__init__()takesexactly4arguments(2given)>>>这个问题很容易解决,直接使用*data即可。试试这个:>>>s=Stock(*data)>>>sStock('GOOG',100,490.1)>>>如果你只有一本字典,你可以使用**代替。示例:>>>data={'name':'GOOG','shares':100,'price':490.1}>>>s=Stock(**data)Stock('GOOG',100,490.1)>>>练习7.3:创建实例列表在report.py程序中,我们使用以下代码创建实例列表:defread_portfolio(filename):'''将股票投资组合文件读入带有键的字典列表中名称、股票和价格。'''withopen(filename)aslines:portdicts=fileparse.parse_csv(lines,select=['name','shares','price'],types=[str,int,float])portfolio=[Stock(d['name'],d['shares'],d['price'])fordinportdicts]returnPortfolio(portfolio)我们可以改用Stock(**d)来简化代码。请完成编辑。练习7.4:参数传递fileparse.parse_csv()函数具有用于更改文件分隔符和错误报告的选项。也许您希望将这些选择公开给上面的read_portfolio()函数。请完成修改:defread_portfolio(filename,**opts):'''将股票投资组合文件读入字典列表,其中包含关键字名称、股票和价格。'''withopen(filename)aslines:portdicts=fileparse.parse_csv(lines,select=['name','shares','price'],types=[str,int,float],**opts)投资组合=[Stock(**d)fordinportdicts]returnPortfolio(投资组合)修改完成后,尝试读取读取一些文件有错误:>>>importreport>>>port=report.read_portfolio('Data/missing.csv')第4行:无法转换['MSFT','','51.23']第4行:原因是int()的基数为10的无效文字:''第7行:无法转换['IBM','','70.44']第7行:以10为底的int()无效文字的原因:''>>>现在,尝试隐藏错误:>>>importreport>>>port=report.read_portfolio('Data/missing.csv',silence_errors=True)>>>目录|上一节(6.4生成器表达式)|下一节(7.2匿名函数)注意:完整翻译见https://github.com/codists/practical-python-zh