wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > python函数参数的理解

原标题:python函数参数的理解

浏览次数:84 时间:2019-05-10

    Python函数参数的名称主要有:位置参数、关键字参数、默认参数、可变参数(可变数量参数)四种。这四种参数使用起来有什么区别呢?这篇博客主要想谈谈自己对这个问题的理解。注: 在中国,大学专业中工科类基本上都会开设C/C 课程,以此为介绍的起点。

本文实例讲述了Python函数参数操作。分享给大家供大家参考,具体如下:

  在C语言中,定义函数如下:

简述

 

在 Python 中,函数的定义非常简单,满足对应的语法格式要求即可。对于调用者来说,只需关注如何传递正确的参数,以及获取相应的返回值就足够了,无需了解函数的内部实现(除非想学习、跟踪源码)。

/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;

   if (num1 > num2)
      result = num1;
   else
      result = num2;

   return result; 
}

话虽如此,但对于函数的定义来说,灵活性非常高。除了常规定义的必选参数以外,还支持默认参数、可变参数、以及关键字参数。这样以来,不但能处理复杂的参数,还可以简化调用者的代码。

  

形参和实参

在调用函数 max() 时,需要将 2 个具体的数值(实参)赋给 max() 函数,例如 max(2,5),如果少于或多于 2 个参数都不可以。在Python 中,有相同的函数参数形式,称为:位置参数,使用方式如下:

不止 Python,几乎所有的编程语言都会涉及两个术语:parameter 和 argument。那么,它们之间究竟有什么区别呢?

 

parameter 是指函数定义中的参数,而 argument 指的是函数调用时的实际参数。

 1 #!/usr/bin/python
 2 
 3 # Function definition is here
 4 def printinfo( name, age ):
 6    print "Name: ", name
 7    print "Age ", age

简略描述:parameter = 形参(formal parameter), argument = 实参(actual parameter)。

 

例如,定义一个简单的函数:

此处 name 与 sex 必须输入相同数量(2个)有序的两个量,这是 Python 中第一个基本的输入参数形式。   还有第二种么?  是的,那就是:关键字参数  使用方式如下:

>>> def greet(param1, param2):
...   pass
... 
>>> 
>>> greet('Hello', 'Python')

 

其中,param1 和 param2 是函数的形参,而在函数 greet() 被调用时,传入的('Hello' 和 'Python')则是实参。

1 #!/usr/bin/python
2 
3 # Function definition is here
4 def printinfo( name='MAX', age='18' ):
5    print "Name: ", name
6    print "Age ", age

固定数量参数的函数

 

到目前为止,关于函数,我们介绍的都是固定数量的参数。来看一个简单的示例:

关键字参数不同于位置参数的地方在于:输入参数个数可以是 0、1、2个,即小于等于2 。此处如果输入 1 个参数 name ,age 不输入则 name 为关键字参数,age为 默认参数 那位置参数与关键字参数两种类型的参数是否可以组合使用呢?可以,使用原则如下:

>>> def greet(say, msg):
...   print(say, msg)
... 
>>> 
>>> greet('Hello', 'Python')
Hello Python

1、位置参数必须在关键字参数的前

这里,函数 greet() 有两个参数,用两个参数调用这个函数,运行得很顺利,不会有任何错误。

2、多个关键字参数之间不存在先后顺序

倘若,参数的个数不匹配,会发生什么?

# 以下是用关键字参数正确调用函数的实例
# print_hello('tanggu', sex=1)
# print_hello(name='tanggu', sex=1)
# print_hello(sex=1, name='tanggu')

# 以下是错误的调用方式
# print_hello(1, name='tanggu')
# print_hello(name='tanggu', 1)
# print_hello(sex=1, 'tanggu')
>>> greet() # 没有参数
...
TypeError: greet() missing 2 required positional arguments: 'say' and 'msg'
>>> 
>>> greet('Hi') # 只有一个参数
...
TypeError: greet() missing 1 required positional argument: 'msg'

 

显然,解释器会发牢骚。但是,对 Python 来说,要解决这个问题简直是易如反掌,继续往下看!

 

默认参数

 到目前为止,参数个数都限定在函数定义参数个数之下,那有没有办法让可输入参数超出这个范围呢?即让 max(a,b)可以接受多于 2 个参数,Python提出了一种方案:在参数中引入元祖(tuple)和字典(dict)概念,得到如下的参数定义:

定义函数时,可以使用赋值运算符(=)为参数指定一个默认值。

 1 def func(*args, **kwargs): 2  

注意: 如果参数没有默认值,在调用时必需为其指定一个值;如果参数有默认值,那么在调用时值是可选的,如果为其提供了一个值,将会覆盖默认值。

将位置参数包裹(paking)为元祖集合,将关键字参数包裹为字典集合,以允许接收更多的参数,从而得到了可变数量参数,举例如下:

>>> def greet(say, name = 'James', msg = 'I am your biggest fan!'):
...   print(say, ',', name, ',', msg)
... 
>>> greet('Hi') # 只提供强制性的参数
Hi , James , I am your biggest fan!
>>> 
>>> greet('Hi', 'Kobe') # 给出一个可选参数
Hi , Kobe , I am your biggest fan!
>>> 
>>> greet('Hi', 'Kobe', 'I want to challenge you!') # 给出所有参数
Hi , Kobe , I want to challenge you!

元祖:

由于 say 没有默认值,所以必须指定;name、msg 有默认值,所以值是可选的。

 1 def func(*args):
 2     sum = 0
 3     for x in args:
 4         sum  = x
 5     return sum 
 6     
 7 print(func(1,2,3)) //6
 8 //将list或tuple内全部元素作为可变参数
 9 L = [1,2,3,4]
10 print(func(*L)) //10

函数中的所有参数都可以有默认值,但是,一旦存在一个默认参数,其右侧的所有参数也必须有默认值。也就是说,非默认参数不能在默认参数之后。

 

例如,将上面的函数定义为:

字典:

def greet(name = 'James', say):
def func(a,b,**kw):
    sum = a b
    print(a,' ',b,'=',sum,kw)
func(2,3,color="black",phone="vivo")
// Out:2   3 = 5 {'color': 'black', 'phone': 'vivo'}

//先组装dict,再作为关键字参数传进去
desc = {'color': 'black', 'phone': 'vivo'}
func(2,3,**desc)
// Out:2   3 = 5 {'color': 'black', 'phone': 'vivo'}

就会引发错误:

 

SyntaxError: non-default argument follows default argument

 

关键字参数

总结:两种基本参数类型为:位置参数和关键字参数。通过有初值的关键字参数得到默认参数,通过将基本类型参数的包裹得到可变数量参数 。

当使用某些值调用函数时,这些值将根据其位置分配给参数。

 

例如,在上述函数 greet() 中,当使用 greet('Hi', 'Kobe') 调用它时,'Hi' 被赋值给参数 say,同样地,'Kobe' 被赋值给 name。

致谢:

Python 允许使用 kwarg = value 格式的关键字参数调用函数:

  文章引用了以下博客的例子,感谢你们的分享

>>> def greet(say, name = 'James'):
...   print(say, ',', name)
... 
>>> 
>>> greet(say = 'Hi', name = 'Kobe') # 2 个关键字参数
Hi , Kobe
>>> 
>>> greet(name = 'Kobe', say = 'Hi') # 2 个关键字参数(次序颠倒)
Hi , Kobe
>>> 
>>> greet('Hi', name = 'Kobe') # 位置参数与关键字参数混合使用
Hi , Kobe

引用:

当以这种方式调用函数时,关键字参数必须在位置参数之后,所有传递的关键字参数都必须与函数接受的某个参数匹配,并且它们的顺序不重要。

    1、https://segmentfault.com/a/1190000013117996

例如,像下面这样调用,会引发错误:

            2、https://www.cnblogs.com/VseYoung/p/python_def.html

>>> greet(name = 'Kobe', 'Hi') # 关键字参数在位置参数之前
...
SyntaxError: positional argument follows keyword argument
>>>
>>> greet('Hi', na = 'Kobe') # na 不匹配
...
TypeError: greet() got an unexpected keyword argument 'na'

            3、https://www.tutorialspoint.com/python/python_functions.htm

可变参数

本文由wns9778.com发布于计算机教程,转载请注明出处:python函数参数的理解

关键词: wns9778.com

上一篇:对Dapper的一点改造

下一篇:没有了