不間斷 Python 挑戰 Day 12 - 函數 (Function)

更新於 發佈於 閱讀時間約 9 分鐘
隨著程式的功能愈來愈複雜,程式碼也愈來愈多,若程式從頭寫到尾沒有任何的段落,可讀性會愈來愈差,甚至會發現同樣的一段程式碼重覆很多遍,因為類似的功能區塊在程式中可能會一再出現。這樣的程式碼不利於多人的協作開發,即使是寫作者本身在一段時間後回來看,可能也難以一眼就掌握程式的主要架構。
函數則是用來解決如這類「段落」與「重覆」的問題,函數本身也是由一系列的程式碼所組成,主要目的有兩個:
  1. 讓程式開發者可依照程式區塊的功能,包裝成較小單位的程式碼。
  2. 讓重覆使用的程式區塊可以被獨立出來,以較為精簡的方式被呼叫取用。

函數

在此之前,我們已經使用過許多Python內建的函數,例如print()、input()、range()、append()等等,這個單元我們主要在學習開發者自定義的函數,其最基本的語法如下:
def 函數名稱():
函數內容
函數名稱如變數命名規則一般,在規則內可自由定義;函數內容則是當這個函數被呼叫時所要執行的內容。回到最一開始學習Python的時候,當我們想要Python印出一行「Hello World!」的文字時,可以直接用print()函數把想打的內容放進去,也可以將這個功能包裝成一個函數,例如:
def hello():
  print("Hello World!")
呼叫這個函數即可將print()的內容印出。
hello()
執行結果:
Hello World!
雖然看起來程式的行數變多了,但若hello()需要在多個地方被呼叫,且hello()內要處理的內容變多了,例如要印出多行文字,我們就只需要修改一次hello()函數的內容,即可讓所有呼叫到這個函數的地方改變執行結果。

傳遞一個參數(parameter)的函數

如同print()函數,函數可以根據呼叫函數時所傳遞的函數做出不同的反應,也就是這個參數不是預先可以知道,而是根據程式執行到該處時當下的狀態所決定,我們可以將這個參數傳入函數中,其語法如下:
def 函數名稱(參數):
函數內容
承上例子,我們可以讓使用者輸入名字,再根據這個名字輸出訊息:
def hello_to_someone(name):
  print(f"Hello {name}!")
hello_to_someone(input("What's your name? "))
執行結果:
What's your name? WJ
Hello WJ!

傳遞多個參數的函數

延伸上一節,函數也可以傳入多個函數,視需要而定,語法如下:
def 函數名稱(參數1, 參數2, 參數3, ...):
  函數內容
例如,我們不只要輸入人名,還要輸入這個人的身高、體重,這時就可以傳遞多個參數:
def personal_info(name, height, weight):
  print(f"Hello {name}!")
  print(f"Your height is {height}!")
  print(f"Your weight is {weight}!")
info_name = input("What's your name? ")
info_height = input("Height? ")
info_weight = input("Weight? ")
personal_info(info_name, info_height, info_weight)
執行結果:
What's your name? WJ
Height? 180
Weight? 75
Hello WJ!
Your height is 180!
Your weight is 75!
傳入多個參數的用法必須注意參數的順序問題,程式並沒有辦法幫我們找出參數順序錯誤的問題,例如上例,如果呼叫函數的地方寫成:
personal_info(info_name, info_weight, info_height)
那結果就會出現不符合期待的錯誤:
What's your name? WJ
Height? 180
Weight? 75
Hello WJ!
Your height is 75!
Your weight is 180!
除了依賴開發者仔細的檢查以避免這類型的錯誤以外,我們也可以在呼叫函數時,直接將值指定給參數,如此一來參數傳入的順序就不重要了:
personal_info(name=info_name, weight=info_weight, height=info_height)

參數預設值

我們可以給參數加上預設值,承上例子,假如我們再加上一項出生地的資料,也知道程式的使用者大多數都是出生在台灣,我們可在birthplace參數加上預設值為"Taiwan",調用這個函數時,便可以不用每次都傳入此參數。
def personal_info(name, height, weight, birthplace="Taiwan"):
  print(f"Hello {name}!")
  print(f"Your height is {height}!")
  print(f"Your weight is {weight}!")
  print(f"Your birthplace is {birthplace}")
呼叫時使用預設參數:
personal_info(name="小明", height=176, weight=60)
執行結果:
Hello 小明!
Your height is 176!
Your weight is 60!
Your birthplace is Taiwan
呼叫時不使用預設參數:
personal_info(name="小華", height=160, weight=55, birthplace="Japan")
執行結果:
Hello 小華!
Your height is 160!
Your weight is 55!
Your birthplace is Japan
需要注意的是提供預設值的參數要集中在函數傳入參數的右方,因此以下的寫法在執行時是會出錯的:
def personal_info(name, height, birthplace="Taiwan", weight):
  print(f"Hello {name}!")
  print(f"Your height is {height}!")
  print(f"Your weight is {weight}!")
  print(f"Your birthplace is {birthplace}")

函數回傳值

到目前為值,我們所定義的函數都沒有定義回傳值,若用一個變數去接收函數的回傳值,會得到回傳值為None。
在函數結束前使用return語法,可將函數執行的結果,以變數、字串、串列......等等的形式回傳給主程式使用,以下範例把傳入函數的個人資料包裝成串列回傳。
def personal_info(name, height, weight, birthplace="Taiwan"):
  print(f"Hello {name}!")
  print(f"Your height is {height}!")
  print(f"Your weight is {weight}!")
  print(f"Your birthplace is {birthplace}")
  return [name, height, weight, birthplace]
personal_info_list = personal_info(name="小明", height=176, weight=60)
print(personal_info_list)
執行結果:
Hello 小明!
Your height is 176!
Your weight is 60!
Your birthplace is Taiwan
['小明', 176, 60, 'Taiwan']

程式範例

為什麼會看到廣告
avatar-img
47會員
36內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Wei-Jie Weng的沙龍 的其他內容
另一種迴圈的形式是while迴圈,和for迴圈常常可以達到相同的功能,差別在於for迴圈是在一定的範圍內迭代,例如從1到100,或是串列裡的每一個元素;而while迴圈是一個條件判斷的迴圈,當滿足這個條件就執行迴圈的內容,不滿足時就跳出迴圈。
目前為止,我們學到了基本的for迴圈,也就是僅對一個可迭代物件進行迭代。當一個迴圈裡面還有另一個迴圈,這時就形成了巢狀迴圈,最基本的例子就是九九乘法表,每個被乘數都對應到9個乘數,當被乘數和9個乘數都計算完了之後,才換下一個被乘數,不斷迴圈直到每個被乘數和乘數都計算過。另個for迴圈的應用是將串列和
綜合前幾天所學的內容,這裡實作了一個專題-密碼產生器。在這個專題中,我們運用了變數、串列、for迴圈、random模組等概念,讓使用者可以從數字、符號、英文字母中指定字元的數目,隨機生成一串密碼。
透過random模組生成的隨機數並非是真正完全隨機的,而是可以被重現的,因此這個特徵也被稱為是偽隨機(pseudo-random),而重現隨機數的方式便是透過設定相同的種子(seed),或是設定隨機數生成器的狀態(state)來達成。
當我們需要在程式中模擬或實作一些隨機發生的事件,例如模擬猜拳、丟骰子的結果,便需要程式可以根據開發者輸入的數值範圍、型態等,隨機產生一個結果,而Python的random()函數便是用於實現這個功能。
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
另一種迴圈的形式是while迴圈,和for迴圈常常可以達到相同的功能,差別在於for迴圈是在一定的範圍內迭代,例如從1到100,或是串列裡的每一個元素;而while迴圈是一個條件判斷的迴圈,當滿足這個條件就執行迴圈的內容,不滿足時就跳出迴圈。
目前為止,我們學到了基本的for迴圈,也就是僅對一個可迭代物件進行迭代。當一個迴圈裡面還有另一個迴圈,這時就形成了巢狀迴圈,最基本的例子就是九九乘法表,每個被乘數都對應到9個乘數,當被乘數和9個乘數都計算完了之後,才換下一個被乘數,不斷迴圈直到每個被乘數和乘數都計算過。另個for迴圈的應用是將串列和
綜合前幾天所學的內容,這裡實作了一個專題-密碼產生器。在這個專題中,我們運用了變數、串列、for迴圈、random模組等概念,讓使用者可以從數字、符號、英文字母中指定字元的數目,隨機生成一串密碼。
透過random模組生成的隨機數並非是真正完全隨機的,而是可以被重現的,因此這個特徵也被稱為是偽隨機(pseudo-random),而重現隨機數的方式便是透過設定相同的種子(seed),或是設定隨機數生成器的狀態(state)來達成。
當我們需要在程式中模擬或實作一些隨機發生的事件,例如模擬猜拳、丟骰子的結果,便需要程式可以根據開發者輸入的數值範圍、型態等,隨機產生一個結果,而Python的random()函數便是用於實現這個功能。
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。