iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Software Development

Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!系列 第 19

【Day19】打包你的程式碼,隨時呼叫!— 函式Function實戰指南(上)

  • 分享至 

  • xImage
  •  

前言

Day1 到 Day18,我們已經學會了變數、資料型態、判斷式、迴圈,
還一路走過了四大集合型態 (List、Tuple、Set、Dict)。

到這邊,你可能已經發現一件事:

「我的程式越寫越長,重複的程式碼也越來越多!」

比方說:

  • 你寫了 3 次「計算 BMI」的程式
  • 你寫了 5 次「輸入帳號密碼驗證」的程式
  • 你甚至複製貼上過好幾次「點餐總金額計算」的程式

這樣一來程式就會變得冗長、難維護,也不方便之後修改。

這時候,Python 就幫我們準備了一個
「把程式碼收納起來、想用再叫出來」的魔法盒子—— 函式 (function)

ㄧ、什麼是函式 (function)?

簡單一句話:

函式就是「把程式打包起來,取一個名字,想用就呼叫它」的東西。

有點像家裡的「電鍋」:

  • 你只要「按開關」(呼叫函式),
  • 電鍋就會自動跑一堆流程(裡面的程式碼),
  • 最後給你結果(回傳值)。

這邊要特別注意一下:

def 後方通常會放上函式名稱 ( 名稱不能和變數名稱重複 )、輸入參數的小括號,
後方再加上一個冒號,函式的程式採用「縮排」的方式表現 !

語法長這樣:

def 函式名稱(參數):
    # 程式內容
    return 回傳值
  • def:代表「定義函式」
  • 函式名稱:自己取的名字(要有意義,像是 bmiaddgreet
  • 參數:函式需要的輸入(像是身高、體重、姓名)
  • return:函式的輸出結果(可以有,也可以沒有)

注意幾個重點:

  • 函式名稱:要有意義,不要亂取 a()test1(),建議用小寫與底線,例如 calculate_area()
  • 縮排必須正確:函式內的程式一定要縮排(通常是四個空格)。
  • 函式先宣告再呼叫:Python 會先讀程式,遇到還沒定義的函式就會噴錯。

範例:

def say_hello():
    print("哈囉,我是 Python!第17屆IThome鐵人賽,沒在獨自升級的一起來~")

say_hello()   # 呼叫函式

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721uBKcTaPnL2.png

用函式的好處就是:不用再寫 print,直接呼叫 say_hello() 就行。

二、有參數的函式

函式可以接收「外部傳入的資料」,讓同一個函式可以處理不同情況,而不是只能寫死。

1. 位置參數(Positional Arguments)

def greet(name):
    print(f"嗨,{name}!歡迎學 Python~")

greet("Sharon")
greet("John")

name 是函式的「參數」,呼叫時傳入的 "Sharon""John" 是「實際值」。

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721iQnis6Qgpe.png

2. 預設參數(Default Parameter)

如果呼叫時沒有傳值,可以用預設值。

def greet(name="Stranger"):
    print("Hello,", name)

greet()            # 使用預設值
greet("Sharon")    # 覆蓋預設值

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721foTf1CYtW6.png

很適合「可有可無」的情境,例如預設地區、預設分數。

3.關鍵字參數(Keyword Arguments)

直接指定參數名稱,不需要照順序。

def greet(name, age):
    print(f"{name} 已經 {age} 歲了")

greet(age=20, name="小華")   # 參數順序顛倒也沒問題

注意:

  • 位置參數必須在關鍵字參數前面
  • 錯誤示範
greet(age=20, "小華")  # ❌ 語法錯誤

新手常見錯誤:

(1) 少傳或多傳參數

def greet(name, age):
    print(name, age)

greet("小明")  # ❌ 缺少參數

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721rieMBbKDVM.png

(2).參數順序錯誤

def introduce(name, city):
    print(f"{name} 來自 {city}")

introduce("台北", "小美")  # ❌ 順序反了

如果怕順序錯誤的話,可以利用關鍵字參數:

introduce(city="台北", name="小美")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721OgP5QapDWZ.png

三、有回傳值(return)的函式

函式除了執行動作,也可以回傳一個結果,讓我們在外部使用。
函式通常會「輸入資料 → 計算 → 傳回結果」。
沒有return,函式預設回傳None。

def square(x):
    return x * x

print("平方:", square(5))

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/2016472163nXioPoJF.png

def add(a, b):
    return a + b

result = add(3, 5)
print("加總結果:", result)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721ZHSmgOOQaQ.png

⚠️ 新手常見錯誤

  • 以為 print() 就等於回傳值 (錯誤想法)

https://ithelp.ithome.com.tw/upload/images/20251003/20164721Yup6ulj4rF.png

正確作法:

def add(a, b):
    return a + b

四、同名函式 (函式覆蓋)

在 Python 裡,如果你定義了兩個同名函式,後面會覆蓋掉前面的。

def greet():
    print("哈囉")

def greet(name):
    print("哈囉", name)

greet("小明")  

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721DDUzJNdHyM.png

建議:命名要清楚有意義,避免同名。

五、不定個數參數 (*args, **kwargs)

有時候我們不知道使用者會傳幾個參數,這時候就可以用:

  • *args:接收「不定數量的位置參數」
  • *kwargs:接收「不定數量的關鍵字參數」
  1. *args:接收多個位置參數, 將多個位置參數打包成一個 tuple。
  • 應用場景: 當你不知道函數會接收多少個參數時,可以使用 *args。
def add_all(*numbers):
    total = 0
    for n in numbers:
        total += n
    return total

print("1+2+3 =",add_all(1, 2, 3))       # 6
print("10+20+30+5 =",add_all(10, 20, 30, 5)) # 65

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721wGqAvzp6pI.png

2.*kwargs :接收多個「鍵=值」參數,將多個關鍵字參數打包成一個 dictionary。

  • 應用場景: 當你希望函數能接受任意多的命名參數時,可以使用 **kwargs。

範例1:

def show_info(**person):
    for key, value in person.items():
        print(f"{key}: {value}")

show_info(name="小美", age=20, city="台北")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/201647210t20YAshX7.png

範例2:

def personInfo(name, age, **other):
    print("==== info ====")
    print("name:", name)
    print("age:", age)
    for key in other:
        print(key, ":", other[key])

personInfo("Sharon", 40)
personInfo("David", 35, phone="0987654321", company="TSMC")
personInfo("Amy", 28, email="amy@gmail.com", company="Google", gender="Female")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/20164721qnSA0I5R55.png

六、 混合使用順序

Python 規則:

位置參數 → 預設參數 → *args → 關鍵字參數 → **kwargs

def test(a, b=10, *args, c, **kwargs):
    print(a, b, args, c, kwargs)

test(1, 2, 3, 4, c=5, x=100, y=200)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/201647211YLg4n8azO.png

七、實戰演練

範例1:不定長度參數 *args(點餐系統)

menu = {"漢堡": 50, "薯條": 30, "可樂": 20, "炸雞": 70}

def calc_order(*items):
    total = sum(menu[item] for item in items if item in menu)
    return total

print("=== 菜單 ===")
for food, price in menu.items():
    print(f"{food}:{price} 元")

order = []
while True:
    choice = input("請輸入餐點(輸入 q 結束):")
    if choice == "q":
        break
    if choice not in menu:
        print("⚠️ 沒有這道餐點")
        continue
    order.append(choice)

print("您的餐點:", order)
print("總金額:", calc_order(*order))

輸出:
https://ithelp.ithome.com.tw/upload/images/20251003/201647211UaG9JYFtT.png

範例2:BMI 計算器

def calculate_bmi(weight, height):
    bmi = weight / (height ** 2)
    return bmi

def bmi_category(bmi):
    if bmi < 18.5:
        return "過輕"
    elif bmi < 24:
        return "正常"
    elif bmi < 27:
        return "過重"
    else:
        return "肥胖"

weight = float(input("請輸入體重(kg):"))
height = float(input("請輸入身高(m):"))

bmi = calculate_bmi(weight, height)
print("你的 BMI 值:", round(bmi, 2), "類別:", bmi_category(bmi))

輸出:

https://ithelp.ithome.com.tw/upload/images/20251003/201647210naz8sVoGC.png

今日結語

辛苦啦!謝謝大家願意看我幾乎每篇都ㄌㄡˋㄌㄡˋㄉㄥˊ的文章!
不過在撰寫文章的同時,我自己也在進步當中~!
每篇文章的字字句句都是經過我內化過後加上我大學的學習經驗所整理出來的!!
不過我也有可能會有寫錯的時候~也歡迎糾正及討論呦~

今天我們學會了函式的基本概念:

  • 怎麼把程式打包、取名字、想用就呼叫
  • 參數怎麼帶:位置參數、預設參數、關鍵字參數
  • 回傳值的使用
  • 不定參數 *args*kwargs

函式的好處應該很明顯了吧——程式變短、重複程式碼少、維護更方便!

明天我們會進入 進階函式的世界,學習更多實用技巧!
有空的話,可以先多練習今天教的範例和語法重點,這樣明天上手會更快喔~

那麼,我們明天見啦!✨


上一篇
【Day18】集合型態壓軸登場:Dictionary 字典
下一篇
【Day20】打包你的程式碼,隨時呼叫!——函式實戰指南(下)
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言