前面忘了说了,由于我是在网易云课堂图灵学院上学Python的,很多内容都是借鉴上面讲义的,也借此帮图灵学院宣传一波,课程免费,学的又很系统,老师讲的很好!
广告结束,开始正文。函数和参数两个我合起来写,以例子为主,Python的函数参数设置感觉比C++和Java好用多了。
普通参数
def func(name,age):
print("我的名字是{0}\n我今年{1}岁了".format(name,age))
func("Salvation",21)
结果如下:
关键字参数
def func(name="no name",age=0):
print("我的名字是{0}\n我今年{1}岁了".format(name,age))
func(age=21,name="Salvation")
结果同上。*关键字参数的好处是可以调换参数顺序
收集参数
def func(*args):
for i in args:
print(i,end=" ")
func("Salvation",21)
结果如下:
其中,args可以看成是列表或者元组。但其实这种方法并不能很好的达到刚才的效果。
关键字收集参数
def func( **kwargs):
for k,v in kwargs.items():
print(k,"...",v)
func(name="Salvation",age=18)
结果如下:
实际上,这个结果并不是我想要的,原本预期的结果是和第一个程序类似的效果,但是在函数里访问**kwargs的时候一直出现问题,希望以后能够解决。
收集参数混合调用
在尝试的过程中,我遇到了一个非常经典的问题,贴出来分享一下。
这里报错是在说:位置参数跟在关键字参数的后面了。*在Python中,必须先解析位置参数。也就是说,在定义函数的时候,我们需把*args放在hobby前面。
修改后结果如下:
def func(name,age,*args,hobby="没有爱好",**kwargs):
print("Hello,大家好")
print("我叫{0},我今年{1}岁了".format(name,age))
if(hobby=="没有爱好"):
print("我没有爱好")
else:
print("我的爱好是{}".format(hobby))
print("*"*20)
for i in args:
print(i)
print("*"*20)
for k,v in kwargs.items():
print(k,"...",v)
func1 = func("Salvation",18,"我还喜欢看书",hobby="篮球",hobby2="我还喜欢游泳")
收集参数的解包问题
这里的解包问题解决了我上面关键字收集参数的疑惑。
对于普通收集参数,若想打印出参数列表的所有元素,我的第一次尝试是这样的:
显然,结果中直接将整个列表打印出来,这就涉及到了列表的解包:
这里就跟c++的指针类似的作用。同理,字典也是一样的。
错误结果:
我惊奇地发现,这里竟然出现了TypeError,具体原因我还不太清楚,等到学了字典在另行解答。下面贴出正确结果(字典解包需要**):