Python 函數:定義、參數、匿名函數與作用域
Python 中的函數是一組可以重複使用的代碼塊,用來完成特定任務。函數不僅能提高代碼的結構性和可讀性,還可以降低開發維護成本。Python 提供大量內建函數,如 print() 和 len(),並允許開發者自定義函數以處理具體的需求。
撰寫一個函數 add(x, y),返回兩個數的和。
def add(x, y): return x + yresult = add(5, 3)print(f"result:{result}") |
撰寫一個函數 greet(name, greeting="Hello"),根據不同的輸入參數輸出不同的問候語。結果會顯示"Hello, Alice!"
def greet(name, greeting="Hello"): return f"{greeting}, {name}!"print(greet("Alice")) |
這邊會顯示"Good morning, Bob!",原因是我把greet這個function傳入參數greeting改成"Good morning"
print(greet("Bob", "Good morning")) |
匿名函數:使用 lambda 函數對一個數字列表進行排序。
- 什麼是匿名函數?
在 Python 中,匿名函數是一種沒有明確名稱的函數。它通常是一行簡單的運算或操作,用於臨時、簡單的計算場景。因為不需要用 def 關鍵字定義,所以我們稱之為「匿名」。匿名函數主要用在那些只需要臨時使用一次的函數情境中,例如排序、篩選資料或簡單的數學運算。
在 Python 中,匿名函數是透過 lambda 關鍵字來創建的。語法如下:
lambda arguments: expression |
lambda:關鍵字,告知 Python 這是一個匿名函數。
arguments:傳遞給函數的參數,可以是一個或多個。
expression:匿名函數所執行的操作,並且會返回該表達式的結果
- 另一個會使用到的是sorted函數
sorted(iterable, key=None, reverse=False)
iterable:要排序的對象,例如列表、元組等。
key:用於指定排序依據的函數。每個元素會通過 key 函數進行處理,並根據結果排序。
reverse:默認為 False,即升序排序。若設為 True 則為降序排序。
以下是lambda例子,初始化List內容 = [-5, 2, -9, 1, 7],以及利用內建函數sorted和匿名函式lambda結合使用,可以看到lambda x : abs(x) 所表示的是使用x當變數儲存,輸出為abs(x),所以當我傳入給sorted function時,展開的結果就是sorted([-5, 2, -9, 1, 7], key=abs(-5), abs(2), ... , abs(7)依序傳入給sorted函數)
numbers = [-5, 2, -9, 1, 7]sorted_numbers = sorted(numbers, key=lambda x: abs(x))print(f"sorted_numbers with absolute value:{sorted_numbers}") |
作用域:撰寫程式,展示局部變數和全局變數的不同效果。
這邊只是介紹Global variable,以及function內的local variable的差異,結果會是Inside:5, Outside:10
x = 10def demonstrate_scope(): x = 5 print(f"Inside:{x}")demonstrate_scope()print(f"outside:{x}") |
接下來會練習組合題型
1. 學生基本資料:輸入學生的姓名、年齡和專業,並利用 student_info() 輸出學生的詳細資料。如果沒有輸入專業,則顯示 "Undecided"。
2. 過濾年齡大於18的學生:定義一個學生字典列表,每個學生包含 name、age 和 major。使用 lambda 函數過濾出年齡大於 18 歲的學生並顯示相關信息。
3. 追蹤學生數量:使用全局變數 student_count 記錄學生數量,每次新增一個學生資料時,使用 update_student_count() 函數增加計數並顯示最新的學生數量。
首先先完成各點要求的functions, 在回到主程式call個個function
第1點要求,先建立student_info的function,如下所示,major假設function沒傳入這個參數,會被預設成undecided
def student_info(name, age, major="undecided"): return f"Name: {name}, Age: {age}, Major:{major}" |
第2點要求,使用filter內建函數以及匿名函數lambda來達成要求,
在這邊,students為一個Dictionary的List,例如 students = [ {'name': 'Alice', 'age': 17}, {'name': 'Bob', 'age': 19}, {'name': 'Charlie', 'age': 21} ]
lambda student: student['age'] > 18,則是作為filter的傳入參數,student會作為students內所包含的每個Dictionary,
在這個lambda表示式中,
以上面students = [ {'name': 'Alice', 'age': 17}, {'name': 'Bob', 'age': 19}, {'name': 'Charlie', 'age': 21} ]
想判斷的是把每個Dictionary,{'name': 'Alice', 'age': 17}, {'name': 'Bob', 'age': 19}, {'name': 'Charlie', 'age': 21}
的age欄位進行是否>18的判斷,在傳入filter
filter語法:
filter(function, iterable)
def filter_adults(students): return list(filter(lambda student: student["age"] > 18, students)) |
所以在這邊會變成return一個List然後是只有 age > 18的Dictionary會被留下。
第3點要求,先建好student_count作為Global variable,然後def update_student_count(),作為更新學生數量,python如果要在function內引入global變數,需要加入一個global的關鍵字,這樣他就能讀取到預先設置好的全域變數。
student_count = 0def update_student_count(): global student_count student_count += 1 print(f"Updated student count: {student_count}") |
接下來便是將上述3個function組裝
以下是程式碼範例:
student_list = []while True: name = input("Enter student's name(type quit to stop ): ") if name.lower() == "quit": break age = int(input("Enter student's age: ")) major = input( "Enter student's major(default is undecided if you press enter directly): " ) if not major: major = "undecided" student = {"name": name, "age": age, "major": major} print(student_info(name, age, major)) update_student_count() student_list.append(student)print(student_list) adults = filter_adults(student_list)print("\nStudents older than 18:")for student in adults: print(student_info(student["name"], student["age"], student["major"])) |
- 先創student_list作為空列表,
- 然後 while True無限迴圈讓程式一直要求使用者輸入資訊,直到使用者輸入quit便結束迴圈。
- 輸入age參數,major參數,若是沒輸入major參數直接按enter,這時程式會接major設定成空字串"",假設傳入空字串student_info(name, age, major="undecided"),這邊function的預設值也會沒用,因為我們帶入的參數major="",是有指定內容的,但內容為空字串,所以function認為有傳入值
- 將使用者輸入資訊建在student這個dictionary, student = {"name": name, "age": age, "major": major}
- 更新學生數量update_student_count()
- 將dictionary加到student_list中,student_list.append(student)
- 使用adults作為新list,去接filter_adults的回傳值
- 利用for + list的語法印出所有存在adults這個list裡面的所有dictionary內容
