社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

天元浪子 • 4 年前 • 430 次点击  

先来定义一个计算体重指数(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
  • 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
  • 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
  • 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
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110732
 
430 次点击