博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数的参数
阅读量:6587 次
发布时间:2019-06-24

本文共 9944 字,大约阅读时间需要 33 分钟。

#在前面我们已经了解了如何定义函数,不过只讲述了定义简单函数,还有一类函数是带参数的,称为带参数的函数。本节将探讨如何定义带参数的函数及其使用。
(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,world15 传入参数是: hello,world16         #我们定义了一个必须传入一个参数的函数paramone(str),传入的参数为str,结果是将’hello,world‘传给str。17         #对于上例,若不传入参数或传入一个以上的参数,结果会怎么杨,例如:18 #! /usr/bin/python319 #-*- 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 
30 paramone() #不输入参数31 TypeError: paramone() missing 1 required positional argument: 'str' #paramone()缺少1个需要的位置参数:“str”32 #执行结果告诉我们,paramone()函数缺少一个必需的定位参数,参数类型为:str。33 #再例如:34 #! /usr/bin/python335 #-*- 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
46 paramone('hello','world') #超过一个参数47 TypeError: paramone() takes 1 positional argument but 2 were given #paramone()接受1个位置参数,但给出了248 #执行结果告诉我们,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     return12 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 年龄: 2123 名字: 小明24 ------不按参数顺序传入参数,指定参数名------25 年龄: 2126 名字: 小明27 ------按参数顺序传入参数,并指定参数名------28 年龄: 2129 名字: 小明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 我今年: 23101 我现在在: 广东102 ------传入必须参数,更改第一个默认参数值------103 你好,我叫: 小明104 我今年: 21105 我现在在: 广东106 ------传入必须参数,默认参数值都更改------107 你好,我叫: 小明108 我今年: 21109 我现在在: 北京110 ------传入必须参数,指定默认参数名并更改参数值------111 你好,我叫: 小明112 我今年: 23113 我现在在: 北京114 ------传入必须参数,指定参数名并更改值------115 你好,我叫: 小明116 我今年: 21117 我现在在: 北京118 ------第一默认参数不带参数名,第二个带------119 你好,我叫: 小明120 我今年: 21121 我现在在: 北京122 ------两个默认参数都带参数名------123 你好,我叫: 小明124 我今年: 21125 我现在在: 北京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     return17 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 我属于不定长参数部分: 2131 我属于不定长参数部分: 广东32 ------带五个可变参数------33 小明34 我属于不定长参数部分: 2135 我属于不定长参数部分: 广东36 我属于不定长参数部分: 12337 我属于不定长参数部分: 梅州38 我属于不定长参数部分: happy39         #这段代码看起来很不可思议,在定义函数时只定义了两个参数,调用时却可以传入那么多参数?40         #这其实就是可变参数的好处,我们在参数前面加了一个星号,在函数内部,参数前的星号将所有值放在同一个元组中,通过这种方式将这些值收集起来,然后使用。参数vartuple接受的是一个元组,调用函数时可以传入任意个数的参数,也可以不传。41         #在这个示例中使用了前面的for循环,通过for循环遍历元组。42         #通过这种方式定义函数,调用时比较方便。43         #也可以使用这种方式处理前面学习的关键字参数,例如:44 # /usr/bin/python345 #!-*- coding:UTF8 -*-46 #def_示例模板_可选参数_147 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/python358 #!-*- coding:UTF8 -*-59 #def_示例模板_可选参数_160 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/python323 #!-*- 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

你可能感兴趣的文章
PHP语言中global和$GLOBALS[]的分析(转)
查看>>
使用PL/SQL对表进行解锁
查看>>
为视图加边框
查看>>
select - I/O多路复用
查看>>
如何居中一个浮动元素?
查看>>
Flex 国际化使用
查看>>
七大主题
查看>>
Linux中fork()函数详解
查看>>
linux下查看当前shell方法。
查看>>
poj 1007 DNA Sorting(排序--快排)
查看>>
tooltip 提示多行显示
查看>>
VS2008环境下开发的某些程序在其他机器运行提示“由于应用程序配置不正确,应用程序未能启动”的问题(IIS)...
查看>>
404 错误页面:重装上阵
查看>>
struts2生成随机验证码图片
查看>>
Ubuntu 安装 Java EE
查看>>
编译器错误~System.Data.Objects.DataClasses.EntityObject在未被引用的程序集中定义
查看>>
Windows Phone(wp7)系统长按的秘密
查看>>
获取网卡信息
查看>>
PHP中ini_set和ini_get函数用法简介
查看>>
poj1019
查看>>