lesson16:Python函數的認識

目錄

一、為什么需要函數?

1. 拒絕重復造輪子

2. 讓代碼像句子一樣可讀

3. 隔離變化,降低維護成本

二、函數的定義:編寫高質量函數的5個要素

基本語法框架

1. 函數命名的黃金法則(PEP8規范)

2. 不可或缺的文檔字符串(Docstring)

3. 參數設計的藝術

4. 函數體的單一職責原則

5. 返回值的清晰表達

三、函數調用:3種傳遞參數的方式

1. 位置參數(最常用)

2. 關鍵字參數(提升可讀性)

3. 混合使用(位置參數在前)

四、形參VS實參:參數的"前世今生"

生動案例:快遞柜的故事

參數傳遞的注意事項

五、實戰進階:溫度轉換工具函數

六、避坑指南:初學者常犯的5個錯誤

1. 縮進錯誤(IndentationError)

2. 參數數量不匹配(TypeError)

3. 忽略返回值

4. 函數名拼寫錯誤

5. 在函數定義前調用函數

七、總結與練習


一、為什么需要函數?

在編程中,函數就像一個"功能盒子"——把重復執行的代碼塊打包起來,需要時直接"調用"這個盒子即可。想象你每天早上都要做三件事:刷牙、洗臉、吃早餐。如果把這三個動作寫成代碼,沒有函數的話,每次都要重復寫三遍相同的步驟;而有了函數,你可以把它們分別定義成brush_teeth()wash_face()eat_breakfast()三個函數,之后只需依次調用這三個函數名即可。

函數的核心目的

  • 代碼復用:避免重復編寫相同邏輯
  • 模塊化:將復雜問題拆解為小任務
  • 可讀性:用函數名直接體現代碼功能

函數就是代碼世界的"工序卡",解決三大核心問題:

1. 拒絕重復造輪子

沒有函數的代碼:

# 計算三個矩形的面積
print(5*3) # 第一個矩形
print(4*6) # 第二個矩形
print(7*2) # 第三個矩形

有函數的代碼:

def calculate_rect_area(width, height):
return width * heightprint(calculate_rect_area(5,3)) # 復用相同邏輯
print(calculate_rect_area(4,6))
print(calculate_rect_area(7,2))

2. 讓代碼像句子一樣可讀

# 不好的代碼:一堆數字和符號
if score >= 90 and score <= 100:
print("優秀")# 好的代碼:函數名即注釋
def is_excellent(score):
return 90 <= score <= 100if is_excellent(score):
print("優秀")

3. 隔離變化,降低維護成本

當計算面積的公式需要修改(比如增加單位轉換),只需修改函數內部,而不用在代碼中到處查找width*height的片段。

二、函數的定義:編寫高質量函數的5個要素

基本語法框架

def 函數名(參數列表):"""函數文檔字符串(可選但推薦)"""# 函數體(縮進4個空格)return 返回值 # 可選

1. 函數命名的黃金法則(PEP8規范)

  • 全部小寫,用下劃線分隔:calculate_area??,CalculateArea??
  • 使用動詞或動詞短語:get_user_info??,user_info??
  • 避免單字母命名(除常見約定:i/j循環變量,x/y坐標)

2. 不可或缺的文檔字符串(Docstring)

def calculate_circle_area(radius):
"""計算圓的面積參數:
radius (float): 圓的半徑,必須大于0返回:
float: 圓的面積(πr2)異常:
ValueError: 當半徑為負數時觸發
"""
if radius < 0:
raise ValueError("半徑不能為負數")
return 3.14159 * radius **2

技巧:在PyCharm等IDE中輸入"""按回車,會自動生成文檔字符串模板

3. 參數設計的藝術

  • 必要參數:必須傳遞的參數(如radius
  • 默認參數:帶有默認值的參數(def greet(name="Guest")
  • 參數順序:重要參數放前面,可選參數放后面

4. 函數體的單一職責原則

一個函數只做一件事!以下是反面教材:

def bad_function(user_id):
# 同時做三件事:查詢用戶、發郵件、記錄日志
user = db.query(user_id)
send_email(user.email)
log_activity(user_id)
return user

5. 返回值的清晰表達

  • 始終返回同一類型(避免有時返回列表,有時返回None)
  • 復雜邏輯用多個return提前退出,比嵌套if更清晰:
def get_grade(score):
if score < 0 or score > 100:
return "無效分數" # 提前返回異常情況
if score >= 90:
return "A"
if score >= 80:
return "B"
# ...其他分數段

三、函數調用:3種傳遞參數的方式

1. 位置參數(最常用)

按參數定義順序傳遞:

def divide(dividend, divisor):
return dividend / divisorresult = divide(10, 2) # dividend=10, divisor=2

2. 關鍵字參數(提升可讀性)

明確指定參數名,順序可以打亂:

result = divide(dividend=10, divisor=2)
# 等價于
result = divide(divisor=2, dividend=10)

3. 混合使用(位置參數在前)

def greet(title, name):
return f"{title}. {name}"greet("Mr", name="Smith") # 正確:位置參數在前
# greet(title="Mr", "Smith") # 錯誤:關鍵字參數不能在位置參數前

四、形參VS實參:參數的"前世今生"

維度形參(形式參數)實參(實際參數)
位置函數定義時?def func(x, y)函數調用時?func(3, 5)
本質函數內部的局部變量聲明傳遞給函數的具體值/變量
生命周期函數調用期間存在遵循自身的變量作用域

生動案例:快遞柜的故事

  • 形參:快遞柜上的"格子A"、"格子B"(定義了存放位置)
  • 實參:你放入格子A的"手機"、格子B的"鑰匙"(實際存放的物品)
  • 函數調用:快遞柜系統執行"存儲(格子A, 手機)"操作

參數傳遞的注意事項

def add_one(num):
num += 1 # 形參的修改不影響實參x = 5
add_one(x)
print(x) # 輸出:5(x的值未改變)

五、實戰進階:溫度轉換工具函數

讓我們構建一個完整的溫度轉換模塊,包含:

  1. 攝氏度轉華氏度
  2. 華氏度轉攝氏度
  3. 參數驗證功能
def celsius_to_fahrenheit(celsius):
"""攝氏度轉華氏度 (°F = °C × 9/5 + 32)"""
if not isinstance(celsius, (int, float)):
raise TypeError("溫度必須是數字")
if celsius < -273.15:
raise ValueError("溫度不能低于絕對零度(-273.15°C)")
return celsius * 9/5 + 32def fahrenheit_to_celsius(fahrenheit):
"""華氏度轉攝氏度 (°C = (°F - 32) × 5/9)"""
if not isinstance(fahrenheit, (int, float)):
raise TypeError("溫度必須是數字")
if fahrenheit < -459.67:
raise ValueError("溫度不能低于絕對零度(-459.67°F)")
return (fahrenheit - 32) * 5/9# 使用示例
try:
temp_f = celsius_to_fahrenheit(25)
print(f"25°C = {temp_f:.1f}°F") # 輸出:25°C = 77.0°Ftemp_c = fahrenheit_to_celsius(77)
print(f"77°F = {temp_c:.1f}°C") # 輸出:77°F = 25.0°C
except (TypeError, ValueError) as e:
print(f"轉換失敗:{e}")

六、避坑指南:初學者常犯的5個錯誤

1. 縮進錯誤(IndentationError)

def my_func():
print("Hello") # 錯誤:函數體沒有縮進

2. 參數數量不匹配(TypeError)

def add(a, b):
return a + badd(1) # 錯誤:缺少1個位置參數

3. 忽略返回值

def calculate_sum(a, b):
result = a + b # 錯誤:沒有return語句total = calculate_sum(3, 5)
print(total) # 輸出:None

4. 函數名拼寫錯誤

def print_greeting():
print("Hello")print_greetng() # 錯誤:函數名拼寫錯誤(少了一個i)

5. 在函數定義前調用函數

my_func() # 錯誤:調用時函數還未定義def my_func():
print("Hello")

七、總結與練習

函數是編程的基礎模塊,掌握其定義規范、調用邏輯和參數傳遞機制,是寫出簡潔、高效、可維護代碼的關鍵。后續將深入學習參數進階用法(默認參數、不定長參數等)和函數作用域,進一步提升代碼靈活性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89332.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過輪詢方式使用LoRa DTU有什么缺點?

在物聯網系統中&#xff0c;DTU&#xff08;Data Transfer Unit&#xff09;通常用于通過485或M-Bus等接口抄讀子設備的數據&#xff0c;并將這些數據傳輸到平臺側。然而&#xff0c;如果DTU采用輪詢方式與平臺通信&#xff0c;會帶來一系列問題&#xff0c;尤其是在功耗和系統…

Syntax Error: Error: PostCSS received undefined instead of CSS string

報錯&#xff1a;Syntax Error: Error: PostCSS received undefined instead of CSS string npm rebuild node-sass報錯&#xff1a;npm i canvas 報錯 canvas2.11.2 run install node-pre-gyp install --fallback-to-build --update-binary npm install canvas --canvas_binar…

人工智能之數學基礎:概率論和數理統計在機器學習的地位

概率和統計的概念概率統計是各類學科中唯一一門專門研究隨機現象的規律性的學科&#xff0c;隨機現象的廣泛性決定了這一學科的重要性。概率論是數學的分支&#xff0c;它研究的是如何定量描述隨機現象及其規律。我們之前經常在天氣軟件上看到&#xff1a;“今天下雨的概率是95…

第十四章 Stream API

JAVA語言引入了一個流式Stream API,這個API對集合數據進行操作&#xff0c;類似于使用SQL執行的數據庫查詢&#xff0c;同樣可以使用Stream API并行執行操作。Stream和Collection的區別Collection:靜態的內存數據結構&#xff0c;強調的是數據。Stream API:和集合相關的計算操作…

Oracle數據庫各版本間的技術迭代詳解

今天我想和大家聊聊一個我們可能每天都在用&#xff0c;但未必真正了解的技術——Oracle數據庫的版本。如果你是企業的IT工程師&#xff0c;可能經歷過“升級數據庫”的頭疼&#xff1b;如果你是業務負責人&#xff0c;可能疑惑過“為什么一定要換新版本”&#xff1b;甚至如果…

論文reading學習記錄3 - weekly - 模塊化視覺端到端ST-P3

文章目錄前言一、摘要與引言二、Related Word2.1 可解釋的端到端架構2.2 鳥瞰圖2.3 未來預測2.4 規劃三、方法3.1 感知bev特征積累3.1.1 空間融合&#xff08;幀的對齊&#xff09;3.1.2 時間融合3.2 預測&#xff1a;雙路徑未來建模3.3 規劃&#xff1a;先驗知識的整合與提煉4…

crawl4ai--bitcointalk爬蟲實戰項目

&#x1f4cc; 項目目標本項目旨在自動化抓取 Bitcointalk 論壇中指定板塊的帖子數據&#xff08;包括主貼和所有回復&#xff09;&#xff0c;并提取出結構化信息如標題、作者、發帖時間、用戶等級、活躍度、Merit 等&#xff0c;以便進一步分析或使用。本項目只供科研學習使用…

調用 System.gc() 的弊端及修復方式

弊端分析不可控的執行時機System.gc() 僅是 建議 JVM 執行垃圾回收&#xff0c;但 JVM 可自由忽略該請求&#xff08;尤其是高負載時&#xff09;。實際回收時機不確定&#xff0c;無法保證內存及時釋放。嚴重的性能問題Stop-The-World 停頓&#xff1a;觸發 Full GC 時會暫停所…

git merge 和 git rebase 的區別

主要靠一張圖&#xff1a;區別 git merge git checkout feature git merge master此時在feature上git會自動產生一個新的commit 修改的是當前分支 feature。 git rebase git checkout feature git rebase master&#xff08;在feature分支上執行&#xff0c;修改的是master分支…

Java學習--JVM(2)

JVM提供垃圾回收機制&#xff0c;其也是JVM的核心機制&#xff0c;其主要是實現自動回收不再被引用的對象所占用的內存&#xff1b;對內存進行整理&#xff0c;防止內存碎片化&#xff1b;以及對內存分配配進行管理。JVM 通過兩種主要算法判斷對象是否可回收&#xff1a;引用計…

用大模型(qwen)提取知識三元組并構建可視化知識圖譜:從文本到圖譜的完整實現

引言 知識圖譜作為一種結構化的知識表示方式&#xff0c;在智能問答、推薦系統、數據分析等領域有著廣泛應用。在信息爆炸的時代&#xff0c;如何從非結構化文本中提取有價值的知識并進行結構化展示&#xff0c;是NLP領域的重要任務。知識三元組&#xff08;Subject-Relation-O…

(附源碼)基于 Go 和 gopacket+Fyne 的跨平臺網絡抓包工具開發實錄

基于 Go 和 gopacket Fyne 的跨平臺網絡抓包工具開發實錄 一、項目背景 在網絡安全、協議分析、運維排查等場景中&#xff0c;抓包工具是不可或缺的利器。Wireshark 雖然功能強大&#xff0c;但對于部分初學者或有定制需求的開發者來說&#xff0c;學習曲線較陡&#xff0c;且…

Langchain和Faiss搭建本地知識庫對比

對比 對比維度及優缺點分析對比維度LangChain&#xff08;封裝 FAISS&#xff09;直接使用 FAISS易用性? 高&#xff0c;提供高級封裝&#xff0c;簡化開發流程? 中等&#xff0c;需要熟悉 FAISS API學習成本? 低&#xff0c;適合快速開發? 高&#xff0c;需要掌握 FAISS 的…

Java常用命令匯總

JDK 工具命令jps&#xff08;Java Virtual Machine Process Status Tool&#xff09;命令示例&#xff1a;jps -l 應用場景&#xff1a;列出當前系統中所有Java進程的PID和主類名&#xff0c;常用于快速定位Java應用的進程ID。javac&#xff08;Java Compiler&#xff09;命令示…

Llama 2:開放基礎模型與微調聊天模型

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Llama 2&#xff1a;開放基礎模型與微調聊天模型 摘要 在本研究中&#xff0c;我們開發并發布了 Llama 2&#xff0c;一組預訓練和微調的大型語言模型&#xff08;LLMs&#xff09;&#xff0c;其規模從 70 億參…

ThinkPHP 8 在 Apache 下啟用偽靜態

ThinkPHP 8 在 Apache 下啟用偽靜態&#xff0c;需要配置 .htaccess 文件并確保 Apache 支持 URL 重寫。以下是詳細設置步驟&#xff1a;1. 啟用 Apache 重寫模塊首先確保 Apache 的 mod_rewrite 模塊已啟用。編輯 Apache 配置文件&#xff08;通常是 /etc/apache2/apache2.con…

Android開發中Retrofit使用方法與底層原理詳解

Retrofit 是 Android 開發中一個 類型安全、基于注解、高度解耦 的 RESTful HTTP 客戶端庫&#xff0c;由 Square 公司開發。它極大地簡化了 Android 應用與 Web 服務進行網絡交互的過程。 核心價值&#xff1a; 聲明式 API 定義&#xff1a; 使用 Java/Kotlin 接口和注解描述 …

基于FPGA的IIC控制EEPROM讀寫(2)

基于FPGA的IIC控制EEPROM讀寫 文章目錄基于FPGA的IIC控制EEPROM讀寫一、EEPROM簡介二、代碼實現——個人理解1、狀態機2、仿真效果3、上板驗證4、代碼top.viic_master.vuart三、代碼實現——復用性較高的IIC模塊1、框架設計2、狀態機設計3、仿真效果4、上板驗證5、代碼top.viic…

C# 界面程序在23H2型號系統中無法退出

20250716記錄 環境&#xff1a;c# winform問題描述&#xff1a;主界面退出直接使用了Environment.Exit(0); 程序假死&#xff0c;無法關閉解決措施&#xff1a;//使用 this.Close();以下代碼目標&#xff1a;執行完程序自身后&#xff0c;刪除指定文件&#xff08;可用于程序文…

Kafka——集群核心參數配置

引言在分布式系統中&#xff0c;Kafka 憑借其高吞吐量、低延遲和強大的擴展性&#xff0c;成為數據管道和流處理的首選解決方案。然而&#xff0c;要充分發揮 Kafka 的性能和穩定性&#xff0c;正確配置集群參數至關重要。為什么參數配置如此重要&#xff1f;Kafka 的參數配置直…