python3函数传值的一些建议

一 位置参数的传值



1.位置参数必须按照被调用的函数定义的形参的准确位置和数量传值。


传入方式1:非关键字传入,需要按照形参的顺序依次传入。



注意点:例子中输出的结果与传入参数的顺序有关,当参数的个数与定义形参的个数不一致的时候会抛出TypeError错误。



def function(value1, value2):
 
   
    print("value1:%d"%value1)
 
   
    print("value2:%d"%value2)
 
   

 
   
if __name__ == "__main__":
 
   
    function(10, 5)



输出结果:



value1:10
 
   
value2:5






传入方式2:关键字传入,格式为"形参的名字=实参",这种方式可以不用按照定义的形参的顺序传入,但是数量依然要一致。



def function(value1, value2):
 
   
    print("value1:%d"%value1)
 
   
    print("value2:%d"%value2)
 
   

 
   
if __name__ == "__main__":
 
   
    function(value2 = 10, value1 = 5)





输出结果:



value1:5
 
   
value2:10





二 默认参数(缺省参数)的传值



1.当不确定传入什么参数的时候可以设置一个默认参数,调用函数的时候不传值会使用默认参数,传值会给默认参数重新赋值,默认参数必须放在 所有位置参数后面。



注意点:不要使用可变类型的参数作为默认参数,否则在调用函数的时候会出现问题。



现在要求传入1到2个参数(一个参数或是传入一个值和列表),都可以返回一个添加了这个值的列表,这时就可以使用默认参数来实现,但是例子中为什么传入值之后得到的不是我需要的结果?原因就是使用了可变类型作为默认参数。



1 def function(value, li=[]):
 
   
2       li.append(value)
 
   
3       return li
 
   
4
 
   
5
 
   
6 if __name__ == "__main__":
 
   
7     list1 = function(10)
 
   
8     list2 = function(123, [])
 
   
9     list3 = function('a')
 
   
10    print("list1:%s"%list1)
 
   
11    print("list2:%s"%list2)
 
   
12    print("list3:%s"%list3)



输出结果:



list1:[10, 'a']
 
   
list2:[123]
 
   
list3:[10, 'a']



例子解析:代码从上往下执行,执行第7行的时候给函数传入了一个数字10,函数的第二个参数会使用默认的参数li=【】这个空列表,经过函数的处理之后将数字10添加到了列表li中,变量list1指向了函数返回的列表li,此时的list1和li的值都为【10】,执行第8行向函数里面传入123和一个空列表,这时函数接受了两个参数,就不会使用默认参数,处理的结果是将123添加到了传入的空列表中,并返回这个传入的列表的引用,此时的list2的值为【123】,执行第9行的时候传入了一个字符串"a",所以在处理的时候还会使用默认参数li的这个列表,但是列表是可变元素,在执行第7行的时候添加了一个10,所以在这次执行的时候会继续向这个列表中添加"a",所以list3的结果是【10, "a"】,此时list3也指向了函数返回的列表li,也就是说list1和list3这两个变量都指向了li这个列表,由于列表是可变类型,所以在第10到12行打印的时候list1和list2的输出结果相同。






三.不定长参数的传递



1.非关键字不定长参数的传递(元组)



不确定传入的参数数量的时候可以使用非关键字不定长参数,格式为*ages,传入的参数以元组保存。



注意点:不定长参数必须定义在位置参数和默认参数的后面,否则可能会出现传错参数的情况。





def function(value, *ages):
 
   
    print("value:%d" % value)
 
   
    print("ages:%s" % (str(ages)))
 
   

 
   
if __name__ == "__main__":
 
   
    function(10, 11, 12, 13)


输出结果:



value:10
 
   
ages:(11, 12, 13)



2.关键字不定长参数的传递(字典)



当传入的参数是成对出现的,即传入的参数有关键字,但是数量不确定,可以使用字典来保存,格式为**kwages,



传入的第一个值为字典的key,第二个值为字典的value。



注意点:关键字不定长参数必须放在所有参数的最后面。



def function(value1, value2, **kwages):
 
   
    print("value1:%d"%value1)
 
   
    print("value2:%d"%value2)
 
   
    print("kwages:%s"%(str(kwages)))
 
   

 
   
if __name__ == "__main__":
 
   
    function(10, 5, name="zhangsan")


输出结果:



value1:10
 
   
value2:5
 
   
kwages:{'name': 'zhangsan'}



函数定义形参的顺序:位置参数->默认参数->非关键字不定长参数->关键字不定长参数。