Python 函數:定義、參數、匿名函數與作用域


Python 中的函數是一組可以重複使用的代碼塊,用來完成特定任務。函數不僅能提高代碼的結構性和可讀性,還可以降低開發維護成本。Python 提供大量內建函數,如 print()len(),並允許開發者自定義函數以處理具體的需求。

 

撰寫一個函數 add(x, y),返回兩個數的和。
 

def add(x, y):
  return x + y
result = 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 = 10
def 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 = 0
def 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"]))
  1. 先創student_list作為空列表,
  2. 然後 while True無限迴圈讓程式一直要求使用者輸入資訊,直到使用者輸入quit便結束迴圈。
  3. 輸入age參數,major參數,若是沒輸入major參數直接按enter,這時程式會接major設定成空字串"",假設傳入空字串student_info(name, age, major="undecided"),這邊function的預設值也會沒用,因為我們帶入的參數major="",是有指定內容的,但內容為空字串,所以function認為有傳入值
  4. 將使用者輸入資訊建在student這個dictionary, student = {"name": name, "age": age, "major": major}
  5. 更新學生數量update_student_count()
  6. 將dictionary加到student_list中,student_list.append(student)
  7. 使用adults作為新list,去接filter_adults的回傳值
  8. 利用for + list的語法印出所有存在adults這個list裡面的所有dictionary內容

 

 

 

 

文章標籤
全站熱搜
創作者介紹
創作者 Luke 的頭像
Luke

Luke的部落格

Luke 發表在 痞客邦 留言(0) 人氣(16)