1.定义了一个须要两个参数的函数javascript
def print_str(first, second): print first print second if __name__ == "__main__": print_str("hello", "world")
若是传一个参数调用,print_str("hello"),那么必定会抛出异常的(明确告诉你须要准确的两个参数,如今只肯定给了一个参数)java
TypeError: print_str() takes exactly 2 arguments (1 given)
python
二、上面的问题,咱们有个需求,就是我想传一个参数也行(还有种办法是用到默认参数),传两个参数或多个参数也行的函数有没有?像java同样,必须的有,让咱们改造一下最后参数为可变参数(也就是说可变参数,你能够不传)函数
def print_str(first, *second): print first print second
此时调用:print_str("hello")ui
输出结果:spa
hello .net
()code
能够看到字符串"hello"打印出来了,而没有传参的*second,打印出的是一个元组tuple,0个元素的元组,由于我就传了一个参数对象
若是咱们多传几个参数呢:print_str("hello","one","two","three")blog
输出结果:
hello
('one', 'two', 'three')
果真从可变参数开始起,即第二个参数"one"开始,会做为元组的第一个元素,后面的参数也会相继成为元组的元素。
三、总结一下 *参数
在调用时,从*参数 起,对传入的参数,自动组成tuple。
四、函数调用时,传入*参数,会对传入的元组参数进行一个解包功能,每个元素自动做为函数的参数
print_str(*numbers_strings),传入*元组,看看是怎么解包的,元组的第一个元素,仍然是表明位置参数first
等同于print_str("1","2","3","4","5")
numbers_strings = ("1","2","3","4","5") def print_str(first, *second): print first print second if __name__ == "__main__": print_str(*numbers_strings)
输出结果:
1
('2', '3', '4', '5')
五、若是是一个没有可变参数的函数,能够用解包功能一次性传入多个参数吗?固然是能够的,看下例子
numbers_strings = ("1","2") def print_str(first, second): print first print second if __name__ == "__main__": print_str(*numbers_strings)
输出结果:
1
2
六、惭愧啊,漏掉了 **参数,参数名称前两个**,表明的是关键字参数,也叫作字典参数,看下例子
def printStr(**anything): print anything printStr(first = 5, second = 100)
输出结果:{'second': 100, 'first': 5}
6-一、函数调用时,也能够传入一个字典,函数那块会解包,它会把dictionary中全部键值对转换为关键字参数传进去
def printStr(first, **dict): print(first) print(dict) printDic = {"name": "tyson", "age":"99"} printStr(100, **printDic) printStr(100, name = "tyson", age = "99") #等同于上面**printDic
输出结果:
100 {'name': 'tyson', 'age': '99'} 100 {'name': 'tyson', 'age': '99'}
七、总结
在python中,当*和**符号同时出如今函数定义的参数中时,都表示参数列表可接受任意数量的参数,均是可变参数
*second表示任意多个(包含0个)无名参数,也称为元组参数,最终的类型为tuple(注意:就算传递一个元素,也会最终变为tuple)
**anything表示任意多个关键字参数,也称为字典参数,最终的类型为dictionary
注意:俩者同时存在时,必定须要将*second放在**anything以前 (重要的事情说三遍)
注意:俩者同时存在时,必定须要将*second放在**anything以前
注意:俩者同时存在时,必定须要将*second放在**anything以前
八、注意事项,再提一次
a、首先只要是可变参数(无名参数或者关键字参数),能够传0个参数,也能够传1个,一样也能够传多个
b、只要是可变参数(元组参数或者字典参数),必定要在普通参数(也称位置参数)的后面
c、*参数必定必须在**参数的前面(元组参数与字典参数同时存在时,元组参数必定在前)
d、*参数,虽然叫元组参数,你可别传个完整的元组对象进来哈,若是是个元组,记得作解封,否则就要背锅了,就是要这样*turple传进去
e、**参数,虽然叫字典参数,你可别传个完整的字典对象进来哈,若是是个字典,记得也是作解包,对,就是要这样 **dict传进去
f、*参数,叫元组参数,若是传一个参数进去,它也去最终组成turple,这点要注意了,我今天差点看源码懵逼了
g、**参数,我相信字典参数也同样,传一个进去的时候,一样最终也会转换为dict
原文连接:https://blog.csdn.net/cadi2011/article/details/84871401