1. 程式人生 > >Python基礎——函式位置,關鍵字,預設值引數

Python基礎——函式位置,關鍵字,預設值引數

函式裡面的基本概念,小筆記錄下來~

python中函式定義中的變數叫做形參;函式呼叫中的變數叫做實參

站在形參的角度:1.位置引數;2.預設值引數;3.混合引數:位置引數在前,預設值引數在後

站在實參的角度:1.位置引數;2.關鍵字引數;3.混合引數:位置引數在前,關鍵字引數在後

總結要點寫在前面,下面一一填坑。

  • 位置引數

分為位置形參與位置實參,鑑於函式定義中常有多個位置形參,因此函式呼叫中也常有多個位置實參。所以重點來了,在只有位置引數的時候,需要實參與形參的順序一一對應即相同順序。

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
def func(name, food):#name與food為函式定義中的位置形參
    print(name + " eat " + food + "!")

func("akai", "noodles") #位置實參,按記住形參含義,按順序一一對應
func("noodles", "akai") #位置實參不按順序,則會出問題

#akai eat noodles!
#noodles eat akai! #不按順序鬧笑話
  • 預設值引數

全名預設值形參,在編寫與定義函式時可以給每個形參定義預設值。在函式呼叫時如果給形參提供了實參(關鍵字實引數),python將使用指定的實參值;否則,將使用形參的預設值

def func(food = "noodles"):#預設值形參
    print("akai eat "+food)

func()#沒改變直接呼叫預設值引數
func(food = "beef")#給形參提供實參,改變預設值,這裡劇透下叫做關鍵字實參

#akai eat noodles
#akai eat beef
  • 形參中的混合引數

上述的例子都只是含有單一的形參,要是兩個混合在一起,不按規矩來就會亂套,所以有了混合形參中的法則:位置引數在前,預設值引數在後。但其實,在混合引數中,預設值引數依然是被作為位置引數來看待的。

def func(name, food="noodles"):#位置形參在前,若是在後就會報錯
    print(name + " eat " + food +"!")

func("akai")
func("akai",food="beef")
func("akai","beef")#沒有寫成關鍵字引數,不影響它被看做是位置引數的本質
func(food="beef",name="akai")#見下,關鍵字引數

#akai eat noodles!
#akai eat beef!
#akai eat beef!
#akai eat beef!
  • 關鍵字引數

 關鍵字實參是傳遞給函式名稱——值對。你直接在實參中將名稱和值關聯起來了,因此向函式傳遞實參時不會混淆。有一個好處就是:無需考慮函式呼叫中的實參順序,還清楚的指明瞭函式呼叫中各個值的用途。關鍵字引數之間不存在順序!

def func(name, food):
    print(name + " eat " + food + "!")

func(name= "akai", food= "beef")
func(food= "noodles", name= "akai")#關鍵字引數的順序無關緊要

#akai eat beef!
#akai eat noodles!
  • 實參中的混合引數

在混合形參中已經有所展示了,牢記:位置實參在前,關鍵字實參在後;關鍵字引數無先後

  • 一道題目

如果預設值引數變成一個可變的資料型別,如列表,字典。

def func(val, list=[]):
    list.append(val)
    return list

list1 = func(10)
print('list1= {0}'.format(list1))

list2 = func(20, [])
print('list2= %s' % list2)

list3 = func('a')
print('list3= %s' % list3)

#題目答案
#list1= [10]
#list2= [20]
#list3= [10, 'a']

解釋:1.預設值引數在函式定義時就已經算出來了,而不是在函式執行時;2.預設值引數是一個可變的資料型別,那麼如果有人呼叫它的時候改變了它,其他位置用到也跟著改變。

解決方案:1.每次呼叫,像例子中呼叫函式2一樣,位置引數跟一個空列表;2.不在形參中加入可變資料型別一類的預設值引數,要建立空列表的話,在函式體內建立。

提前佔個動態引數*args,**args的坑,以後填上!

如有錯誤,歡迎指正!