函数的参数

#在前面我们已经了解了如何定义函数,不过只讲述了定义简单函数,还有一类函数是带参数的,称为带参数的函数。本节将探讨如何定义带参数的函数及其使用。
(1)、必须参数;
(2)、关键字参数;
(3)、默认参数;
(4)、可变参数;
(5)、组合参数。
1、必须参数
 1 #必须参数必须以正确的顺序传入函数。调用时数量必须和声明时一样。
 2         #定义如下函数并执行:
 3 #! /usr/bin/python3
 4 #-*- conding:UTF8 -*-
 5 #def函数_必须参数
 6 
 7 
 8 def paramone(str):
 9     print('the param is:',str)
10     print('传入参数是:',str)
11 paramone('hello,world')
12         #执行结果如下:
13 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_必须参数.py ==============
14 the param is: hello,world
15 传入参数是: hello,world
16         #我们定义了一个必须传入一个参数的函数paramone(str),传入的参数为str,结果是将’hello,world‘传给str。
17         #对于上例,若不传入参数或传入一个以上的参数,结果会怎么杨,例如:
18 #! /usr/bin/python3
19 #-*- conding:UTF8 -*-
20 #def函数_必须参数
21 
22 
23 def paramone(str):   #不输入参数
24     print('the param is:',str)
25     print('传入参数是:',str)
26 paramone()  #不输入参数
27         #执行结果如下:
28 Traceback (most recent call last):
29   File "C:/Users/DL He/Desktop/def_示例模板_必须参数.py", line 9, in <module>
30     paramone()  #不输入参数
31 TypeError: paramone() missing 1 required positional argument: 'str'     #paramone()缺少1个需要的位置参数:“str”
32         #执行结果告诉我们,paramone()函数缺少一个必需的定位参数,参数类型为:str。
33         #再例如:
34 #! /usr/bin/python3
35 #-*- conding:UTF8 -*-
36 #def函数_必须参数
37 
38 
39 def paramone(str):  
40     print('the param is:',str)
41     print('传入参数是:',str)
42 paramone('hello','world')  #超过一个参数
43         #执行结果如下:
44 Traceback (most recent call last):
45   File "C:/Users/DL He/Desktop/def_示例模板_必须参数.py", line 9, in <module>
46     paramone('hello','world')  #超过一个参数
47 TypeError: paramone() takes 1 positional argument but 2 were given     #paramone()接受1个位置参数,但给出了2
48         #执行结果告诉我们,paramone()函数只接受一个位置参数却给了两个。
49         #通过示例可以看到,对于定义的paramone()函数,不传入参数或传入一个以上参数,都会报错。所以对于此类函数,必须传递对应正确个数的参数。
2、关键字参数
 1  #关键字参数和函数调用关系紧密,函数调用使用关键字参数确定传入的参数值。
 2         #使用关键字参数允许调用函数时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。
 3         #定义如下函数并执行:
 4 #! /usr/bin/python3
 5 #-*- conding:UTF8 -*-
 6 #def函数_关键字参数
 7 
 8 def personinfo(age,name):
 9     print('年龄:',age)
10     print('名字:',name)
11     return
12 
13 print('------按参数顺序传入参数------')
14 personinfo(21,'小明')
15 print('------不按参数顺序传入参数,指定参数名------')
16 personinfo(name='小明',age=21)
17 print('------按参数顺序传入参数,并指定参数名------')
18 personinfo(age=21,name='小明')
19         #调用函数执行结果如下:
20 ============= RESTART: C:/Users/DL He/Desktop/def_示例模板_关键字参数.py =============
21 ------按参数顺序传入参数------
22 年龄: 21
23 名字: 小明
24 ------不按参数顺序传入参数,指定参数名------
25 年龄: 21
26 名字: 小明
27 ------按参数顺序传入参数,并指定参数名------
28 年龄: 21
29 名字: 小明
30         #由以上输出结果可以看到,对于personinfo()函数,只要指定参数名,结果就没有影响,都能得到正确的结果。
3、默认参数
  1     #调用函数时,如果没有传递函数,就会使用默认函数。
  2         #使用默认函数,就是在定义函数时,给参数一个默认值,如果没有给调用的函数的参数赋值,调用的函数就会使用这个默认值。
  3         #例如,定义如下函数并执行:
  4 #! /usr/bin/python3
  5 #-*- conding:UTF8 -*-
  6 #def函数_默认参数
  7 
  8 
  9 def defaultparam(name,age=23):
 10     print('你好,我叫:',name)
 11     print('我今年:',age)
 12     return
 13 defaultparam('小明')
 14         #调用函数执行结果如下:
 15 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_默认参数.py ==============
 16 你好,我叫: 小明
 17 我今年: 23
 18         #从以上示例可以看到,在函数调用时没有对age赋值,在输出结果中使用了函数定义时的默认值。如果我们对age赋值,最后的结果会是使用哪个值?
 19 #! /usr/bin/python3
 20 #-*- conding:UTF8 -*-
 21 #def函数_默认参数
 22 
 23 
 24 def defaultparam(name,age=23):
 25     print('你好,我叫:',name)
 26     print('我今年:',age)
 27     return
 28 defaultparam('小明',21)    #age函数默认值是23
 29         #得到的执行结果如下:
 30 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_默认参数.py ==============
 31 你好,我叫: 小明
 32 我今年: 21
 33         #通过执行函数我们看到,执行结果使用的是我们传入的参数。由此得知,当对默认参数传值时,函数执行时调用的是我们传入的值。
 34         #把函数的默认参数放在前面是否可行?定义如下函数并执行:
 35 #! /usr/bin/python3
 36 #-*- conding:UTF8 -*-
 37 #def函数_默认参数
 38 
 39 
 40 def defaultparam(age=23,name):
 41     print('你好,我叫:',name)
 42     print('我今年:',age)
 43     return
 44 defaultparam('小明')
 45         #执行结果如下:
 46 SystaxError:non-default argument follows default argument    #非默认参数遵循默认参数
 47         #执行结果是编译不通过,错误信息是:非默认参数跟在默认参数后面了。
 48         #这里提醒我们,默认参数一定要放在非默认参数后面,如果需要多个默认参数,该如何操作呢,再来看以下几个示例:
 49         #示例1,默认参数在必须参数前:
 50 #! /usr/bin/python3
 51 #-*- conding:UTF8 -*-
 52 #def函数_默认参数
 53 
 54 
 55 def defaultparam1(name,age=23,addr='广东'):
 56     print('你好,我叫:',name)
 57     print('我今年:',age)
 58     print('我现在在:',addr)
 59     return
 60 defaultparam1(age=21,name='小明')
 61 
 62 def defaultparam2(age=23,addr='广东',name):
 63     print('你好,我叫:',name)
 64     print('今年:',age)
 65     print('我现在在:',addr)
 66     return
 67 defaultparam2(age=21,name='小明',addr='北京')
 68         #执行结果如下:
 69 SystaxError:non-default argument follows default argument    #非默认参数遵循默认参数
 70         #示例2
 71 #! /usr/bin/python3
 72 #-*- conding:UTF8 -*-
 73 #def函数_默认参数
 74 
 75 def defaultparam(name,age=23,addr='广东'):
 76     print('你好,我叫:',name)
 77     print('我今年:',age)
 78     print('我现在在:',addr)
 79     return
 80 print('------传入必须参数------')
 81 defaultparam('小明')
 82 print('------传入必须参数,更改第一个默认参数值------')
 83 defaultparam('小明',21)
 84 print('------传入必须参数,默认参数值都更改------')
 85 defaultparam('小明',21,'北京')
 86 print('------传入必须参数,指定默认参数名并更改参数值------')
 87 defaultparam('小明',addr='北京',)
 88 print('------传入必须参数,指定参数名并更改值------')
 89 defaultparam('小明',age=21,addr='北京')
 90 print('------第一默认参数不带参数名,第二个带------')
 91 defaultparam('小明',21,addr='北京')
 92 print('------两个默认参数都带参数名------')
 93 defaultparam('小明',age=21,addr='北京')
 94 #print('------第一个默认参数带参数名,第二个不带,报错------')
 95 defaultparam('小明',age=23,'北京')
 96         #执行结果如下:
 97 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_默认参数.py ==============
 98 ------传入必须参数------
 99 你好,我叫: 小明
100 我今年: 23
101 我现在在: 广东
102 ------传入必须参数,更改第一个默认参数值------
103 你好,我叫: 小明
104 我今年: 21
105 我现在在: 广东
106 ------传入必须参数,默认参数值都更改------
107 你好,我叫: 小明
108 我今年: 21
109 我现在在: 北京
110 ------传入必须参数,指定默认参数名并更改参数值------
111 你好,我叫: 小明
112 我今年: 23
113 我现在在: 北京
114 ------传入必须参数,指定参数名并更改值------
115 你好,我叫: 小明
116 我今年: 21
117 我现在在: 北京
118 ------第一默认参数不带参数名,第二个带------
119 你好,我叫: 小明
120 我今年: 21
121 我现在在: 北京
122 ------两个默认参数都带参数名------
123 你好,我叫: 小明
124 我今年: 21
125 我现在在: 北京
126 ------第一个默认参数带参数名,第二个不带,报错------
127 SyntaxError:positional argument follows keyword argument  #位置参数遵循关键字参数
128         #从以上执行结果可以发现:
129         (1)、无论有多少默认参数,默认参数都不能在必须参数之前。
130         (2)、无论有多少默认值,若不传入默认参数值,则使用默认值。
131         (3)、若要更改某一个默认参数值,又不想传入其他默参数,且该默认参数的位置不是第一个,则可以通过参数名更改想要更改的默认参数值。        
132         (4)、若有一个默认参数通过传入参数名给改参数值,则其他想要更改默认参数都需要传入参数名更改参数值,否则报错。
133         (5)、更改默认参数值时,传入默认参数的顺序不需要根据定义的函数中的默认参数的顺序传入,不过最好同时传入参数名,否则容易出现执行结果与预期不一致的结果。
134         #通过以上示例可以看到,默认参数是比较有用的,通过默认参数可以帮助我们少写不少代码,比如使用上面的代码帮助某单位录入人员信息,如果有很多人的addr相同,就不需要传入每个人的addr值了。不过使用默认参数是需要小心谨慎。
4、可选参数
 1 #如果需要一个函数能够处理的参数声明时更多,这些参数叫作可变参数。和前面所述两个参数不同,可变参数声明时不会命名。基本语法如下:
 2 def functionname([formal_ages,]*var_ages_tuple):
 3       "函数_文档字符串"
 4       function_suite
 5       return[expression]
 6         #加了星号(*)的变量名会存放所有未命名的变量参数。如果变量参数在函数调用时没有指定参数,就是一个空元组。我们也可以不向可变函数传递未命名的变量。
 7         #下面通过示例说明可变函数的使用,定义如下函数并执行:
 8 # /usr/bin/python3
 9 #!-*- coding:UTF8 -*-
10 #def_示例模板_可选参数
11 
12 def personinfo(age,*vartuple):
13     print(age)
14     for var in vartuple:
15         print('我属于不定长参数部分:',var)
16     return
17 
18 print('------不带可变参数------')
19 personinfo('小明')
20 print('------带两个可变参数------')
21 personinfo('小明',21,'广东')
22 print('------带五个可变参数------')
23 personinfo('小明',21,'广东',123,'梅州','happy')
24         #执行结果如下:
25 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_可选参数.py ==============
26 ------不带可变参数------
27 小明
28 ------带两个可变参数------
29 小明
30 我属于不定长参数部分: 21
31 我属于不定长参数部分: 广东
32 ------带五个可变参数------
33 小明
34 我属于不定长参数部分: 21
35 我属于不定长参数部分: 广东
36 我属于不定长参数部分: 123
37 我属于不定长参数部分: 梅州
38 我属于不定长参数部分: happy
39         #这段代码看起来很不可思议,在定义函数时只定义了两个参数,调用时却可以传入那么多参数?
40         #这其实就是可变参数的好处,我们在参数前面加了一个星号,在函数内部,参数前的星号将所有值放在同一个元组中,通过这种方式将这些值收集起来,然后使用。参数vartuple接受的是一个元组,调用函数时可以传入任意个数的参数,也可以不传。
41         #在这个示例中使用了前面的for循环,通过for循环遍历元组。
42         #通过这种方式定义函数,调用时比较方便。
43         #也可以使用这种方式处理前面学习的关键字参数,例如:
44 # /usr/bin/python3
45 #!-*- coding:UTF8 -*-
46 #def_示例模板_可选参数_1
47 
48 
49 other={'城市':'广东','爱好':'编程'}
50 def personinfo(name,number,**kw):
51     print('名称:',name,'学号:',number,'其他:',kw)
52 personinfo('小明',1001,城市=other['城市'],爱好=other['爱好'])
53         #执行结果如下:
54 ============= RESTART: C:/Users/DL He/Desktop/def_示例模板_可选参数_1.py =============
55 名称: 小明 学号: 1001 其他: {'城市': '广东', '爱好': '编程'}
56         #由函数执行结果看到,可以使用两个“*”号,即使用“**”处理关键字参数,函数调用时可以用更简单的方式调用,简单形式如下:
57 # /usr/bin/python3
58 #!-*- coding:UTF8 -*-
59 #def_示例模板_可选参数_1
60 
61 
62 other={'城市':'广东','爱好':'编程'}
63 def personinfo(name,number,**kw):
64     print('名称:',name,'学号:',number,'其他:',kw)
65 personinfo('小明',1001,**other)
66         #执行结果如下:
67 ============= RESTART: C:/Users/DL He/Desktop/def_示例模板_可选参数_1.py =============
68 名称: 小明 学号: 1001 其他: {'城市': '广东', '爱好': '编程'}
69         #执行结果和前面一样,写法上却简单了不少。此处**other表示把other这个字典的所有key-value用关键字参数传入函数的**kw参数,kw将获得一个字典,注意kw获得的字典时other复制的,对kw的改动不会影响函数外的other。
5、组合参数
 1  #在Python中定义函数可以用必须参数、关键字参数、默认参数和可变关键字参数、这四种参数可以组合使用。注意定义参数的顺序必须是必须参数、默认参数、可变参数和关键字参数。
 2         #下面介绍组合参数的使用,如下函数:
 3 # /usr/bin/python3
 4 #!-*- coding:UTF8 -*-
 5 #def_示例模板_组合参数
 6 
 7 def exp(p1,p2,df=0,*var,**kw):
 8     print('p1=','p2=','df=','var',var,'kw=',kw)
 9 
10 exp(1,2)
11 exp(1,2,c=3)
12 exp(1,2,3,'a','b')
13 exp(1,2,3,'abc',x=9)
14         #执行结果如下:
15 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_组合参数.py ==============
16 p1= 1 p2= 2 df= 0 var= () kw= {}
17 p1= 1 p2= 2 df= 0 var= () kw= {'c': 3}
18 p1= 1 p2= 2 df= 3 var= ('a', 'b') kw= {}
19 p1= 1 p2= 2 df= 3 var= ('abc',) kw= {'x': 9}
20         #由输出结果看到,使用了组合参数,在调用函数时,Python解释器会自动按照参数位置和参数名对应的参数传进去。
21         #此处还可以用tuple和dict调用上述函数,使用方式如下:
22 # /usr/bin/python3
23 #!-*- coding:UTF8 -*-
24 #def_示例模板_组合参数
25 
26 def exp(p1,p2,df=0,*var,**kw):
27     print('p1=','p2=','df=','var',var,'kw=',kw)
28 
29 args=(1,2,3,4)
30 kw={'x':'8','y':'9'}
31 exp(*args,**kw)
32         #执行结果如下:
33 ============== RESTART: C:/Users/DL He/Desktop/def_示例模板_组合参数.py ==============
34 p1= 1 p2= 2 df= 3 var= (4,) kw= {'x': '8', 'y': '9'}
35         #由执行结果看到,任意函数都可以通过类似func(*args,**kw)的形式调用,无论参数是如何定义的.

end

原文地址:https://www.cnblogs.com/DLHe/p/7762630.html