python 函數(shù)定義與使用實踐案例
第6篇:函數(shù)定義與使用
函數(shù)概述
函數(shù)是組織好的、可重復(fù)使用的、用來實現(xiàn)單一或相關(guān)聯(lián)功能的代碼段。函數(shù)能夠提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。
函數(shù)的優(yōu)點
- 代碼重用:避免重復(fù)編寫相同功能的代碼
- 模塊化:將復(fù)雜問題分解為更小的部分
- 可維護(hù)性:修改功能時只需修改函數(shù)定義
- 可讀性:使代碼結(jié)構(gòu)更清晰,易于理解
函數(shù)定義
在Python中使用def關(guān)鍵字定義函數(shù)。
基本語法
def 函數(shù)名(參數(shù)列表):
"""文檔字符串(可選)"""
函數(shù)體
return 返回值 # 可選
簡單函數(shù)示例
# 定義一個簡單的函數(shù)
def greet():
"""打印問候語"""
print("Hello, World!")
# 調(diào)用函數(shù)
greet() # 輸出:Hello, World!
# 帶參數(shù)的函數(shù)
def greet_person(name):
"""向指定的人問好"""
print(f"Hello, {name}!")
greet_person("張三") # 輸出:Hello, 張三!
greet_person("李四") # 輸出:Hello, 李四!函數(shù)調(diào)用
調(diào)用函數(shù)時需要使用函數(shù)名后跟圓括號,圓括號中可以包含傳遞給函數(shù)的參數(shù)。
基本調(diào)用
# 定義函數(shù)
def say_hello():
print("Hello!")
# 調(diào)用函數(shù)
say_hello() # 輸出:Hello!
# 多次調(diào)用
say_hello() # 輸出:Hello!
say_hello() # 輸出:Hello!函數(shù)調(diào)用的過程
def calculate_sum(a, b):
"""計算兩個數(shù)的和"""
result = a + b
return result
# 調(diào)用函數(shù)并保存返回值
sum_result = calculate_sum(10, 20)
print(sum_result) # 輸出:30
# 直接使用函數(shù)返回值
print(calculate_sum(5, 15)) # 輸出:20函數(shù)參數(shù)
函數(shù)參數(shù)允許我們向函數(shù)傳遞數(shù)據(jù),使函數(shù)更加靈活。
位置參數(shù)
def introduce(name, age):
"""介紹一個人"""
print(f"我叫{name},今年{age}歲")
# 按位置傳遞參數(shù)
introduce("張三", 25) # 輸出:我叫張三,今年25歲
# 參數(shù)順序很重要
introduce(25, "張三") # 輸出:我叫25,今年張三歲(邏輯錯誤)關(guān)鍵字參數(shù)
def introduce(name, age):
"""介紹一個人"""
print(f"我叫{name},今年{age}歲")
# 使用關(guān)鍵字參數(shù),順序可以改變
introduce(age=25, name="張三") # 輸出:我叫張三,今年25歲
# 混合使用位置參數(shù)和關(guān)鍵字參數(shù)
introduce("李四", age=30) # 輸出:我叫李四,今年30歲
# 注意:位置參數(shù)必須在關(guān)鍵字參數(shù)之前
# introduce(age=30, "李四") # 錯誤!默認(rèn)參數(shù)
def greet(name, greeting="Hello"):
"""問候函數(shù),默認(rèn)問候語為Hello"""
print(f"{greeting}, {name}!")
# 使用默認(rèn)參數(shù)
greet("張三") # 輸出:Hello, 張三!
# 覆蓋默認(rèn)參數(shù)
greet("李四", "你好") # 輸出:你好, 李四!
greet("王五", greeting="Hi") # 輸出:Hi, 王五!可變參數(shù)
# *args:接收任意數(shù)量的位置參數(shù)
def sum_all(*args):
"""計算所有參數(shù)的和"""
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 輸出:6
print(sum_all(1, 2, 3, 4, 5)) # 輸出:15
# **kwargs:接收任意數(shù)量的關(guān)鍵字參數(shù)
def print_info(**kwargs):
"""打印所有關(guān)鍵字參數(shù)"""
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="張三", age=25, city="北京")
# 輸出:
# name: 張三
# age: 25
# city: 北京參數(shù)組合使用
def complex_function(a, b=10, *args, **kwargs):
"""復(fù)雜的參數(shù)組合示例"""
print(f"位置參數(shù)a: {a}")
print(f"默認(rèn)參數(shù)b: ")
print(f"可變位置參數(shù)args: {args}")
print(f"可變關(guān)鍵字參數(shù)kwargs: {kwargs}")
# 調(diào)用函數(shù)
complex_function(1, 2, 3, 4, 5, name="張三", age=25)
# 輸出:
# 位置參數(shù)a: 1
# 默認(rèn)參數(shù)b: 2
# 可變位置參數(shù)args: (3, 4, 5)
# 可變關(guān)鍵字參數(shù)kwargs: {'name': '張三', 'age': 25}返回值
函數(shù)可以使用return語句返回值。
基本返回值
def add(a, b):
"""計算兩個數(shù)的和"""
return a + b
result = add(10, 20)
print(result) # 輸出:30
# 函數(shù)可以返回任意類型的值
def get_user_info():
"""返回用戶信息"""
return {"name": "張三", "age": 25}
user = get_user_info()
print(user) # 輸出:{'name': '張三', 'age': 25}返回多個值
def calculate(a, b):
"""計算兩個數(shù)的和與積"""
sum_result = a + b
product_result = a * b
return sum_result, product_result
# 接收多個返回值
sum_val, product_val = calculate(3, 4)
print(f"和:{sum_val},積:{product_val}") # 輸出:和:7,積:12
# 也可以作為元組接收
result = calculate(3, 4)
print(result) # 輸出:(7, 12)無返回值的函數(shù)
def print_message(message):
"""打印消息"""
print(message)
# 沒有return語句,隱式返回None
result = print_message("Hello")
print(result) # 輸出:None變量作用域
變量的作用域決定了變量在程序中的可見范圍。
局部變量
def my_function():
"""演示局部變量"""
local_var = "我是局部變量"
print(local_var)
my_function()
# print(local_var) # 錯誤:局部變量在函數(shù)外部不可訪問全局變量
global_var = "我是全局變量"
def access_global():
"""訪問全局變量"""
print(global_var) # 可以訪問全局變量
access_global()
print(global_var) # 在全局作用域也可以訪問
def modify_global():
"""修改全局變量"""
global global_var # 聲明使用全局變量
global_var = "我被修改了"
print(global_var)
modify_global()
print(global_var) # 輸出:我被修改了嵌套函數(shù)中的變量作用域
def outer_function():
"""外層函數(shù)"""
outer_var = "外層變量"
def inner_function():
"""內(nèi)層函數(shù)"""
inner_var = "內(nèi)層變量"
print(f"在內(nèi)層函數(shù)中訪問外層變量:{outer_var}")
print(f"內(nèi)層變量:{inner_var}")
inner_function()
# print(inner_var) # 錯誤:內(nèi)層變量在外層函數(shù)中不可訪問
outer_function()nonlocal關(guān)鍵字
def outer_function():
"""演示nonlocal關(guān)鍵字"""
x = 10
def inner_function():
nonlocal x # 聲明使用外層函數(shù)的變量
x += 5
print(f"內(nèi)層函數(shù)中的x:{x}")
print(f"調(diào)用內(nèi)層函數(shù)前的x:{x}")
inner_function()
print(f"調(diào)用內(nèi)層函數(shù)后的x:{x}")
outer_function()
# 輸出:
# 調(diào)用內(nèi)層函數(shù)前的x:10
# 內(nèi)層函數(shù)中的x:15
# 調(diào)用內(nèi)層函數(shù)后的x:15匿名函數(shù)
匿名函數(shù)是不帶名稱的函數(shù),使用lambda關(guān)鍵字定義。
基本語法
lambda 參數(shù): 表達(dá)式
簡單示例
# 定義匿名函數(shù)
square = lambda x: x ** 2
print(square(5)) # 輸出:25
# 匿名函數(shù)用于簡單計算
add = lambda x, y: x + y
print(add(3, 4)) # 輸出:7
# 匿名函數(shù)用于字符串操作
upper_case = lambda s: s.upper()
print(upper_case("hello")) # 輸出:HELLO匿名函數(shù)的應(yīng)用
# 與內(nèi)置函數(shù)結(jié)合使用
numbers = [1, 2, 3, 4, 5]
# 使用map函數(shù)和lambda
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # 輸出:[1, 4, 9, 16, 25]
# 使用filter函數(shù)和lambda
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 輸出:[2, 4]
# 使用sorted函數(shù)和lambda
students = [("張三", 85), ("李四", 90), ("王五", 78)]
sorted_students = sorted(students, key=lambda x: x[1])
print(sorted_students) # 輸出:[('王五', 78), ('張三', 85), ('李四', 90)]高階函數(shù)
高階函數(shù)是接受函數(shù)作為參數(shù)或返回函數(shù)的函數(shù)。
函數(shù)作為參數(shù)
def apply_operation(a, b, operation):
"""應(yīng)用指定的操作"""
return operation(a, b)
def add(x, y):
"""加法函數(shù)"""
return x + y
def multiply(x, y):
"""乘法函數(shù)"""
return x * y
# 將函數(shù)作為參數(shù)傳遞
result1 = apply_operation(5, 3, add)
result2 = apply_operation(5, 3, multiply)
print(result1) # 輸出:8
print(result2) # 輸出:15函數(shù)作為返回值
def create_multiplier(n):
"""創(chuàng)建乘法器函數(shù)"""
def multiplier(x):
return x * n
return multiplier
# 創(chuàng)建不同的乘法器
double = create_multiplier(2)
triple = create_multiplier(3)
print(double(5)) # 輸出:10
print(triple(5)) # 輸出:15遞歸函數(shù)
遞歸函數(shù)是調(diào)用自身的函數(shù),必須有終止條件。
基本遞歸示例
def factorial(n):
"""計算階乘"""
# 基礎(chǔ)情況:遞歸終止條件
if n == 0 or n == 1:
return 1
# 遞歸情況
else:
return n * factorial(n - 1)
print(factorial(5)) # 輸出:120
def fibonacci(n):
"""計算斐波那契數(shù)列"""
# 基礎(chǔ)情況
if n <= 1:
return n
# 遞歸情況
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(6)) # 輸出:8遞歸注意事項
import sys # 查看遞歸限制 print(sys.getrecursionlimit()) # 通常為1000 # 設(shè)置遞歸限制(謹(jǐn)慎使用) # sys.setrecursionlimit(2000)
函數(shù)文檔字符串
文檔字符串(docstring)用于描述函數(shù)的功能、參數(shù)和返回值。
基本格式
def calculate_area(length, width):
"""
計算矩形面積
參數(shù):
length (float): 矩形的長度
width (float): 矩形的寬度
返回:
float: 矩形的面積
示例:
>>> calculate_area(5, 3)
15
"""
return length * width
# 查看函數(shù)文檔
print(calculate_area.__doc__)
help(calculate_area)詳細(xì)的文檔字符串
def complex_calculation(x, y, operation="add"):
"""
執(zhí)行復(fù)雜的數(shù)學(xué)計算
這個函數(shù)可以根據(jù)指定的操作對兩個數(shù)進(jìn)行計算。
參數(shù):
x (float): 第一個操作數(shù)
y (float): 第二個操作數(shù)
operation (str, optional): 操作類型,可選值為"add", "subtract",
"multiply", "divide"。默認(rèn)為"add"
返回:
float: 計算結(jié)果
異常:
ValueError: 當(dāng)操作類型不支持時拋出
ZeroDivisionError: 當(dāng)除數(shù)為0時拋出
示例:
>>> complex_calculation(10, 5, "add")
15.0
>>> complex_calculation(10, 5, "multiply")
50.0
"""
operations = {
"add": lambda a, b: a + b,
"subtract": lambda a, b: a - b,
"multiply": lambda a, b: a * b,
"divide": lambda a, b: a / b
}
if operation not in operations:
raise ValueError(f"不支持的操作類型: {operation}")
if operation == "divide" and y == 0:
raise ZeroDivisionError("除數(shù)不能為0")
return operations[operation](x, y)函數(shù)最佳實踐
函數(shù)設(shè)計原則
# 1. 函數(shù)應(yīng)該只做一件事,并且做好
def calculate_sum(numbers):
"""計算數(shù)字列表的和"""
return sum(numbers)
def find_maximum(numbers):
"""找出數(shù)字列表中的最大值"""
return max(numbers)
# 2. 函數(shù)名應(yīng)該清晰表達(dá)函數(shù)的功能
def is_even(number):
"""判斷數(shù)字是否為偶數(shù)"""
return number % 2 == 0
# 3. 參數(shù)應(yīng)該有合理的默認(rèn)值
def create_greeting(name, greeting="Hello"):
"""創(chuàng)建問候語"""
return f"{greeting}, {name}!"
# 4. 函數(shù)應(yīng)該有適當(dāng)?shù)奈臋n字符串
def convert_temperature(temp, from_unit, to_unit):
"""
轉(zhuǎn)換溫度單位
參數(shù):
temp (float): 溫度值
from_unit (str): 源單位 ("C" 或 "F")
to_unit (str): 目標(biāo)單位 ("C" 或 "F")
返回:
float: 轉(zhuǎn)換后的溫度值
"""
if from_unit == "C" and to_unit == "F":
return temp * 9/5 + 32
elif from_unit == "F" and to_unit == "C":
return (temp - 32) * 5/9
else:
return temp
# 5. 處理異常情況
def safe_divide(a, b):
"""安全除法,處理除零異常"""
try:
return a / b
except ZeroDivisionError:
print("錯誤:除數(shù)不能為0")
return None函數(shù)測試
def test_functions():
"""測試函數(shù)功能"""
# 測試計算函數(shù)
assert calculate_sum([1, 2, 3, 4]) == 10
assert is_even(4) == True
assert is_even(5) == False
# 測試溫度轉(zhuǎn)換
assert abs(convert_temperature(0, "C", "F") - 32) < 0.01
assert abs(convert_temperature(32, "F", "C") - 0) < 0.01
print("所有測試通過!")
# 運行測試
test_functions()綜合應(yīng)用示例
# 學(xué)生成績管理系統(tǒng)
class StudentGradeManager:
"""學(xué)生成績管理器"""
def __init__(self):
self.students = []
def add_student(self, name, scores):
"""添加學(xué)生"""
student = {
"name": name,
"scores": scores,
"average": self.calculate_average(scores)
}
self.students.append(student)
def calculate_average(self, scores):
"""計算平均分"""
if not scores:
return 0
return sum(scores) / len(scores)
def get_grade(self, average):
"""根據(jù)平均分獲取等級"""
if average >= 90:
return "優(yōu)秀"
elif average >= 80:
return "良好"
elif average >= 70:
return "中等"
elif average >= 60:
return "及格"
else:
return "不及格"
def display_report(self):
"""顯示成績報告"""
print("學(xué)生成績報告")
print("-" * 40)
for student in self.students:
print(f"姓名: {student['name']}")
print(f"成績: {student['scores']}")
print(f"平均分: {student['average']:.2f}")
print(f"等級: {self.get_grade(student['average'])}")
print("-" * 40)
# 使用示例
manager = StudentGradeManager()
manager.add_student("張三", [85, 90, 78, 92])
manager.add_student("李四", [76, 88, 82, 79])
manager.display_report()總結(jié)
本篇教程詳細(xì)介紹了Python函數(shù)的定義與使用,包括函數(shù)參數(shù)、返回值、變量作用域、匿名函數(shù)、高階函數(shù)、遞歸函數(shù)等重要概念。我們還學(xué)習(xí)了如何編寫清晰的文檔字符串和遵循函數(shù)設(shè)計的最佳實踐。
函數(shù)是Python編程的核心概念之一,掌握函數(shù)的使用對于編寫模塊化、可維護(hù)的代碼至關(guān)重要。
到此這篇關(guān)于python 函數(shù)定義與使用實踐記錄的文章就介紹到這了,更多相關(guān)python 函數(shù)定義與使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Numpy中argsort()函數(shù)的用法解讀
這篇文章主要介紹了關(guān)于Numpy中argsort()函數(shù)的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
用Python將mysql數(shù)據(jù)導(dǎo)出成json的方法
今天小編就為大家分享一篇用Python將mysql數(shù)據(jù)導(dǎo)出成json的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
用TensorFlow實現(xiàn)多類支持向量機的示例代碼
這篇文章主要介紹了用TensorFlow實現(xiàn)多類支持向量機的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
python處理csv數(shù)據(jù)動態(tài)顯示曲線實例代碼
這篇文章主要介紹了python處理csv數(shù)據(jù)動態(tài)顯示曲線實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
python matplotlib坐標(biāo)軸設(shè)置的方法
本篇文章主要介紹了python matplotlib坐標(biāo)軸設(shè)置的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

