Python基础数据类型-函数传参详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.位置参数
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 #站在函数定义的角度上 8 def func(a,b,c): #位置参数,如果这里定义了就必须要传的参数 9 print(a,b,c) 10 11 12 #站在调用函数的角度上 13 func(1,22,333) #按照位置传参 14 func(b = 1,a = 2,c=3) #按照关键字传参 15 func(100,c = 200,b=300) #混用 : 必须先按照位置传参,再按照关键字传参 16 17 18 19 20 #以上代码执行结果如下: 21 1 22 333 22 2 1 3 23 100 300 200
二.默认参数
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 default = 'boy' 8 9 #站在定义函数的角度上 10 def welcome(name,sex=default): #默认参数,sex关键字就是默认参数,默认值为'boy' 11 print('welcome,%s,sex: %s'%(name,sex)) 12 13 default = 'woman' 14 15 welcome('周杰伦') 16 welcome('邓紫棋','girl') 17 welcome(sex='boy',name='尹正杰') 18 19 20 21 def LookOut(yzj = []): 22 yzj.append("yinzhengjie") 23 print(yzj) 24 25 LookOut() #第一次调用,默认传入的是一个空列表,当函数执行完毕,函数执行完毕存在内存的空列表被追加了字符串, 26 LookOut([]) #第二次调用,虽说传入的是个空列表,但是和第一个很显然就不是同一个内存地址啦! 27 LookOut() #第三次调用,虽然说和第一次调用姿势是一样的,很显然拿到的内存也是同一个内存地址,也就是说在第一次追加字符串的基础上又一次进行追加操作! 28 29 ''' 30 综上,我们可以总结默认参数的特点: 31 1>.它是可以不传的参数; 32 2>.如果不传默认是设置的默认值,如果传就用传入的值; 33 3>.默认的值是在定义阶段就确定了; 34 4>.默认参数的陷阱:针对可变的数据类型要小心; 35 默认参数在我们实际生活中常见就貌似安装软件,比如我们安装QQ等软件,如果不指定安装路径的话,它默认就会给咱们一个安装路径的哟! 36 ''' 37 38 39 40 #以上代码执行结果如下: 41 welcome,周杰伦,sex: boy 42 welcome,邓紫棋,sex: girl 43 welcome,尹正杰,sex: boy 44 ['yinzhengjie'] 45 ['yinzhengjie'] 46 ['yinzhengjie', 'yinzhengjie']
三.动态参数
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 def my_sum(*args): 9 count_sum = 0 10 for i in args: 11 count_sum += i 12 return count_sum 13 print(my_sum(1,2,3,4)) 14 15 16 def Interface(**kwargs): 17 print(kwargs) 18 19 info = { 20 '数据库':'MySQL', 21 '服务器地址':'yinzhengjie.org.cn', 22 'Age':18, 23 } 24 Interface(**info) 25 26 #这种定义形式参数的方式可以hold住所有的传参哟,当然默认传参除外! 27 def TransferParameters(*args,**kwargs): 28 print(args) 29 print(kwargs) 30 31 a = (10,20) 32 b = {'x':100,'y':200} 33 TransferParameters(*a,**b) 34 35 36 ''' 37 综上所示,动态参数有以下特点 38 1>.站在函数定义的角度上:*做聚合用,将一个一个的参数组合成一个元组; 39 2>.站在函数调用的角度上:*做打散用,将一个列表或者元组打散成多个参数; 40 3>.*只针对按位置传参; 41 4>.**动态参数,接受按关键字传递过来的参数,组织成一个字典; 42 ''' 43 44 45 46 #以上代码执行结果如下: 47 10 48 {'数据库': 'MySQL', '服务器地址': 'yinzhengjie.org.cn', 'Age': 18} 49 (10, 20) 50 {'x': 100, 'y': 200}
四.关于形式参数混搭案例
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 #注意,如果想要把所有的形式参数都用上,我们可以这样定义(站在函数定义的角度:所有的参数都是形式参数) 9 10 def func(位置参数1,位置参数2,*args,默认参数=10,**kwargs): 11 print(位置参数1,位置参数2) 12 print(默认参数) 13 print(args) 14 print(kwargs) 15 16 func("一","二","三","四","五",默认参数='yinzhengjie',a=100,b=200) 17 18 print("-"*20,"我是分割线","-"*20) 19 20 func(100,200,300,400,a=1,b=2) 21 22 23 24 25 #以上代码执行结果如下: 26 一 二 27 yinzhengjie 28 ('三', '四', '五') 29 {'a': 100, 'b': 200} 30 -------------------- 我是分割线 -------------------- 31 100 200 32 10 33 (300, 400) 34 {'a': 1, 'b': 2}