Python 基礎語法與數據類型(七) - 函數的定義與調用 (def, return)

文章目錄

      • 為什么要使用函數?
      • 函數的定義 (`def`)
      • 函數的調用
      • 函數參數 (Parameters vs Arguments)
      • 返回值 (`return`)
      • 變量作用域 (簡要了解)
      • 總結
      • 練習題
      • 練習題答案
  • **創作不易,請大家點贊加收藏,關注我,持續更新教程!**

到目前為止,我們已經學習了基本的數據類型、集合類型以及控制程序流程的條件語句和循環。隨著程序越來越復雜,我們可能會發現自己反復編寫相同的代碼塊來執行特定任務。這不僅低效,還會導致代碼難以閱讀和維護。

函數就是解決這個問題的重要工具。它們允許我們將一段代碼封裝起來,賦予一個名字,然后在需要的時候多次調用。本篇博客將深入講解如何定義自己的函數、如何調用它們,以及如何使用 return 語句從函數中獲取結果。

為什么要使用函數?

使用函數的好處多多:

  1. 代碼重用 (Reusability): 避免重復編寫相同的代碼塊。遵循 DRY (Don’t Repeat Yourself) 原則。
  2. 模塊化 (Modularity): 將程序分解成更小、更易于管理和理解的部分。每個函數負責一個特定的任務。
  3. 提高可讀性 (Readability): 通過有意義的函數名,代碼變得更容易理解其目的。
  4. 易于維護和調試 (Maintainability & Debugging): 當需要修改或修復某個功能的代碼時,只需在一個地方(函數定義處)進行修改。如果出現錯誤,更容易定位問題在哪個函數中。

函數的定義 (def)

在 Python 中,使用 def 關鍵字來定義一個函數。定義函數的基本結構如下:

def function_name(parameter1, parameter2, ...):"""這里是函數的文檔字符串 (Docstring)。解釋函數的功能、參數和返回值。"""# 函數體 - 執行任務的代碼塊# ...# return value # 可選的返回值
  • def 關鍵字: 標記著一個函數的定義開始。
  • function_name: 函數的名字。需要遵循 Python 的命名規則(通常使用小寫字母和下劃線 _ 組合,稱為 snake_case)。函數名應該能夠清晰地表明函數的功能。
  • 圓括號 (): 緊跟在函數名后面。里面可以包含參數 (Parameters),用于接收外部傳遞進來的數據。如果沒有參數,圓括號也不能省略。
  • 冒號 :: 標記著函數頭部的結束,函數體即將開始。
  • 文檔字符串 (Docstring): 使用三引號 """ """''' ''' 包圍起來的一段文本。它應該在函數頭部的下一行,用于詳細說明函數的作用。這是 Python 的一個重要特性,可以通過 help(function_name)function_name.__doc__ 查看。編寫良好的文檔字符串是好習慣。
  • 函數體: 縮進的代碼塊,包含了函數執行的實際操作。
  • return 語句: 用于指定函數執行完畢后返回給調用者的值。是可選的。

示例: 定義一個簡單的函數,它不接受參數,也不返回值,只打印一條消息。

def greet():"""這是一個簡單的打招呼函數。"""print("Hello, welcome to Python functions!")print("This function does not take arguments and does not return a value.")

上面的代碼只是定義了一個函數,它還沒有被執行。

函數的調用

定義函數后,要讓它執行里面的代碼,就需要調用它。調用函數非常簡單,只需要使用函數名后面加上圓括號 () 即可。如果函數定義時有參數,調用時需要在圓括號中提供相應的實參 (Arguments)

# 調用上面定義的 greet 函數
greet()
greet() # 函數可以被多次調用

輸出:

Hello, welcome to Python functions!
This function does not take arguments and does not return a value.
Hello, welcome to Python functions!
This function does not take arguments and does not return a value.

函數參數 (Parameters vs Arguments)

  • 參數 (Parameters): 在函數定義時,圓括號中列出的變量名。它們是函數內部使用的占位符,代表函數期望接收的數據。
  • 實參 (Arguments): 在函數調用時,傳遞給函數參數的實際值。
# 定義一個接受一個參數的函數
def greet_person(name):"""向指定名字的人打招呼。Args:name: 要打招呼的人的名字 (字符串)。"""print(f"Hello, {name}!")# 調用函數,并傳遞實參
greet_person("Alice") # "Alice" 是傳遞給 name 參數的實參
greet_person("Bob")   # "Bob" 是傳遞給 name 參數的實參

輸出:

Hello, Alice!
Hello, Bob!

一個函數可以有多個參數,調用時需要按照參數定義的順序傳遞實參。

# 定義一個接受兩個參數的函數
def add_numbers(a, b):"""計算兩個數字的和。Args:a: 第一個數字。b: 第二個數字。"""sum_result = a + bprint(f"{a} + {b} = {sum_result}")# 調用函數,傳遞兩個實參
add_numbers(5, 3)     # a=5, b=3
add_numbers(10, 20)   # a=10, b=20

輸出:

5 + 3 = 8
10 + 20 = 30

調用帶有參數的函數時,必須提供正確數量的實參(對于目前我們學習的必需參數)。

返回值 (return)

函數的一個重要作用是執行計算并將結果返回給調用者。使用 return 語句來實現。

  • return value: 函數執行到 return 語句時,會立即停止執行,并將 value 返回給調用者。
  • 如果函數沒有 return 語句,或者只有不帶值的 return,它會隱式地返回特殊的值 None
  • None 是 Python 中表示“無”或“空”的一個特殊對象。
# 定義一個函數,使用 return 返回計算結果
def multiply(x, y):"""計算兩個數字的乘積并返回結果。Args:x: 第一個數字。y: 第二個數字。Returns:兩個數字的乘積。"""product = x * yreturn product # 返回計算得到的乘積# 調用函數,并用變量接收返回值
result = multiply(4, 6)
print(f"乘積是: {result}") # 輸出: 乘積是: 24another_result = multiply(2.5, 4)
print(f"另一個乘積是: {another_result}") # 輸出: 另一個乘積是: 10.0

注意: return 語句一旦執行,函數就會結束。return 后面的代碼將不會被執行。

def example_return(num):if num > 10:return "大于 10" # 如果 num > 10,函數在這里結束print("數字不大于 10") # 如果 num <= 10,這行會執行return "小于或等于 10" # 然后返回這個值print(example_return(15)) # 輸出: 大于 10
print(example_return(8))  # 輸出: 數字不大于 10\n小于或等于 10

隱式返回 None:

def print_message(msg):"""只打印消息,沒有 return 語句。"""print(msg)# 隱式地返回 Nonereturn_value = print_message("Hello")
print(f"函數返回的值是: {return_value}") # 輸出: Hello\n函數返回的值是: None

返回多個值:

Python 函數可以看似返回多個值,實際上,它是將多個值封裝在一個元組 (tuple) 中返回。

def get_name_and_age():"""返回名字和年齡。"""name = "Charlie"age = 25return name, age # 實際上返回 ('Charlie', 25)info = get_name_and_age()
print(f"獲取到的信息是: {info}")      # 輸出: 獲取到的信息是: ('Charlie', 25)
print(f"類型是: {type(info)}")       # 輸出: 類型是: <class 'tuple'># 可以使用元組解包來分別獲取返回值
person_name, person_age = get_name_and_age()
print(f"名字: {person_name}, 年齡: {person_age}") # 輸出: 名字: Charlie, 年齡: 25

變量作用域 (簡要了解)

在函數內部定義的變量(包括參數)通常是局部變量 (Local Variables)。它們只存在于函數執行期間,函數結束后就會被銷毀,在函數外部無法訪問。

def my_function():x = 10 # x 是局部變量print(f"函數內部的 x: {x}")my_function()
# print(x) # 這會引發 NameError,因為 x 在函數外部不存在

全局變量(在函數外部定義的變量)可以在函數內部訪問,但不建議在函數內部直接修改全局變量,除非使用 global 關鍵字(但這通常是初學者應盡量避免的高級用法)。將數據通過參數傳遞進函數,通過返回值傳出,是更好的實踐。

總結

函數是 Python 中組織代碼、實現重用和模塊化的核心工具。本篇我們學習了:

  • 使用 def 關鍵字定義函數。
  • 理解參數 (Parameters) 和實參 (Arguments) 的區別。
  • 如何調用函數來執行其代碼。
  • 使用 return 語句從函數中返回一個或多個值。
  • 函數沒有顯式返回值時默認返回 None
  • 函數內部變量的局部作用域概念。
  • 編寫文檔字符串說明函數功能。

練習題

嘗試獨立完成以下練習題,并通過答案進行對照:

  1. 簡單函數定義與調用:

    • 定義一個函數 print_hello(),它不接受參數,只打印 “Hello, Python!”。調用這個函數。
  2. 帶參數的函數:

    • 定義一個函數 say_greeting(name),它接受一個字符串參數 name,并打印 “Hello, [name]!”。調用這個函數,傳入你的名字。
  3. 帶返回值的函數:

    • 定義一個函數 calculate_square(number),它接受一個數字參數 number,計算并返回這個數字的平方。調用這個函數,并打印返回值。
    • 定義一個函數 is_even(number),它接受一個整數參數 number,如果數字是偶數返回 True,否則返回 False。調用這個函數測試幾個數字。
  4. 返回多個值的函數:

    • 定義一個函數 divide_and_remainder(a, b),它接受兩個數字 ab,計算 a 除以 b 的商和余數,并同時返回這兩個結果(作為一個元組)。調用這個函數,并使用元組解包分別獲取商和余數,然后打印。
  5. 結合循環和條件的函數:

    • 定義一個函數 count_vowels(text),它接受一個字符串參數 text,遍歷字符串,統計其中元音字母(a, e, i, o, u,不區分大小寫)的數量,并返回數量。調用這個函數測試一些字符串。
  6. 帶文檔字符串的函數:

    • 為你前面定義的任何一個函數添加一個清晰的文檔字符串,說明其功能、參數和返回值。然后使用 help() 函數查看你寫的文檔。

練習題答案

1. 簡單函數定義與調用:

# 1. 簡單函數定義與調用
def print_hello():"""打印一條簡單的問候信息。"""print("Hello, Python!")# 調用函數
print_hello()

2. 帶參數的函數:

# 2. 帶參數的函數
def say_greeting(name):"""向指定名字的人打招呼。Args:name: 要打招呼的人的名字 (字符串)。"""print(f"Hello, {name}!")# 調用函數
say_greeting("Alice")
say_greeting("Bob")

3. 帶返回值的函數:

# 3.1 計算平方并返回
def calculate_square(number):"""計算并返回一個數字的平方。Args:number: 需要計算平方的數字。Returns:number 的平方。"""return number ** 2# 調用并打印返回值
result1 = calculate_square(5)
print(f"5 的平方是: {result1}")result2 = calculate_square(3.5)
print(f"3.5 的平方是: {result2}")# 3.2 判斷奇偶數并返回布爾值
def is_even(number):"""判斷一個整數是否是偶數。Args:number: 需要判斷的整數。Returns:如果數字是偶數返回 True,否則返回 False。"""return number % 2 == 0# 調用并測試
print(f"4 是偶數嗎? {is_even(4)}")
print(f"7 是偶數嗎? {is_even(7)}")
print(f"0 是偶數嗎? {is_even(0)}")

4. 返回多個值的函數:

# 4. 返回多個值的函數
def divide_and_remainder(a, b):"""計算兩個數字的商和余數。Args:a: 被除數。b: 除數 (不能為 0)。Returns:一個包含商和余數的元組 (quotient, remainder)。如果 b 為 0,返回 None。"""if b == 0:print("錯誤: 除數不能為零。")return None # 或者根據需要處理錯誤quotient = a // b  # 整數除法獲取商remainder = a % b   # 獲取余數return quotient, remainder # 返回一個元組# 調用并解包返回值
result_tuple = divide_and_remainder(10, 3)if result_tuple is not None: # 檢查返回值是否為 Nonequotient, remainder = result_tuple # 元組解包print(f"10 除以 3 的商是: {quotient}, 余數是: {remainder}")divide_and_remainder(5, 0) # 測試除數為零的情況

5. 結合循環和條件的函數:

# 5. 結合循環和條件的函數
def count_vowels(text):"""統計字符串中元音字母的數量。Args:text: 輸入的字符串。Returns:字符串中元音字母 (a, e, i, o, u, 不區分大小寫) 的數量。"""vowels = "aeiouAEIOU" # 元音字母集合vowel_count = 0for char in text: # 遍歷字符串中的每個字符if char in vowels: # 檢查字符是否在元音字母集合中vowel_count += 1return vowel_count# 調用并測試
sentence1 = "Hello World"
count1 = count_vowels(sentence1)
print(f"'{sentence1}' 中的元音字母數量: {count1}")sentence2 = "Python Programming"
count2 = count_vowels(sentence2)
print(f"'{sentence2}' 中的元音字母數量: {count2}")

6. 帶文檔字符串的函數:

選擇上面任意一個函數,確保你已經添加了文檔字符串,然后運行以下代碼:

# 假設你已經為 calculate_square 函數添加了文檔字符串
# 運行以下代碼查看文檔
help(calculate_square)# 或者直接訪問 __doc__ 屬性
print("\n--- 通過 __doc__ 屬性訪問文檔字符串 ---")
print(calculate_square.__doc__)

運行 help(calculate_square) 應該會輸出你為 calculate_square 函數編寫的文檔字符串內容(通常會格式化得更漂亮)。

創作不易,請大家點贊加收藏,關注我,持續更新教程!

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

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

相關文章

華為配置篇-RSTP/MSTP實驗

MSTP 一、簡介二、常用命令總結三、實驗 一、簡介 RSTP&#xff08;快速生成樹協議&#xff09;? RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改進版本&#xff0c;基于 ??IEEE 802.1w 標準??&#xff0c;核心目標是解決傳統 STP 收斂速度慢的問…

Docker Compose 完全指南:從入門到生產實踐

Docker Compose 完全指南&#xff1a;從入門到生產實踐 1. Docker Compose 簡介與核心價值 Docker Compose 是一個用于定義和運行多容器 Docker 應用程序的工具。通過一個 YAML 文件來配置應用的服務&#xff0c;只需簡單命令就能創建和啟動所有服務。 核心優勢&#xff1a;…

Linux 離線安裝 Docker 和 Docker Compose 最新版 的完整指南

一、準備工作 1. 下載安裝包?&#xff08;需在有網絡的機器操作&#xff09;&#xff1a; Docker 引擎&#xff1a;從官方倉庫下載最新二進制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz?Docker Compose&#xff1a;下載最新二進制…

CSS: 選擇器與三大特性

標簽選擇器 標簽選擇器就是選擇一些HTML的不同標簽&#xff0c;由于它們的標簽需求不同&#xff0c;所以CSS需要設置標簽去選擇它們&#xff0c;為滿足它們的需求給予對應的屬性 基礎選擇器 標簽選擇器 <!DOCTYPE html> <head><title>HOME</title>…

鴻蒙跨平臺開發教程之Uniapp布局基礎

前兩天的文章內容對uniapp開發鴻蒙應用做了一些詳細的介紹&#xff0c;包括配置開發環境和項目結構目錄解讀&#xff0c;今天我們正式開始寫代碼。 入門新的開發語言往往從Hello World開始&#xff0c;Uniapp的初始化項目中已經寫好了一個簡單的demo&#xff0c;這里就不再贅述…

JavaSE核心知識點02面向對象編程02-08(異常處理)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點02面向對象編程02-08&#…

【JVM-GC調優】

一、預備知識 掌握GC相關的VM參數&#xff0c;會基本的空間調整掌握相關工具明白一點&#xff1a;調優跟應用、環境有關&#xff0c;沒有放之四海而皆準的法則 二、調優領域 內存鎖競爭cpu占用io 三、確定目標 【低延遲】&#xff1a;CMS、G1&#xff08;低延遲、高吞吐&a…

基于單片機的電子法頻率計

一、電子計數法測頻率原理 通過門控控制閘門開關&#xff0c;閘門時間T自己設定&#xff0c;計數器計數脈沖個數N&#xff08;也就是待測信號&#xff09;&#xff0c;N個脈沖的時間間隔為δt,倒數即為信號的頻率f,由此 δtT/N fN/T——信號頻率 根據公式&#xff0c;如果考慮…

【C/C++】跟我一起學_C++同步機制效率對比與優化策略

文章目錄 C同步機制效率對比與優化策略1 效率對比2 核心同步機制詳解與適用場景3 性能優化建議4 場景對比表5 總結 C同步機制效率對比與優化策略 多線程編程中&#xff0c;同步機制的選擇直接影響程序性能與資源利用率。 主流同步方式: 互斥鎖原子操作讀寫鎖條件變量無鎖數據…

判斷兩臺設備是否在同一局域網內的具體方法

以下是判斷兩臺設備是否在同一局域網內的具體方法&#xff1a; 1. 檢查IP地址和子網掩碼 操作步驟&#xff1a; Windows系統&#xff1a; 按 Win R 鍵&#xff0c;輸入 cmd 并回車。輸入 ipconfig&#xff0c;查看 IPv4 地址 和 子網掩碼&#xff08;如 192.168.1.5/255.255.2…

在R語言中如何將列的名字改成別的

在 R 中&#xff0c;更改數據框&#xff08;data frame&#xff09;中列的名字可以通過多種方法實現。以下是幾種常見的方法&#xff1a; 方法 1&#xff1a;使用 names() 函數 names() 函數可以獲取或設置數據框的列名。 示例 假設我們有一個數據框 data&#xff1a; dat…

JUC并發編程(上)

一、JUC學習準備 核心知識點&#xff1a;進程、線程、并發&#xff08;共享模型、非共享模型&#xff09;、并行 預備知識&#xff1a; 基于JDK8,對函數式編程、lambda有一定了解 采用了slf4j打印日志 采用了lombok簡化java bean編寫 二、進程與線程 進程和線程概念 兩者對比…

單地平面6層PCB設計實戰:如何兼顧電源與信號完整性?

摘要&#xff1a;面對復雜系統&#xff08;SDRAM、WiFi、電機驅動等&#xff09;且僅有1層地平面的6層板設計挑戰&#xff0c;本文從層疊規劃、電源噪聲抑制、高速信號處理等角度&#xff0c;總結可落地的設計技巧與避坑指南。 一、層疊設計&#xff1a;6層板如何“擠”出最優布…

spark:map 和 flatMap 的區別(Scala)

場景設定 假設有一個包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目標是&#xff1a;將每個句子拆分成單詞。 1. 用 map 的效果 代碼示例 scala val resultMap rdd.map(sentence > sentence…

基于VSCode+PlatformIO環境的ESP8266的HX1838紅外模塊

以下是針對ESP8266開發板的紅外遙控解碼系統開發教程&#xff0c;基于VSCodePlatformIO環境編寫 一、概述 本實驗通過ESP8266開發板實現&#xff1a; 紅外遙控信號解碼自定義按鍵功能映射串口監控輸出基礎設備控制&#xff08;LED&#xff09; 硬件組成&#xff1a; NodeMC…

Kubernetes排錯(十四):Pod狀態異常排查手冊

當你在凌晨三點收到告警&#xff0c;發現Pod在崩潰循環中掙扎時&#xff0c;如何快速定位問題&#xff1f;本文將為你梳理一套生產環境通用的Pod排錯流程&#xff0c;并附上救火隊員必備的實用命令清單&#xff01; 一、5分鐘快速定位&#xff1a;四步鎖定問題方向 步驟1&…

醫院藥品管理系統(準備工作)

準備工作 創建數據庫表 搭建Springboot框架 創建工程 定位maven 其他準備工作 創建數據庫表 建了九張表 搭建Springboot框架 創建工程 定位maven 把鏡像改為國內的 其他準備工作 安裝Lombok插件 額外添加依賴 如果添加依賴的過程中一直爆紅&#xff0c;可以刷新…

SpringBoot異步處理@Async深度解析:從基礎到高階實戰

一、異步編程基礎概念 1.1 同步 vs 異步 特性同步異步執行方式順序執行&#xff0c;阻塞調用非阻塞&#xff0c;調用后立即返回線程使用單線程完成所有任務多線程并行處理響應性較差&#xff0c;需等待前任務完成較好&#xff0c;可立即響應新請求復雜度簡單直觀較復雜&#…

簡單的強化學習舉例

1&#xff0c;定義獎勵函數 首先&#xff0c;需要根據具體的任務需求來定義獎勵函數。例如&#xff0c;對于機器人導航任務&#xff0c;可以根據機器人與目標點的距離來定義獎勵函數&#xff1a; import numpy as npdef navigation_reward(robot_position, target_position):…

css背景相關

背景書寫 background: url(src); // 注意&#xff1a;在寫動態樣式時&#xff0c;backgournd賦值格式錯誤&#xff0c;是不會在瀏覽器dom的style上顯示的 // 但是可以創建不可見的img&#xff0c;預加載來提高性能背景也會加載圖片資源 同img的src一樣&#xff0c;background也…