前面忘了說了,由於我是在網易雲課堂圖靈學院上學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,具體原因我還不太清楚,等到學了字典在另行解答。下面貼出正確結果(字典解包需要**):