干貨分享,感謝您的閱讀!備注:本博客將自己初步學習Python的總結進行分享,希望大家通過本博客可以在短時間內快速掌握Python的基本程序編碼能力,如有錯誤請留言指正,謝謝!(持續更新)
一、快速了解 Python 和 環境準備
(一)Python 快速介紹
Python 是一種 簡潔、強大、易讀 的編程語言,廣泛應用于 Web 開發、數據分析、人工智能、自動化運維 等領域。它由 Guido van Rossum 在 1991 年設計,因其清晰的語法和強大的生態系統,迅速成為全球最受歡迎的編程語言之一。
在 2017 年底,Stack Overflow 發布的數據顯示,Python 已經超越 JavaScript 成為了該平臺上提問流量最多的編程語言。
(二)Jupyter Notebook:從夢想到行業標配
Jupyter Notebook 的誕生源于創始人 Fernando Pérez一個大膽的想法:打造一個能整合 Julia(Ju)、Python(Py)和 R(ter) 這三種科學計算語言的通用計算平臺。但目前Jupyter 早已超越最初的設想,成為一個支持幾乎所有編程語言的多功能計算環境。
從 2017 年起,北美頂尖高校紛紛全面擁抱 Jupyter Notebook:
學術界:斯坦福的 CS231N《計算機視覺與神經網絡》 課程2017 年便完全遷移到 Jupyter Notebook、UC Berkeley 的 《數據科學基礎》 課程也在同年改用 Jupyter 作為唯一的作業平臺。
工業界: Facebook盡管大型后端開發仍依賴傳統 IDE,但幾乎所有 內部分析、機器學習訓練和數據探索 都基于 Jupyter Notebook 運行。同時 Google 的 AI Research 部門 Google Brain,也是清一色地全部使用 Jupyter Notebook(改進定制版,叫 Google Colab)。
(三)Mac 上安裝 Python 和 Jupyter Notebook 的步驟
步驟 | 命令 | 說明 |
---|---|---|
1. 安裝 Homebrew | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" | Mac 的包管理工具(如果未安裝) |
2. 安裝 Python 3 | brew install python | 安裝最新的 Python 3 |
3. 驗證 Python 版本 | python3 --version | 確保安裝成功,顯示 Python 3.x.x |
4. 安裝 Jupyter Notebook | pip3 install jupyter | 通過 pip3 安裝 Jupyter |
5. 檢查 Jupyter 是否可用 | jupyter --version | 確保 Jupyter 已正確安裝 |
6. 啟動 Jupyter Notebook | jupyter notebook | 打開 Jupyter Notebook,瀏覽器自動打開 |
這樣,我們就可以在 Mac 上使用 Jupyter Notebook 進行 Python 開發了!
備注:
如果你不習慣也可以直接idea,畢竟這么多年習慣了java開發,我就是兩個都安裝了,無所謂!
如果不想安裝也可以在線使用:Jupyter 官方在線工具
二、Python 基礎:變量、數據類型與輸入輸出
Python 以其 簡潔、易讀 的語法受到歡迎,而理解變量、數據類型和輸入輸出是學習 Python 的第一步。這部分內容構成了 Python 編程的基石。這部分代碼我寫的時候都是直接在idea中,網絡版本有時很慢。Jupyter 官方在線工具
(一)變量:數據的存儲與引用
變量(Variable)是用于存儲數據的容器,在 Python 中變量不需聲明類型,直接賦值即可創建。
1. 變量的定義與賦值
x = 10 # 整數變量
name = "Alice" # 字符串變量
pi = 3.14159 # 浮點數變量
is_python_fun = True # 布爾變量
Python 是動態類型語言,變量的類型是根據賦值內容自動推導的。
2. 變量命名規則
-
變量名必須 以字母或下劃線(_)開頭,不能以數字開頭。
-
變量名只能包含 字母、數字和下劃線,不能包含空格或特殊符號。
-
變量名區分大小寫(
age
和Age
是不同的變量)。 -
推薦使用 小寫字母+下劃線(
snake_case
)風格,如user_name
,符合 Python 代碼規范(PEP 8)。
示例:正確與錯誤的變量命名
valid_name = "OK" # 正確
_valid_123 = 42 # 正確
2nd_value = "wrong" # ? 錯誤:不能以數字開頭
user-name = "error" # ? 錯誤:不能包含 `-`
(二)數據類型(Data Types)
Python 具有豐富的數據類型,主要包括:
數據類型 | 示例 | 說明 |
---|---|---|
整數(int) | x = 42 | 存儲整數,如 10 , -5 , 1000 |
浮點數(float) | pi = 3.14 | 存儲小數,如 3.1415 , -0.5 |
字符串(str) | name = "Alice" | 存儲文本,如 "hello" |
布爾值(bool) | is_valid = True | 只有 True 或 False |
列表(list) | nums = [1, 2, 3] | 有序可變的集合 |
元組(tuple) | colors = ('red', 'blue') | 有序不可變的集合 |
字典(dict) | person = {"name": "Alice", "age": 25} | 鍵值對存儲 |
集合(set) | unique_nums = {1, 2, 3} | 無序不重復元素集合 |
Python 提供 type()
函數來查看變量的數據類型:
x = 42
print(type(x)) # 輸出:<class 'int'>
Python 允許不同類型之間的轉換:
age = "25"
age = int(age) # 將字符串轉換為整數
pi = 3.14
pi_str = str(pi) # 將浮點數轉換為字符串
(三)輸入與輸出(Input & Output)
1. 標準輸入(input)
input()
用于從用戶獲取輸入,所有輸入默認是 字符串類型:
name = input("請輸入你的名字: ")
print("你好,", name)
如果需要數值類型,需要進行 類型轉換:
age = int(input("請輸入你的年齡: ")) # 輸入默認是字符串,需要轉換成整數
print("你明年就", age + 1, "歲了!")
基本驗證:
2. 標準輸出(print)
print()
用于向控制臺輸出內容:
name = "Alice"
age = 25
print("姓名:", name, "年齡:", age) # 多個參數用逗號分隔
格式化輸出(推薦使用 f-string,Python 3.6+ 支持):
print(f"姓名: {name}, 年齡: {age}") # 推薦的寫法
? 小練習題
嘗試自己編寫代碼練習以下問題:(后面我單獨出一篇博客將答案附上)
-
定義一個變量
temperature
,存儲36.6
,并使用print()
輸出"體溫: 36.6 攝氏度"
。 -
編寫一個程序,提示用戶輸入姓名和年齡,并打印
"你好,XX!你今年 YY 歲"
(其中XX
和YY
由用戶輸入)。
Python 的變量、數據類型和輸入輸出構成了編程的基礎,熟練掌握這些概念后,就可以進行更復雜的邏輯編寫了!
三、控制流:讓代碼具備決策能力
在編程中,控制流 決定了代碼的執行順序,使程序能夠做出決策(條件判斷),或重復執行任務(循環)。通過 布爾值、邏輯運算、if 語句、for 和 while 循環,我們可以讓 Python 代碼變得更加智能和高效。這部分我會總結下這些關鍵概念,其是構建更具邏輯性程序的基礎。
(一)布爾值與邏輯判斷
在 Python 中,布爾值(Boolean) 是控制程序邏輯的基礎。它用于 條件判斷、循環控制和邏輯運算,讓代碼具備決策能力。
1. 布爾值(Boolean)
布爾值只有兩個取值:
True # 代表 "真"
False # 代表 "假"
布爾值本質上是整數的特殊形式,其中:
True == 1 # 結果為 True
False == 0 # 結果為 True
布爾值的基本使用
is_python_fun = True
is_raining = Falseprint(is_python_fun) # 輸出:True
print(type(is_python_fun)) # 輸出:<class 'bool'>
2. 比較運算符(Comparison Operators)
比較運算符用于比較兩個值,返回 True
或 False
。
運算符 | 含義 | 示例 | 結果 |
---|---|---|---|
== | 等于 | 5 == 5 | True |
!= | 不等于 | 5 != 3 | True |
> | 大于 | 10 > 3 | True |
< | 小于 | 2 < 8 | True |
>= | 大于等于 | 5 >= 5 | True |
<= | 小于等于 | 3 <= 2 | False |
代碼示例
a = 10
b = 5print(a > b) # True
print(a == b) # False
print(a != b) # True
3. 布爾運算符(Boolean Operators)
Python 提供了 and
、or
和 not
三種邏輯運算符,用于組合多個布爾表達式。
運算符 | 含義 | 示例 | 結果 |
---|---|---|---|
and | 邏輯與(都為 True 時才為 True ) | True and False | False |
or | 邏輯或(只要一個為 True 就是 True ) | True or False | True |
not | 邏輯非(取反) | not True | False |
3.1 and
邏輯與
x = 5
y = 10
print(x > 0 and y > 5) # True,因為兩個條件都成立
print(x > 0 and y < 5) # False,因第二個條件不成立
3.2 or
邏輯或
x = 5
y = 10
print(x > 0 or y < 5) # True,只要有一個條件為 True 即可
print(x < 0 or y < 5) # False,兩個條件都為 False
3.3 not
邏輯非
is_python_fun = True
print(not is_python_fun) # False,因為取反了
4. 混合布爾運算(優先級)
運算符的 優先級 從高到低依次為:not
(最高)、and、or
(最低)
print(True or False and False)
# 等價于 True or (False and False) → True or False → Trueprint(not True or False)
# 等價于 (not True) or False → False or False → False
5. 布爾值與其他數據類型的轉換
在 Python 中,所有數據類型 都可以轉換為布爾值:
-
以下情況視為
False
:-
0
(整數 0) -
0.0
(浮點數 0) -
""
(空字符串) -
[]
(空列表) -
{}
(空字典) -
None
(特殊值,表示“空”)
-
-
其他情況均為
True
。
5.1 使用 bool()
進行類型轉換
print(bool(0)) # False
print(bool("")) # False
print(bool([])) # False
print(bool(42)) # True
print(bool("hello")) # True
5.2 在 if
語句中使用
name = "Alice"if name: # 相當于 if bool(name) == Trueprint("名字有效")
else:print("名字為空")
輸出:
名字有效
? 小練習題
練習 1:布爾運算
判斷以下表達式的結果:
-
True and False or True
-
not (False or True)
-
(10 > 5) and (3 != 3)
練習 2:用戶輸入比較
讓用戶輸入兩個數字,比較它們的大小,并輸出 "第一個數字更大"
或 "第二個數字更大"
。
# 提示:使用 input() 和 if 語句
布爾值和邏輯判斷是 條件判斷和循環 的基礎,熟練掌握它們后,代碼將更加智能化! 🚀
(二)🌟 條件判斷(if
語句)
在編程中,我們經常需要根據不同條件來執行不同的代碼。這就要用到 條件判斷語句(if statement)。Python 中使用 if
、elif
和 else
關鍵字來實現條件分支。
1. 基本 if 語句
語法結構:
if 條件:語句塊
? 當“條件”為 True
時,語句塊才會被執行。
示例:
age = 20if age >= 18:print("你已經成年了")
輸出:
你已經成年了
2.?if-else 結構(兩分支選擇)
用于處理“要么這樣,要么那樣”的情況。
語法結構:
if 條件:語句塊1
else:語句塊2
示例:
temperature = 15if temperature > 20:print("北京天氣今天很暖和")
else:print("北京天氣今天有點冷")
輸出:
北京天氣今天有點冷
3. if-elif-else 結構(多分支選擇)
用于處理多個條件判斷的情況(相當于“多項選擇”)。
語法結構:
if 條件1:語句塊1
elif 條件2:語句塊2
elif 條件3:語句塊3
else:默認語句塊
示例:
score = 85if score >= 90:print("優秀")
elif score >= 80:print("良好")
elif score >= 60:print("及格")
else:print("不及格")
輸出:
良好
💡
elif
是 "else if" 的縮寫。Python 中沒有switch
語句,if-elif-else
是推薦的替代方案。
4. 嵌套 if 語句
嵌套 指的是在一個 if
塊內部再寫 if
判斷。可以用來表示更復雜的邏輯結構。
示例:
age = 25
is_student = Trueif age < 30:if is_student:print("你是年輕的學生")else:print("你是年輕的上班族")
輸出:
你是年輕的學生
?? 注意縮進層級,Python 是靠縮進來識別代碼塊的!
5. 條件表達式(三元運算符)
Python 支持一種簡潔的寫法:在一行中完成 if-else 判斷。
語法:
變量 = 值1 if 條件 else 值2
示例:
age = 16
status = "成年" if age >= 18 else "未成年"
print(status)
輸出:
未成年
適合用于 根據條件選擇一個值賦給變量 的情況。
? 小練習題
練習 1:分數等級判斷器
讓用戶輸入一個 0~100 的整數,判斷其屬于哪個等級:
90 以上:優秀
80~89:良好
70~79:中等
60~69:及格
低于 60:不及格
其他情況提示“輸入有誤”
練習 2:三角形合法性判斷
輸入三條邊的長度,判斷是否能組成一個三角形(任意兩邊之和大于第三邊),并進一步判斷:
是等邊三角形
是等腰三角形
是普通三角形
否則輸出“不合法的三角形”
練習 3:模擬 ATM 登錄與權限檢查(嵌套)
假設用戶名為
admin
,密碼為8888
,登錄成功后再檢查是否為管理員(管理員輸入"yes"
才能繼續操作)。
練習 4:三元運算小測試
輸入一個數字,輸出
"正數"
、"負數"
或"零"
,用三元運算符 實現。
🧠 小結
類型 | 場景示例 |
---|---|
if | 只有一個條件 |
if-else | 兩種可能,二選一 |
if-elif-else | 多種情況,依次判斷 |
嵌套 if | 條件套條件,多層判斷 |
三元表達式 | 簡潔地賦值,適合一行判斷 |
(三)循環(Loops)
在編程中,我們常常需要重復執行某些操作,比如遍歷列表、處理每一行數據、執行某個動作直到滿足條件等等。Python 提供了兩種主要的循環結構:while
循環和 for
循環,配合控制語句(如 break
、continue
)可以構建出豐富的循環邏輯。
1. while
循環(基于條件重復執行)
? 基本語法
while 條件表達式:循環體
-
每次循環前都會檢查“條件表達式”的值;
-
條件為
True
→ 執行循環體; -
條件為
False
→ 結束循環。
🧪 示例:打印 1 到 5 的數字
i = 1
while i <= 5:print(i)i += 1
🔁 break
語句(提前終止循環)
break
用于立即跳出整個循環結構,不管循環條件是否還為 True
。
i = 1
while True:print(i)if i == 3:breaki += 1
輸出:1, 2, 3,然后退出循環
🔁 continue
語句(跳過當前迭代)
continue
用于跳過本次循環中剩下的語句,直接進入下一次判斷。
i = 0
while i < 5:i += 1if i == 3:continueprint(i)
輸出:1, 2, 4, 5(跳過了 3)
2.?for
循環(用于遍歷序列)
? 基本語法
for 變量 in 可迭代對象:循環體
可迭代對象包括:字符串、列表、字典、集合、元組等。
🔁 遍歷字符串
for ch in "hello":print(ch)
🔁 遍歷列表
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:print(fruit)
🔁 遍歷字典
info = {"name": "Tom", "age": 20}
for key in info:print(key, "=>", info[key])
或使用 .items()
遍歷鍵值對:
for key, value in info.items():print(f"{key}: {value}")
🔁 遍歷集合
s = {"apple", "banana", "cherry"}
for item in s:print(item)
🔁 range()
函數與數值循環
for i in range(1, 6):print(i)
-
range(n)
:0 到 n-1 -
range(start, end)
:start 到 end-1 -
range(start, end, step)
:按步長生成
🔁 enumerate()
結合索引遍歷
想同時獲取元素和下標時使用 enumerate()
:
colors = ['red', 'green', 'blue']
for index, color in enumerate(colors):print(f"{index}: {color}")
3.?循環控制語句
? break
:提前終止整個循環
通常與 if
配合使用,用于在滿足某個條件時立即退出循環。
for i in range(1, 10):if i == 5:breakprint(i)
? continue
:跳過當前迭代
用于跳過某些不符合條件的值。
for i in range(1, 6):if i % 2 == 0:continueprint(i) # 輸出 1 3 5(跳過偶數)
? else
語句在循環中的作用
else
可以與 for
或 while
循環一起使用:
-
當循環沒有被
break
中斷時,else
中的語句會執行。for i in range(1, 5):if i == 10:break else:print("未被 break,循環正常結束")
這在處理搜索類問題時特別有用:
nums = [1, 3, 5, 7] target = 4 for num in nums:if num == target:print("找到目標")break else:print("未找到目標")
? 小結
循環類型 | 用途 | 特點 |
---|---|---|
while | 條件控制循環 | 不確定次數時使用 |
for | 遍歷序列 | 更簡潔,適合固定結構 |
break | 跳出循環 | 終止整個循環體 |
continue | 跳過本次迭代 | 繼續下一輪 |
else | 循環結構補充 | 僅在循環未被 break時執行 |
? 小練習題
🧪 練習題 1:打印 1~100 中所有能被 7 整除的數
🧪 練習題 2:使用 while
計算從 1 累加到 n 的和(n 由用戶輸入)
🧪 練習題 3:找出列表中第一個大于 50 的元素,并輸出其值和索引
🧪 練習題 4:輸出 1~30 中除了能被 3 整除的數(使用 continue)
🧪 練習題 5:統計一段字符串中元音字母的個數(不區分大小寫)
🧪 練習題 6:使用 for
和 else
實現一個猜數字小游戲
四、🧩 函數與相關基礎知識:讓代碼會“思考”的魔法工具
在編程的世界里,函數就像是程序的“積木”:它們能把一段可復用的操作封裝起來,想用就調用,修改也方便,堪稱優雅代碼的起點。
無論是打印一行文字,計算一個數列的和,還是訓練一個 AI 模型,本質上你做的都是“定義功能 + 調用功能” —— 這正是函數的使命。
(一)函數基礎
1. 什么是函數?為什么要使用函數?
在編程中,函數是一個非常重要的概念,它可以被理解為“功能塊”,用來封裝一段代碼,供其他地方調用。通過函數,開發者可以:
-
提高代碼復用性:避免重復寫相同的代碼,簡化開發和維護。
-
增強可讀性:將復雜的任務拆解成小的、獨立的單元,便于理解。
-
分隔邏輯:函數讓代碼的邏輯結構更加清晰和模塊化,有助于團隊協作開發。
例如,我們可以定義一個函數來計算兩個數字的和,而不需要每次都重復寫加法的操作。只要定義一次,后續就可以隨時調用。
2. 使用 def
定義函數
在 Python 中,函數是通過 def
關鍵字來定義的。它的基本語法如下:
def function_name(parameters):# 函數體return result
-
def
是 Python 中定義函數的關鍵字 -
function_name
是你給函數命名的名稱,符合命名規則 -
parameters
是函數的輸入(可以沒有) -
return
是返回結果的關鍵字(如果不返回任何值,則默認為None
)
示例:一個簡單的加法函數
def add(a, b):return a + b# 調用函數
result = add(3, 5)
print(result) # 輸出: 8
這里我們定義了一個 add
函數,輸入參數是 a
和 b
,它們會被加在一起并返回結果。
3. 函數的調用和執行流程
定義函數后,調用函數就能執行該函數的代碼。Python 會根據函數調用的順序進入函數體,并執行其中的代碼。
-
當函數被調用時,程序會暫停當前位置,跳轉到函數體執行代碼,直到遇到
return
語句(或者函數執行完畢)才返回。 -
如果沒有
return
語句,則返回None
。
示例:簡單的函數調用與返回值
def greet(name):return f"Hello, {name}!"message = greet("Alice")
print(message) # 輸出: Hello, Alice!
這里的 greet
函數通過 return
語句返回了一個字符串,調用時傳入了參數 "Alice"
,最終返回 "Hello, Alice!"
。
4.?print()
與 return
的區別與使用場景
在 Python 中,print()
和 return
都用于輸出數據,但它們有顯著的不同:
-
print()
用于將信息輸出到控制臺,主要用于調試、輸出中間結果或與用戶交互。 -
return
用于函數的輸出,它將值返回給調用者,可以被其他代碼再次使用。
示例:print()
和 return
對比
# 使用 print()
def greet_print(name):print(f"Hello, {name}!")greet_print("Alice") # 輸出: Hello, Alice!# 使用 return
def greet_return(name):return f"Hello, {name}!"message = greet_return("Alice")
print(message) # 輸出: Hello, Alice!
-
greet_print
使用print()
輸出值,但無法把它傳遞給其他部分的代碼。 -
greet_return
使用return
返回結果,這個返回值可以在代碼的其他地方使用或存儲。
小結一下吧
-
函數是代碼復用、模塊化的核心工具。
-
使用
def
定義函數,return
返回值。 -
print()
用于輸出調試信息,return
用于返回計算結果。
(二)函數參數
函數參數是函數接收外部輸入的方式。理解和掌握函數參數的使用,不僅能幫助你編寫更靈活的代碼,還能讓你的程序更具擴展性和可維護性。
1. 位置參數
位置參數是最常見的函數參數類型,它是指參數傳遞時位置的順序決定了每個參數的含義。
例如,在函數定義時,參數 a
和 b
的位置決定了它們的意義。當調用函數時,傳遞的參數值會根據位置匹配到相應的參數。
示例:位置參數
def add(a, b):return a + bresult = add(3, 5) # 位置參數:3 被賦值給 a,5 被賦值給 b
print(result) # 輸出: 8
這里的 add
函數有兩個位置參數:a
和 b
。我們調用 add(3, 5)
時,3
會賦值給 a
,5
會賦值給 b
,最終返回它們的和。
2.?關鍵字參數
關鍵字參數允許你在調用函數時顯式地指定每個參數的名稱。這樣可以不關心參數的順序,只需要知道參數名。
示例:關鍵字參數
def greet(name, age):return f"Hello, {name}! You are {age} years old."message = greet(age=25, name="Alice") # 參數順序不重要
print(message) # 輸出: Hello, Alice! You are 25 years old.
在調用 greet
函數時,age
和 name
的順序不再重要,關鍵字參數通過指定 age=25
和 name="Alice"
來傳遞值。
3. 默認參數
默認參數是指在定義函數時,為某些參數提供默認值。如果調用時沒有提供這些參數的值,Python 會使用默認值。
示例:默認參數
def greet(name, age=18): # age 有默認值return f"Hello, {name}! You are {age} years old."message1 = greet("Alice") # 調用時沒有提供 age,使用默認值
message2 = greet("Bob", 30) # 調用時提供了 age,覆蓋默認值print(message1) # 輸出: Hello, Alice! You are 18 years old.
print(message2) # 輸出: Hello, Bob! You are 30 years old.
在 greet
函數中,age
有默認值 18
。如果調用時沒有傳入 age
,就會使用默認值;如果傳入了 age
,則會覆蓋默認值。
4. 可變參數:*args
與 **kwargs
有時候我們不知道函數需要接收多少個參數,這時可以使用 可變參數。
-
*args
用于接收位置參數,它將接收多余的位置參數并將其打包成一個元組。 -
**kwargs
用于接收關鍵字參數,它將接收多余的關鍵字參數并將其打包成一個字典。
示例:*args
和 **kwargs
def example(*args, **kwargs):print("args:", args)print("kwargs:", kwargs)# 調用函數時傳入不同數量的參數
example(1, 2, 3, name="Alice", age=25)# 輸出:
# args: (1, 2, 3)
# kwargs: {'name': 'Alice', 'age': 25}
-
*args
將所有位置參數(1
,2
,3
)打包成一個元組(1, 2, 3)
。 -
**kwargs
將所有關鍵字參數(name="Alice"
,age=25
)打包成一個字典{'name': 'Alice', 'age': 25}
。
5. 參數順序規范
當一個函數同時使用位置參數、默認參數和可變參數時,有一定的順序規范,必須遵循以下順序:
-
位置參數
-
默認參數
-
*args
-
**kwargs
示例:參數順序
def function(a, b=2, *args, c, **kwargs):print(a, b, args, c, kwargs)# 調用時,按照順序傳遞參數
function(1, c=3, d=4, e=5)
# 輸出: 1 2 () 3 {'d': 4, 'e': 5}
-
a
是位置參數,必須最先提供。 -
b
是默認參數,如果不提供則使用默認值。 -
*args
用于接收多余的所有位置參數。 -
c
是一個關鍵字參數,調用時必須顯式指定。 -
**kwargs
用于接收多余的所有關鍵字參數。
小結一下吧
-
位置參數:根據參數順序傳遞值。
-
關鍵字參數:顯式指定參數名和值。
-
默認參數:函數定義時為參數提供默認值。
-
可變參數:
*args
用于接收多位置參數,**kwargs
用于接收多關鍵字參數。 -
參數順序:位置參數 > 默認參數 >
*args
>**kwargs
。
(三)函數返回值
在 Python 中,函數不僅可以執行某些操作,還可以將結果“返回”給調用者。這就是 返回值(Return Value) 的概念。
通過 return
語句,函數可以把處理的結果交給外部使用。如果函數沒有 return
,那它默認返回的是 None
。
1. 使用 return
返回結果
基本語法:
def function_name(...):...return result
示例:
def square(x):return x * xresult = square(5)
print(result) # 輸出: 25
函數 square
返回的是 x
的平方,調用后我們可以拿到這個結果并繼續使用。
2. 返回多個值(元組)
Python 支持從一個函數中返回多個值,這些值實際上被打包成一個元組返回。
示例:
def get_name_and_age():name = "Alice"age = 30return name, agen, a = get_name_and_age()
print(n) # Alice
print(a) # 30
多值返回的本質是:
return name, age
等價于return (name, age)
,然后通過拆包語法接收。
3.?函數無返回值時的表現
如果函數中沒有 return
語句,或者只是 return
而沒有值,那默認返回的是 None
。
示例:
def say_hello():print("Hello!")result = say_hello()
print(result) # 輸出: None
這個函數 say_hello()
雖然做了事情(打印),但沒有 return
,因此返回值是 None
。
4. 提前終止函數執行
return
不僅能返回值,還能用來提前終止函數的執行。
示例:
def divide(a, b):if b == 0:return "除數不能為 0"return a / bprint(divide(10, 0)) # 輸出: 除數不能為 0
print(divide(10, 2)) # 輸出: 5.0
當 b
是 0 時,函數遇到第一個 return
后立即終止執行,不會繼續往下運行。
5. 將返回值作為表達式使用
函數返回值可以被用在其他表達式或函數中,像這樣:
def add(a, b):return a + bprint(add(2, 3) * 10) # 輸出: 50
add(2, 3)
會返回 5
,然后再與 10
相乘。
小結一下吧
內容 | 示例 | 返回值說明 |
---|---|---|
返回單個值 | return x | 返回一個對象 |
返回多個值 | return x, y | 返回一個元組 |
無 return 或 return None | return / 無 return | 返回 None |
提前結束函數 | if ...: return ... | 直接退出函數 |
返回值可以參與表達式 | add(1, 2) * 3 | 函數結果用于計算 |
五、📚 字符串操作模塊
在 Python 中,字符串(str
)是最常用、最重要的數據類型之一。無論你是在處理用戶輸入、讀取文件、構建網頁內容、分析文本數據,幾乎都繞不開對字符串的處理。
現在我們總結掌握 Python 字符串的各種操作方法,從最基本的創建與訪問,到復雜的格式化與正則匹配,覆蓋日常開發中 90% 的高頻場景。我們需要學會如何清洗、切割、替換、判斷和重組字符串,并為后續的數據處理與文本分析打下堅實基礎。
(一)📘 字符串基礎
在 Python 中,字符串(str
)是用來表示文本的數據類型。本部分介紹字符串的創建方式、基本特性、訪問技巧以及常見的基本操作。
1.?字符串的定義與創建
字符串可以用 單引號 '
、雙引號 "
或 三引號 '''
/ """
括起來。
# 單引號
s1 = 'hello'# 雙引號
s2 = "world"# 三引號(支持多行)
s3 = '''This is
a multi-line
string.'''
?? Python 中單引號和雙引號作用相同,主要用于避免轉義沖突。
2. 字符串是不可變對象
字符串是 不可變的(immutable):創建后無法修改,只能重新賦值。
s = "hello"
# s[0] = 'H' # ? 錯誤!字符串不能直接修改
s = "Hello" # ? 只能重新賦值
3. 字符串的索引與切片
字符串可以看作字符的序列,可以通過索引或切片訪問其部分內容。
s = "Python"# 索引(從 0 開始)
print(s[0]) # P
print(s[-1]) # n(最后一個字符)# 切片 [start:end:step]
print(s[0:2]) # Py(不包括 end)
print(s[::2]) # Pto(每隔1個)
print(s[::-1]) # nohytP(反轉字符串)
? 切片非常強大,是字符串處理中不可或缺的工具。
4.?字符串的連接與重復
# 拼接字符串
a = "Hello"
b = "World"
c = a + " " + b
print(c) # Hello World# 重復字符串
print("ha" * 3) # hahaha
5. 字符串的成員運算
s = "python"
print("p" in s) # True
print("z" not in s) # True
6. 字符串與類型轉換
num = 123
text = str(num) # 數字轉字符串
print("數字是:" + text)# 也可以使用 f-string(推薦)
print(f"數字是:{num}")
🧠 小結
操作類型 | 常用方法 / 語法 |
---|---|
創建字符串 | 'abc' , "abc" , '''abc''' |
索引 | s[0] , s[-1] |
切片 | s[1:4] , s[::-1] |
拼接與重復 | + , * |
判斷是否存在 | in , not in |
類型轉換 | str(x) , f"{x}" |
(二)📘 字符串常見操作方法
Python 的字符串類型(str
)內建了大量實用的方法,幫助我們完成查找、替換、對齊、大小寫轉換、格式化等各類文本處理任務。本節將系統講解所有主流、實用的方法,并配合用例說明。
1. 大小寫轉換
方法 | 作用 |
---|---|
.lower() | 轉為小寫 |
.upper() | 轉為大寫 |
.capitalize() | 首字母大寫,其余小寫 |
.title() | 每個單詞首字母大寫 |
.swapcase() | 大小寫互換 |
s = "hello World"
print(s.lower()) # hello world
print(s.upper()) # HELLO WORLD
print(s.capitalize()) # Hello world
print(s.title()) # Hello World
print(s.swapcase()) # HELLO wORLD
2.?查找與判斷
方法 | 功能 |
---|---|
.find(sub) | 找到子串首次出現的位置(找不到返回 -1) |
.rfind(sub) | 從右側開始查找 |
.index(sub) | 與 find 類似,但找不到拋出異常 |
.startswith(prefix) | 是否以某前綴開頭 |
.endswith(suffix) | 是否以某后綴結尾 |
.in | 判斷子串是否存在 |
s = "hello python"
print(s.find("py")) # 6
print(s.startswith("he")) # True
print(s.endswith("on")) # True
print("py" in s) # True
3. 刪除空白符與字符清洗
方法 | 功能 |
---|---|
.strip() | 刪除兩端空白符 |
.lstrip() | 刪除左側空白符 |
.rstrip() | 刪除右側空白符 |
.replace(old, new) | 替換子串 |
s = " hello world "
print(s.strip()) # "hello world"s2 = "python,java,c"
print(s2.replace(",", " | ")) # python | java | c
4. 字符串對齊與填充
方法 | 說明 |
---|---|
.center(width, char) | 居中填充 |
.ljust(width, char) | 左對齊填充 |
.rjust(width, char) | 右對齊填充 |
.zfill(width) | 用 0 填充左側數字部分 |
print("hi".center(10, "-")) # ---hi-----
print("hi".ljust(10, ".")) # hi........
print("hi".rjust(10, "*")) # ********hi
print("42".zfill(5)) # 00042
5. 拆分與連接
方法 | 功能 |
---|---|
.split(sep) | 拆分為列表 |
.rsplit(sep) | 從右拆分 |
.splitlines() | 拆分多行字符串 |
'sep'.join(list) | 用分隔符連接列表為字符串 |
s = "apple,banana,grape"
print(s.split(",")) # ['apple', 'banana', 'grape']lines = "line1\nline2\nline3"
print(lines.splitlines()) # ['line1', 'line2', 'line3']words = ['one', 'two', 'three']
print("-".join(words)) # one-two-three
6. 內容判斷類方法(返回布爾值)
方法 | 判斷類型 |
---|---|
.isalpha() | 是否全字母 |
.isdigit() | 是否全數字 |
.isalnum() | 是否全是字母或數字 |
.isspace() | 是否全是空白符 |
.isupper() | 是否全為大寫 |
.islower() | 是否全為小寫 |
.istitle() | 是否符合標題規范(首字母大寫) |
print("abc".isalpha()) # True
print("123".isdigit()) # True
print("abc123".isalnum()) # True
print(" ".isspace()) # True
7. 高級字符串格式化(f-string)
name = "Alice"
age = 30# 推薦方式:f-string(Python 3.6+)
print(f"{name} is {age} years old.") # Alice is 30 years old# 老式:format()
print("{} is {} years old.".format(name, age))# 占位對齊控制
print(f"|{name:^10}|{age:>3}|") # 居中+右對齊
8. 轉義字符與原始字符串
字符 | 含義 |
---|---|
\n | 換行 |
\t | 制表符 |
\\ | 反斜杠 |
r"" | 原始字符串,不轉義 |
print("hello\nworld") # 換行
print(r"c:\new\folder") # c:\new\folder
9. 其他實用技巧
-
長字符串拼接:
s = ("This is a very long string ""split across multiple lines ""but still valid." )
-
字符串比較支持
<
,>
,==
等字典序對比:print("apple" < "banana") # True
🧠 小結:常用字符串方法分類對照表
類型 | 常用方法 |
---|---|
查找判斷 | find() , startswith() , in |
修改清洗 | strip() , replace() |
大小寫處理 | lower() , capitalize() |
對齊填充 | center() , zfill() |
格式化 | f"" , format() |
判斷內容 | isdigit() , isalpha() |
分割拼接 | split() , join() |
其他 | len() , 轉義、比較等 |
(三)📘 字符串切片與索引
1. 字符串索引(正向索引 / 負向索引)
Python 字符串是序列類型,每個字符都有對應的索引位置。我們可以通過索引訪問字符串中的單個字符。
📍 正向索引(從 0 開始)
s = "python"
print(s[0]) # p
print(s[1]) # y
print(s[5]) # n
字符 | p | y | t | h | o | n |
---|---|---|---|---|---|---|
索引 | 0 | 1 | 2 | 3 | 4 | 5 |
📍 負向索引(從 -1 開始,表示從右往左)
s = "python"
print(s[-1]) # n
print(s[-2]) # o
print(s[-6]) # p
字符 | p | y | t | h | o | n |
---|---|---|---|---|---|---|
索引 | -6 | -5 | -4 | -3 | -2 | -1 |
🧠 注意:
-
超出索引范圍(如
s[10]
)會拋出IndexError
。 -
字符串是 不可變對象,不能通過索引修改某個字符。
2. 字符串切片([start:stop:step])
切片(slice)是從字符串中提取子串的一種方式,語法格式為:
s[start : stop : step]
-
start
:起始索引(包含) -
stop
:終止索引(不包含) -
step
:步長(默認為 1)
🎯 基礎切片
s = "Hello, Python!"print(s[0:5]) # Hello
print(s[7:13]) # Python
print(s[:5]) # Hello(從頭開始)
print(s[7:]) # Python!(直到結尾)
🎯 使用負數索引切片
s = "abcdefg"
print(s[-4:-1]) # def
print(s[-7:-4]) # abc
🎯 添加步長(step)
s = "0123456789"
print(s[::2]) # 02468(每兩個字符取一個)
print(s[1::3]) # 147(從索引 1 開始,每隔 3 個取)
🎯 反向切片(步長為負數)
s = "abcdef"
print(s[::-1]) # fedcba(字符串反轉)
print(s[-1:-7:-1]) # fedcba(等同上行)
🧠 切片邊界記憶口訣
-
包頭不包尾:起始位置包含,結束位置不包含。
-
步長方向一致:正數步長從左到右,負數步長從右到左。
-
索引可以為負:負索引從末尾向前數。
3. 字符串的遍歷
遍歷字符串可以逐個訪問其字符,常用于統計、查找、生成新字符串等任務。
🎯 基礎遍歷
s = "hello"
for c in s:print(c)
輸出:
h
e
l
l
o
🎯 帶索引遍歷(推薦:使用 enumerate)
s = "hello"
for index, char in enumerate(s):print(f"{index} -> {char}")
輸出:
0 -> h
1 -> e
2 -> l
3 -> l
4 -> o
🔎 經典應用場景小結
場景 | 示例 |
---|---|
提取子串 | s[3:7] |
字符串反轉 | s[::-1] |
判斷回文 | s == s[::-1] |
截取前綴/后綴 | s[:3] 或 s[-3:] |
每隔一個字符取 | s[::2] |
(四)📘 字符串格式化
Python 提供了三種主要的字符串格式化方式:
-
%
占位符格式化(經典寫法) -
str.format()
方法格式化(兼容寫法) -
f-string 格式化(推薦方式,Python 3.6+)
1.%
占位符格式化(C 風格)
這是最早期的格式化方式,語法類似于 C 語言:
name = "Alice"
age = 25
print("My name is %s and I am %d years old." % (name, age))
占位符 | 含義 |
---|---|
%s | 字符串 |
%d | 整數 |
%f | 浮點數(默認小數點后 6 位) |
%.2f | 浮點數保留 2 位小數 |
🧠 缺點:可讀性差、容易出錯,不推薦用于新代碼。
2.str.format()
方法格式化
引入于 Python 2.7 / 3.0,支持位置參數、關鍵字參數,更靈活:
name = "Alice"
age = 25
print("My name is {} and I am {} years old.".format(name, age))
🎯 支持 位置參數 / 關鍵字參數
print("Hello, {0}. You are {1}.".format("Bob", 30))
print("Hello, {name}. You are {age}.".format(name="Bob", age=30))
🎯 支持格式控制
pi = 3.1415926
print("Pi is {:.2f}".format(pi)) # Pi is 3.14
🧠 缺點:寫法較冗長,推薦 f-string 替代。
3.f-string 格式化(Python 3.6+,推薦?)
最現代、最簡潔的格式化方式,代碼更清晰,推薦作為首選寫法。
name = "Alice"
age = 25
print(f"My name is {name} and I am {age} years old.")
🎯 支持表達式
a = 5
b = 3
print(f"{a} + {b} = {a + b}")
🎯 支持格式化控制
pi = 3.1415926
print(f"Pi rounded to 2 digits: {pi:.2f}")
🎯 與函數、數據結構結合
user = {"name": "Bob", "score": 88}
print(f"{user['name']} scored {user['score']}")
🧪 三種方式對比
特性 | % 格式化 | str.format() | f-string |
---|---|---|---|
可讀性 | ? | ? | ??? |
功能強大 | 一般 | ?? | ??? |
寫法簡潔 | 一般 | ? | ??? |
推薦程度 | ? 不推薦 | ? 過渡用法 | ??? 首選 |
📝 小結一下吧
-
新代碼推薦 f-string,語法簡潔、表達能力強。
-
str.format()
適用于兼容舊版本 Python。 -
%
占位符方式適合了解,不建議用于正式項目中。
🎯 想練點格式化相關的習題?還是我們繼續進入 第 5 節 字符串常用方法詳解?