Python函数的参数类型和使用技巧

举报
天元浪子 发表于 2021/07/26 23:55:34 2021/07/26
【摘要】 先来定义一个计算体重指数(BMI)的函数。体重指数就是体重与身高的平方之比,其中体重以千克为单位,身高以米为单位。 >>> def bmi(height, weight, name): i = weight/height**2 print('%s的体重指数为%0.1f'%(name, i)) >>> bmi(1.75, 75, ...

先来定义一个计算体重指数(BMI)的函数。体重指数就是体重与身高的平方之比,其中体重以千克为单位,身高以米为单位。

>>> def bmi(height, weight, name):
	i = weight/height**2
	print('%s的体重指数为%0.1f'%(name, i)) >>> bmi(1.75, 75, 'Xufive')
Xufive的体重指数为24.5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

自定义函数bmi有三个参数,每个参数都有明确的含义。调用这个函数时,必须按照定义的顺序传入这三个参数,缺一不可。这也是Python函数最基本的参数传递规则。

接下来把bmi函数稍微改造一下,给name参数指定一个默认值。

>>> def bmi(height, weight, name='您'):
	i = weight/height**2
	print('%s的体重指数为%0.1f'%(name, i)) >>> bmi(1.75,75) # 可以不传递name参数,使用默认值
您的体重指数为24.5
>>> bmi(1.75,75,'Xufive') # 也可以传递name参数
Xufive的体重指数为24.5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

现在bmi函数就有了两种类型的参数:weight和height,它们是函数调用时必不可少的参数,且顺序必须与函数定义的保持一致,这样的参数称为位置参数;name是函数调用时可有可无的参数(如未提供,则使用默认值),这样的参数称为默认参数。默认参数可以有多个。

为了使结果更准确,可以考虑使用最近一段时期内多个体重的均值来计算体重指数,这就意味着需要输入多个体重值。我们固然可以一个体重的元组或列表传给weight,但这样weight和height就不是同一种类型了,在形式上失去了美感,在使用时也容易产生误会。最好的方式就是让函数可以接受不确定个数的体重参数。

>>> def bmi(height, *args, name='您'):
	i = (sum(args)/len(args))/height**2
	print('%s的体重指数为%0.1f'%(name, i)) >>> bmi(1.75, 75, name='xufive')
xufive的体重指数为24.5
>>> bmi(1.75, 75, 74)
您的体重指数为24.3
>>> bmi(1.75, 75, 74, 75.5, 74.7, name='xufive')
xufive的体重指数为24.4

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实际上,像下面这样调用函数也没有问题。

>>> weight = [75, 74, 75.5, 74.7]
>>> bmi(1.75, *weight, name='xufive')
xufive的体重指数为24.4

  
 
  • 1
  • 2
  • 3

这下就有点复杂了,bmi函数有了三种类型的参数。除了位置参数和默认参数,又多了一种可变参数,即bmi函数可以接受不限数量的参数。在函数定义时,可变参数名前面冠以“*”号;在函数体内,可变参数相当于一个元组。

如此一来,就产生了一个新的问题:三种类型的参数应该以怎样的顺序被定义呢?位置参数排在首位,这一点没有异议。默认参数原则上放在最后,但调用时必须加上参数名(如上面的例子),否则函数无法区分究竟是可变参数还是默认参数。默认参数也可以放在可变参数之前(不建议这样做),但调用时不能使用参数名,即便使用默认值也不能省略参数,否则函数会用后面的可变参数的第一个值(如果有的话)强制为其赋值。

下面说一说更复杂的情况。除了上面介绍的三种类型的参数外,Python函数还支持第四种类型的参数:关键字参数。关键字参数由不限数量的键值对组成。在函数定义时,关键字参数名前面冠以“**”号;在函数体内,关键字参数相当于一个字典。

>>> def bmi(height, *args, name='您', **kwds):
	i = (sum(args)/len(args))/height**2
	print('%s的体重指数为%0.1f'%(name, i))
	for key in kwds:
		print('%s的%s是%s'%(name, key, str(kwds[key]))) >>> bmi(1.75, 75, 74, 75.5, 74.7, name='Xufive')
Xufive的体重指数为24.4
>>> bmi(1.75, 75, 74, name='Xufive', 性别='男', 爱好='摄影')
Xufive的体重指数为24.3
Xufive的性别是男
Xufive的爱好是摄影
>>> bmi(1.75, 75, 74, 性别='男', 爱好='摄影', name='Xufive')
Xufive的体重指数为24.3
Xufive的性别是男
Xufive的爱好是摄影
>>> bmi(1.75, 75, 74, 75.5, 74.7, 性别='男', 爱好='摄影')
您的体重指数为24.4
您的性别是男
您的爱好是摄影

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

如果一个函数同时具备了上述四种类型的参数,函数定义时参数的正确顺序应该是位置参数排在首位,可变参数次之,默认参数再次之,关键字参数排在末尾。函数调用时,如果需要指定默认参数,其参数名不能省略,位置在可变参数之后,可以在关键字参数之前,也可以在其后,也可以混杂其中。

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/115298728

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。