【Python】Python - Python 函數。Python Functions.

 

【Python】Python - Python 函數。Python Functions.

函數是個程式碼區塊,這個程式碼區塊僅在被呼叫時執行。你可以傳遞參數給函數。函數會回傳結果資料回來。


建立一個函數

Python的函數使用def keyword去定義:

範例

def my_function():
  print("Hello from a function")

呼叫一個函數

要呼叫函數,使用函數名稱及參數即可:

範例

def my_function():
  print("Hello from a function")

my_function()
上面輸出: Hello from a function

參數

傳遞入函數的資料稱為參數。

參數的設定在函數名稱後面括弧裡面。你可以增加許多你需要的參數,只要將那些參數使用逗號分隔開來。

下面的範例為函數傳遞一個參數fname。當函數被呼叫,會傳遞名字入函數,這個名字參數可以在函數內使用,範例為列印完整的姓名。

範例

def my_function(fname):
  print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus")
上面輸出:
Emil Refsnes
Tobias Refsnes
Linus Refsnes

參數(Arguments)在Python文件中通常縮寫為args。



參數(Parameters or Arguments)?

參數為傳遞資訊入函數的部分。


來自一個函數的觀點:

A parameter為在函數定義的中括弧內的變數。

An argument為一個值,當函數被呼叫時會送入函數的值。


Arguments的數量

預設值,函數呼叫時的參數數量必須正確的。表示如果函數需要2個參數,則必須要呼叫函數包含2個參數,不可多也不可少。


範例

函數需要2個參數,則送入2個參數:

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil""Refsnes")
上面輸出: Emil Refsnes

如果你試著傳遞參數僅傳遞1個或傳遞3個,你將會得到錯誤訊息。

範例

這個函數期待2個參數,但僅傳遞1個參數:

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil")
上面輸出:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: my_function() missing 1 required positional argument: 'lname'

隨意參數, *args

如果函數在定義時無法確切知道有多少參數需要傳入,在定義函數時可以使用*在參數名稱前面。

這個方式定義參數,函數會收到一個tuple的參數。

範例

如果參數未知,增加一個*在參數名稱前面:
def my_function(*kids):
  print("The youngest child is " + kids[2])

my_function("Emil""Tobias""Linus")
上面輸出:
The youngest child is Linus

在Python文件中,隨意參數通常簡寫為 *args。


關鍵字參數

Keyword Arguments

在Python中可以設定key=value 語法傳遞參數。使用這個方式傳遞參數則參數的順序不需要考慮。

範例

def my_function(child3, child2, child1):
  print("The youngest child is " + child3)

my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")
上面輸出:The youngest child is Linus

Python文件中,通常將參數簡寫為kwargs。


隨意參數 **kwargs

(在C語言*表示c字串,**表示多個c字串。這個寫法與C語言觀念類似。)

如果無法知道有多少關鍵字參數需要傳入函數,則使用**在參數前面。

這個方式可以收到一個dictionary的參數,且可以使用裡面的每個items。

範例

如果參數不曉得,則在參數前面增加**符號。

def my_function(**kid):
  print("His last name is " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")
上面輸出:His last name is Refsnes

在Python文件中,隨意Kword參數通常簡寫為**kwargs。


預設參數值

下面的範例顯示如何使用預設參數值。

如果我們呼叫函數不使用參數,就會使用預設值:

範例

def my_function(country = "Norway"):
  print("I am from " + country)

my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")
上面輸出:
I am from Sweden
I am from India
I am from Norway
I am from Brazil

傳遞參數List

你可以傳遞資料格式為字串、數字、list、dictionary...等,且在函數中這個傳遞方式的參數將會被視為相同資料型態。

e.g. 如果你傳遞List為參數,在函數內則可以使用List。

Example

def my_function(food):
  for x in food:
    print(x)

fruits = ["apple""banana""cherry"]

my_function(fruits)
上面輸出:
apple
banana
cherry

回傳值

使用return statement可以使函數有回傳值:

範例

def my_function(x):
  return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))
上面輸出:
15
25
45

關於pass描述式

function 的定義不可為空,但如果因為某些理由需要一個沒有內容的函數,可以使用pass 描述式來避免直譯器的錯誤訊息。

範例

def myfunction():
  pass

遞迴(Recursion)

Python也支援函數的遞迴,表示定義的函數可以呼叫自己。

遞迴也是一個普遍的數學與程式觀念。表示函數呼叫自己。好處在可以使用迴圈去傳遞資料給函數得到結果,有減少程式碼長度的好處。

開發者應該要非常注意遞迴非常容易使函數進入無窮迴圈,或記憶體使用超過機器的容量。然而,當寫了正確的遞迴函數,可以使用在數學上比較優雅的方式來寫程式。

下面的範例tri_recursion() 是一個函數使用遞迴方式呼叫自己,我們使用k 變數傳遞資料,每次遞迴則減少1。遞迴結束則參數不再大於0。

對於新的開發者,可能會花比較多的時間在讓遞迴正確的工作,最好的方式為測試並修改。

範例

遞迴範例

def tri_recursion(k):
  if(k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)
上面輸出:
Recursion Example Results
1
3
6
10
15
21
21

留言

這個網誌中的熱門文章

【多益】現點現做的英文怎麼說呢?

《Microsoft Word 應用》:圖片被文字蓋住解決方法,不可設定為固定行高

如何在Ubuntu系統上安裝Notepad ++ (Install Notepad++ On Ubuntu 16.04 / 17.10 / 18.04 / 20.04)