1.格式化输出
在学习多类型传值和冗余参数之前,我们先介绍下格式化输出这个小的知识点,在Python中,我们可能需要打印特定类型的数据,比如打印一个字符串,一个整数,或者一个浮点数,诸如此类的数据,如果这些数据需要格式化的打印输出,就用到了Python格式化输出.例如,我们格式化的打印一个字符串.如下形式:
print("%s:%s" % ("name","zhangsan"))
如上代码所示,就是一个字符串格式化打印输出的代码,"%s:%s"就是一个打印输出的模板,其中,%s表示字符串的格式化输出,两个字符串中间用":"隔开,后面跟%,表示这是一个格式化打印输出,后面括号中的内容是需要打印的两个字符串,分别是"name"和"zhangsan".下面是一个详细的图示:
打印结果如下图所示:
当然,Python格式化输出还可以打印各种需要格式化输出的数据,比如整数,浮点型数据等等.
2.多类型传值
在学习多类型传值之前,我们先不解释多类型传值这个概念,先从函数调用时传参来了解它.先从一个函数调用时传参的例子说起,代码如下所示:
def printList(x,y):
print(x,y)
List=['name','zhangsan']
printList(List)
如上代码所示,调用函数printList(x,y)需要传的参数有两个,在调用函数时,我们只传进了一个实参List,这个序列List有两个元素,代码执行结果如下:
代码执行可以看到出现了错误,错误告诉我们,调用函数时,没有为形参y赋值,这是因为实参序列List只是作为形参x的实参,代码运行时只是x有值,x=List,而形参y则没有实参赋值,所以出现了如上错误.
这种情况下,我们怎样传递参数,才能让实参序列List的元素依次赋值给形参x和y呢?即x=List[0],y=List[1]。
代码如下:
def printList(x,y):
print(x,y)
List=['name','zhangsan']
printList(*List)
这次我们调用函数printList(x,y)时,在实参List前加了一个"*",这样Python在编译时会把实参List当做一个序列处理,在传参过程中,会将序列中的元素作为实参依次赋值给函数中的形参,即使得x=List[0],y=List[1],代码运行结果如下:
在序列作为实参为形参传值时,还需要注意的是实参序列的元素个数必须形参与列表的个数一致,如果不一致程序执行就会出现问题,如下代码:
def printList(x,y):
print(x,y)
List2={'name','zhangsan','lisi'}
printList(*List2)
运行结果如下:
代码错误的原因为,实参List2作为序列元素有3个,而形参列表只有2个形参,正是由于这种不一致导致函数调用时发生错误,希望大家以后再函数调用时注意这点.
在进行函数调用时,也可以将字典作为实参,为形参列表赋值,有关字典的内容在之前给大家介绍过,如果忘记了,可以翻一下我的博客文章列表回顾下,字典作为实参传参的代码如下:
List3={'age':20,'name':'zhangsan'}
def printList(name,age):
print(name,age)
printList(**List3)
执行结果如下:
可以看到字典作为实参传参时,与序列作为实参传参时唯一的不同就是字典作为实参时前有2个"*",值得注意的是,字典并没有像序列那样每一个元素分别与形参列表中的形参顺序上对应,例如字典List3第一个元素为,'age':20,而形参列表第一个形参为name,但是打印结果显示,形参name的值为'zhangsan',形参age的值为20,传值时并没有出现误差,这是因为字典是无序的,而字典作为实参为形参赋值时,是依照字典的键赋值的,比如字典List3第一个元素'age':20,函数调用时,Python会将键'age'对应的值20赋给形参age,相应的会把键'name'对应的键'zhangsan'赋给形参name.
需要注意的是,虽然字典中元素顺序在函数调用时无关紧要,但是字典中的键与形参列表中的形参名必须能够对应的上,比如如下代码:
def printList(name,age):
print(name,age)
List4={'a':20,'n':'zhangsan'}
printList(**List4)
打印结果如下:
可见函数调用出现错误,错误为字典List4中根本没有叫做'a'的键,这就是字典中的键没有与形参列表中的形参名对应上造成的,字典中的键为'n'和'a',而形参列表中并没有参数名为name和age的形参,这一点希望大家能够注意.
最后,我们再说明下什么是多类型传值,其实我们以上介绍的将列表或者字典作为实参,在函数调用时把集合中的元素依次赋值给形参,就是多类型传值.
3.冗余参数
在进行函数调用时,我们传递的参数个数有可能比形参列表中形参个数要多,而多出的实参就是冗余参数,下面我们就介绍下Python是如何处理这些冗余参数的。注意以下我们将要介绍的Python对冗余参数的处理只适用于Python3,因为文章中的代码都是在Python3.5.2的编译环境下执行通过的.先由一个例子引入:
def printList(x):
print(x)
printList(1)
printList(1,2,3)
代码运行结果如下:
可以看到函数printList(x)形参列表只有一个形参x,而函数调用时printList(1,2,3)发生错误,这是因为实参列表的实参个数比形参列表的形参个数多出了2个,那么在Python中又如何处理这些多出的参数呢?答案是用序列或者字典将剩余的参数全部封装到一个集合里.如下代码所示,使用序列接收剩余的参数:
def printList(x,*args):
print(x)
print(args)
printList(1,2,3,4)
printList(1,*(2,3,4))
printList(1,(2,3,4))
代码运行结果如下:
如上代码,函数调用为printList(1,2,3,4),函数为printList(x,*args),在函数调用过程中,实参从左至右赋值给形参,x=1,函数printList(x,*args)第二个形参args接收的是一个序列,但是实参列表中并没有序列,这时Python会将剩余的元素处理成一个序列。然后赋值给形参args,即args=(2,3,4),而函数调用printList(1,*(2,3,4)),参数*(2,3,4)本身就是一个序列,直接将其赋值给args;值得注意的是,printList(1,(2,,3,4))与printList(1,*(2,3,4))有着本质的区别,*(2,3,4)是作为一个序列整个赋给args,而printList(1,(2,3,4))则是与printList(1,2,3,4)一样,而(2,3,4)是作为冗余参数被Python封装在序列中赋值给序列args的,因此printList(1,(2,3,4))对应的打印结果是((2,3,4),),((2,3,4),)就是对应的那个序列.
介绍完Python是如何使用序列处理冗余参数的,那么Python又是如何使用字典来处理冗余参数的呢?
代码例子如下:
def printList(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
printList(1,2,3,4,k=2,o=3,t=4)
在函数调用时,Python会把形如k=2这样的赋值语句冗余实参封装成字典集合来处理,函数printList(x,*args,**kwargs),形参**kwargs就是用来接收字典集合的,Python会把形如k=2这样的赋值语句都当做字典的键值对元素来处理,比如'k'为元素的键,而'2'则为元素的值,所以冗余的赋值语句参数k=2,o=3,t=4都被当做键值对来处理。
代码打印结果如下:
可以从结果中看出,冗余参数2,3,4被封装成序列来处理,而形如k=2赋值语句的这种参数被封装成字典来处理.
5.总结
以上我们介绍了多类型传值和冗余参数,其实不难发现多类型传值与冗余参数正是相反的过程.多类型传值是在函数调用时,使用序列或者字典作为实参向函数传值;而冗余参数则是在函数端,使用序列或者字典接收函数调用时传过来的冗余参数,二者一个是在函数调用时传值,一个是在函数端接收值.
最近心情不太好,但还是硬着头皮写了这篇博客,写给想看的人看吧.
下一节我们将来介绍Lambda表达式,敬请期待.