Python 函數(Function)詳解:新手指南
更新日期: 2024 年 10 月 7 日
在 Python 編程中,函數(Function) 是一種非常重要的概念。
它們允許我們將代碼組織成可重用的塊,從而提高代碼的可讀性和維護性。
對於剛開始學習 Python 的新手來說,理解並掌握函數的定義、使用方法和最佳實踐,將大大提升您的編程能力和效率。
本文將詳細介紹 Python 中的函數,包括其基本概念、語法、引數傳遞、返回值、匿名函數和高階函數等,幫助您在實際開發中靈活運用。
什麼是函數?
函數(Function) 是一組執行特定任務的可重用代碼塊。
它們可以接受輸入引數,進行處理,並返回結果。函數有助於將代碼模塊化,提升代碼的可讀性和可維護性。
為什麼要使用函數?
- 代碼重用:避免重複編寫相同的代碼。
- 提高可讀性:將代碼邏輯分解為獨立的函數,結構更清晰。
- 易於維護:修改函數內部實現,不影響調用函數的代碼。
- 抽象:隱藏實現細節,提供簡潔的接口。
定義函數
在 Python 中,可以使用 def
關鍵字來定義函數。
語法:
def 函數名(引數列表):
"""文檔字串(可選)"""
函數體
return 返回值(可選)
示例:
def greet():
"""簡單的問候函數"""
print("Hello, World!")
函數的調用
定義函數後,可以通過函數名加括號來調用它。
示例:
greet() # 輸出:Hello, World!
函數引數
函數可以接受引數,以提高其靈活性。
Python 支持多種引數傳遞方式。
位置引數
按照位置順序傳遞的引數。
示例:
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 輸出:8
關鍵字引數
使用引數名稱進行傳遞,順序可以不一致。
示例:
def add(a, b):
return a + b
result = add(b=5, a=3)
print(result) # 輸出:8
默認引數
為引數提供默認值,調用時可以省略該引數。
示例:
def greet(name="Guest"):
print(f"Hello, {name}!")
greet() # 輸出:Hello, Guest!
greet("Alice") # 輸出:Hello, Alice!
可變引數(*args
, **kwargs
)
*args
:接收多個「位置引數」,並將其放入一個元組中。**kwargs
:接收多個「關鍵字引數」,並將其放入一個字典中。
示例:
def func(*args, **kwargs):
print("位置引數:", args)
print("關鍵字引數:", kwargs)
func(1, 2, 3, a=4, b=5)
# 輸出:
# 位置引數: (1, 2, 3)
# 關鍵字引數: {'a': 4, 'b': 5}
函數的返回值
函數可以使用 return
關鍵字返回結果。如果沒有 return
語句,函數默認返回 None
。
示例:
def square(x):
return x * x
result = square(4)
print(result) # 輸出:16
返回多個值:
def get_position():
x = 10
y = 20
return x, y
pos = get_position()
print(pos) # 輸出:(10, 20)
作用域與命名空間
- 局部作用域(Local Scope):函數內部定義的變量,只在函數內部可見。
- 全局作用域(Global Scope):函數外部定義的變量,整個模塊中都可見。
global
關鍵字:在函數內部修改全局變量。
示例:
x = 10 # 全局變量
def modify():
global x
x = 20 # 修改全局變量
modify()
print(x) # 輸出:20
匿名函數(Lambda 函數)
Lambda 函數 是一種簡單的匿名函數,使用 lambda
關鍵字定義。
語法:
lambda 引數列表: 表達式
示例:
square = lambda x: x * x
print(square(5)) # 輸出:25
在高階函數中使用:
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x * x, numbers))
print(squares) # 輸出:[1, 4, 9, 16, 25]
高階函數
高階函數 是指接收函數作為引數或返回函數作為結果的函數。
map()
函數
對可迭代物件中的每個元素應用函數,返回一個迭代器。
示例:
numbers = [1, 2, 3, 4, 5]
doubles = list(map(lambda x: x * 2, numbers))
print(doubles) # 輸出:[2, 4, 6, 8, 10]
filter()
函數
使用函數過濾可迭代物件中的元素,返回一個迭代器。
示例:
numbers = [1, 2, 3, 4, 5]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 輸出:[2, 4]
reduce()
函數
對可迭代物件中的元素進行累積計算,需從 functools
模塊導入。
示例:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 輸出:120
函數的文檔字串(Docstring)
使用三引號字符串在函數內部添加文檔字串,描述函數的功能。
示例:
def greet(name):
"""這是一個問候函數"""
print(f"Hello, {name}!")
print(greet.__doc__) # 輸出:這是一個問候函數
遞歸函數
遞歸函數 是指在函數內部調用自身的函數,適用於解決分解為相似子問題的問題。
示例:計算階乘
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # 輸出:120
注意:
- 遞歸需要有終止條件,否則會導致堆棧溢出。
- 遞歸深度不宜過深,可能超過 Python 的遞歸深度限制。
總結
- 函數 是可重用的代碼塊,用於實現特定的功能。
- 定義函數:使用
def
關鍵字,後跟函數名和引數列表。 - 函數引數:支持位置引數、關鍵字引數、默認引數和可變引數。
- 返回值:使用
return
返回結果,沒有return
時返回None
。 - 作用域:變量的可見範圍,由其定義的位置決定。
- 匿名函數:使用
lambda
關鍵字定義簡單的函數,常用於高階函數中。 - 高階函數:接收函數作為引數或返回函數作為結果的函數,如
map()
、filter()
、reduce()
。 - 遞歸函數:在函數內部調用自身,需要注意終止條件。
透過理解和掌握函數的使用,您可以編寫出結構清晰、可維護性高的代碼,為您的編程之旅打下堅實的基礎。