几种不同的传递参数方式
Python为我们提供了几种不同的参数传递方式。以便让我们在不同的场景内使用。由于在学习之前已经掌握别的的编程语言,所以理解起来也是比较容易的。
而Python的几种传递参数分别是位置参数、默认参数、关键字参数、可变参数
位置参数:
位置参数就是最常使用的一种方式,也是我在其他编程语言里使用最多的一种方式。位置参数是按照参数的先后顺序进行传入到函数里的。看demo。
1 2 3 4 5 6 7 8 9 |
def fun(name,age,inter): print('你好,我是{0},我今年{1}岁了,我的爱好是{2}。我很高兴向你介绍我自己。'.format(name,age,inter)) fun('LEC',17,'football') # > 表示输出结果😀 # # 表示注释 😏 > 你好,我是LEC,我今年17岁了,我的爱好是football。我很高兴向你介绍我自己。 |
代码来理解普通位置传递的时候,只会按照参数传递进去的位置顺序来进行赋值。
而假定如果我们把年龄和名字传递的先后顺序搞反了之后调用函数是:
1 2 3 4 5 |
fun('LEC',17,'football') #。那么代码的print结果就会是 > 你好LEC,我今年17岁了,我的爱好是football。我很高兴向你介绍我自己。 |
就如同上面一样,在实际的开发中,我们并不希望把参数传递错误。那么就有了关键字函数。
关键字函数
还是上面的demo。
而这次我们是使用键值对的方式来进行调用。调用如下
1 2 3 4 5 |
fun(inter='打球',age='11',name='狗蛋') > 你好狗蛋,我今年11岁了,我的爱好是打球。我很高兴向你介绍我自己。 |
值得注意的是,这次调用函数我们是完全颠倒了函数的位置,而结果并没有出错。关键字参数是根据键来进行指定参数的,与顺序无关。
那么当位置参数与关键字参数混合的时候呢?依旧是上面的demo
1 2 3 4 5 6 7 |
fun('狗蛋',inter='football','睡觉'); # 这样调用的话报出了一行错误 > SyntaxError: positional argument follows keyword argument # 解释为:[语法错误:位置参数在关键字参数前面] |
上面的报错提示指出了我们的问题所在。位置参数与关键字参数混合的时候,位置参数要在关键字参数的前面。位置参数是按照先后位置进行传递的,而关键字参数是按照key进行传递的。所以关键字参数肯定要让着位置参数。位置参数就要在前面。
设想一下,我们要输入一个班级100个同学的信息,而班级里有100个人,其中99个男的。我们用0代表男。那我们可能要输入99次0.那么我们如果不输入的时候默认就是0,是女的时候我们才输入1.那么就会引入了默认参数
默认参数
1 2 3 4 5 6 7 8 9 10 11 12 |
def fun1(age,inter,name='admin'): print('你好{0},我今年{1}岁了,我的爱好是{2}。我很高兴向你介绍我自己。'.format(name,age,inter)) fun1('18','睡觉') > 你好admin,我今年18岁了,我的爱好是睡觉。我很高兴向你介绍我自己。 fun1('18','睡觉',name='jony') > 你好jony,我今年18岁了,我的爱好是睡觉。我很高兴向你介绍我自己。 |
1 2 3 4 5 6 7 8 9 |
def fun1(name='admin',age,inter): print('你好{0},我今年{1}岁了,我的爱好是{2}。我很高兴向你介绍我自己。'.format(name,age,inter)) # 函数如果是这样的话就会报错: > SyntaxError: non-default argument follows default argument # 意为:语法错误,非默认参数要在默认参数前面 |
以上需要注意,当位置参数和默认参数并存的时候,默认参数放在最后面的位置。
收集参数
假如如果当我们一次性的需要输入很多名字的时候,如果在函数内定义很多参数就会很麻烦。在别的网站上也有见到称收集参数为解包裹参数的。先看demo:
1 2 3 4 5 6 7 8 9 |
def fun(*args): print(args) # 这是不需要加* print(type(args)) fun('小红','小蓝','小绿') > ('小红', '小蓝', '小绿') > <class 'tuple'> # 参数的数据类型是tuple |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 把关键字参数按照字典格式存入收集参数 def stu(**kwargs): print(type(kwargs)); # type == dict print('hello 大家好 自我介绍一下'); print(kwargs) # 这样调用是直接输出整个字典 # ## 下面是遍历输出字典内容 # for k,v in kwargs.items(): print(k,':',v); stu(名字="liuying", 年龄=19, 住址="奥地利梅利奥III街道", lover="王晓菁", work="老师") > <class 'dict'> # 数据格式 > hello 大家好 自我介绍一下 > {'名字': 'liuying', '年龄': 19, '住址': '奥地利梅利奥III街道', 'lover': '王晓菁', 'work': '老师'} # 直接输出 > 名字 : liuying > 年龄 : 19 > 住址 : 奥地利梅利奥III街道 > lover : 王晓菁 > work : 老师 |
几种参数混用的情况
如果混合使用参数,参数的排序规范是(位置参数,tuple类型可变参数,默认参数,字典类型参数)目前不知道关键字参数要塞到哪里😆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 参数混用问题 def stu(name,age,*args,hobby='没有',**kyargs):#如果有多个参数混合的话,参数顺序规范是这样的 print('hello 大家好'); print('我的名字是{0},我今年{1}岁了'.format(name,age)); if(hobby=='没有'): print('我没有爱好'); else: print('我的爱好是{}'.format(hobby)); print('*'*50); for i in args: print(i); print('='*50); for k,v in kyargs.items(): print('我的兴趣',k,':',v); # 调用的不同格式 #stu(name,age); #stu(name, age,'游泳',); stu('狗蛋',19,'王晓静','刘石头',hobby='游泳',hobby2='烹饪',hooby3='跟不同女生聊天'); > hello 大家好 > 我的名字是狗蛋,我今年19岁了 > 我的爱好是游泳 > ************************************************** > 王晓静 > 刘石头 > ================================================== > 我的兴趣 hobby2 : 烹饪 > 我的兴趣 hooby3 : 跟不同女生聊天 |