文章目錄 前言:
一. 函數:告別重複代碼的 “代碼工廠”
1.1 為什麼需要函數?
1.2 函數的核心語法(重點)
1.3 函數的進階用法(嵌套 + 遞歸)
1.4 函數核心小結
二. 列表和元組:批量存儲數據的 “容器”
2.1 列表(list):最常用的可變容器
2.2 元組(tuple):不可變的序列容器
2.3 列表的元組小結
結尾:
前言: 作為 Python 初學者,掌握函數、列表、元組是從 “寫代碼” 到 “寫好代碼” 的關鍵一步。它們不僅是 Python 語法的核心,更是後續處理複雜數據、構建高效程序的基礎。今天這篇文章,就結合入門實戰案例,把這三個知識點講透,新手也能一看就會、一用就通。
一. 函數:告別重複代碼的 “代碼工廠”
1.1 為什麼需要函數? 寫代碼最忌諱的就是 “複製粘貼”。比如計算不同區間的數列和(1-100、300-400、1-1000),如果不使用函數,需要重複寫多組幾乎一樣的循環代碼:
1. 計算 1-100 的和
theSum = 0 for i in range(1,101): theSum = theSum + i print(theSum)
2. 計算 300-400 的求和
theSum = 0 for i in range(300,401): theSum = theSum + i print(theSum)
計算 1-1000 的和
theSum = 0 for i in range(1,1001): theSum = theSum + i print(theSum) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 一旦需要修改計算邏輯(比如改成求平方和),所有重複代碼都要改,效率極低。而函數的核心作用,就是提取重複代碼,實現代碼複用,讓程序更簡潔、更好維護。
簡單理解:函數就像一個 “工廠”,輸入 “原材料”(參數),經過內部加工(函數體),輸出 “產品”(返回值),一次定義,多次調用。
函數版本代碼:
使用函數的方式來解決剛剛的問題
定義一個求和函數
def calcSum(begin,end): theSum = 0 for i in range(begin,end+1): theSum = theSum + i print(theSum)
使用函數
求 1-100 的和
calcSum(1,100)
求 300-400 的和
calcSum(300,400)
求 1-1000 的和
calcSum(1,1000) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1.2 函數的核心語法(重點) (1)函數定義與調用
1. 定義函數:def 函數名(形參列表): 函數體 return 返回值
def calcsum(beg, end): # beg、end是“形式參數”(形參),相當於工廠的“原材料入口” sum = 0 for i in range(beg, end + 1): sum += i return sum # return 輸出結果,相當於工廠的“產品出口”
2. 調用函數:函數名(實參列表)
result1 = calcsum(1, 100) # 1、100是“實際參數”(實參),是真正傳入的原材料 result2 = calcsum(300, 400) print(result1, result2) # 輸出:5050 35150 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 def test(a,b,c): print(a,b,c)
實參個數不能多也不能少,除非形參有默認參數
test(10,20,30) 運行項目並下載源碼 python 運行 1 2 3 4 5 ⚠️ 關鍵注意點:
函數必須先定義,再調用(就像動漫裏“先喊招式名,再釋放技能”),否則會報 NameError; 定義函數時不會執行函數體,只要調用時才會執行,調用幾次就執行幾次; 形參和實參的個數必須匹配(比如定義時 2 個形參,調用時就必須傳 2 個實參),否則報 TypeError; (2) 函數參數的靈活用法 Python 的函數參數比C++,Java更靈活,核心有 3 個特性:
- 動態類型:形參無需指定類型,一個函數可接收多種類型參數
def print_param(a): print(a) print_param(10) # 整數 print_param("hello")# 字符串 print_param(True) # 布爾值(均能正常執行) 運行項目並下載源碼 python 運行 1 2 3 4 5 def add(x,y): return x+y
print(add(10,20)) print(add(1.5,2.5)) print(add('hello','world'))
# 這個就肯定不行了.不符合函數體內執行邏輯
print(add(10,'hello'))
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 2. 參數默認值:給形參指針默認值,調用時可省略該參數(默認值參數必須在無默認值參數後面)
計算兩數之和,默認不打印調試信息
def add(x, y, debug=False): if debug: print(f"調試:x={x}, y={y}") return x + y print(add(10, 20)) # 省略debug,使用默認值False print(add(10, 20, True)) # 顯式傳參,打印調試信息 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 3. 關鍵字參數:調用時顯示指定“實參對應哪個形參”,可打亂傳參順序
def test(x,y): print(f"x = {x}") print(f"y = {y}")
關鍵字參數,順序無關,輸出: x = 10,y = 20;
test(x = 10,y = 20) test(y = 100,x = 200) test(100,y = 200)
這樣寫就不行了
test(x = 100,200)
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 (3) 函數返回值 返回值是函數的 “輸出”,核心用法有兩點:
- 一個函數可以有多個 return 語句,執行到 return 時函數立刻結束(後續代碼不執行)
這種情況不算是有多個 return 語句
def tes():
return 1
return 2
一般情況下多個 return 語句是搭配 分支語句/循環語句 的
用來判斷 num 是不是奇數
def isOdd(num): if num % 2 == 0: return False else: return True
print(isOdd(10)) print(isOdd(19)) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2. 一次返回多個值:用逗號分隔,接收時用多個變量接收(無需接收的用 _ 忽略)
寫一個函數, 返回平面上的一個點
橫座標,縱座標
def getPoint(): x = 10 y = 20 return x,y
可以返回兩個值
a,b = getPoint() # 接收所有返回值
如果只想用其中一個可以使用 _ 佔位
_,b=getPoint() # 忽略x,只接收y
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 (4) 變量作用域
變量的作用域決定了 “變量能在哪些地方使用”,核心規則:
局部變量:函數內部定義的變量,僅在函數內部生效(出了函數就失效); 全局變量:函數外部定義的變量,函數內部可訪問,但 修改時需要用global 聲明; 同名變量:不同作用域可存在同名變量(本質是不同變量,互不影響) x = 10
def test(): x = 20 print(f'函數內部:{x}')
test() print(f'函數外部:{x}') 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 x = 10
全局變量在函數裏也可以使用
def test():
print(f'x = {x}')
test()
使用這個函數,把全局變量 x 給改成 20!
def test(): global x x = 20
test() print(f'x = {x}') 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1.3 函數的進階用法(嵌套 + 遞歸) (1)鏈式調用:把一個函數的返回值,作為另一個函數的參數
def isOdd(num): if num % 2 == 0: return False return True
def add(x,y): return x+y
result = isOdd(10)
print(result)
print(isOdd((add(5,5)))) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 (2)嵌套調用:函數內部調用其他函數(包括自身)
def test(): print("hello")
test()
嵌套調用可以有很多層
def a(): num = 10 print("函數 a")
def b(): num = 20 a() print("函數 b")
def c(): num = 30 b() print("函數 c")
def d(): num = 40 c() print("函數 d")
d() 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 函數之間的調用關係,在Python中會使用一個特定的數據結構來表示,稱為 函數調用棧,每次函數調用,都會在調用棧裏新增一個元素,稱為 棧幀。
可以通過 PyCharm 調試器看到函數調用棧和棧幀。 在調試狀態下,PyCharm 左下角一般就會顯示出函數調用棧。
選擇不同的棧幀,可以看到各自棧幀中的局部變量。
思考:上述代碼,a,b,c,d 函數中的局部變量名各不相同,如果變量名是相同的,比如都是 num,那麼這四個函數中的 num 是屬於同一個變量,還是不同變量呢? – 不同變量
(3)遞歸調用:函數調用自身(慎用!)
遞歸是嵌套調用的特使情況,核心是"有結束條件 + 每次逼近結束條件",否則會無限遞歸導致 RecursionError
案例:遞歸計算 5 的階乘 (5! = 5 * 4 * 3 * 2 * 1)
寫一個函數,來求 n 的階乘(n是正整數)
def factor(n):
result = 1
for i in range(1,n+1):
result *= i
return result
遞歸
n! => n * (n-1)!
1! => 1
def factor(n): if n == 1: return 1 return n * factor(n - 1)
print(factor(5)) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 務必存在遞歸結束條件,比如 if n == 1 就是結束條件。當 n 為 1 的時候,遞歸就結束了。 每次遞歸的時候,要保證函數的實參是逐漸逼近結束條件的。 ⚠️ 注意:遞歸代碼簡潔但難理解,易棧溢出,實際開發中優先用循環替代。
1.4 函數核心小結 掌握 3 點,搞定 Python 函數:
定義:def 函數名(形參):函數體 return 返回值; 調用:函數名(實參),支持默認值,關鍵字參數; 核心價值:複用代碼,拆分邏輯,讓程序更容易維護。 二. 列表和元組:批量存儲數據的 “容器” 當需要存儲多個數據(比如10個學生的成績,20個城市名)時,單獨定義多個變量不現實,此時就需要列表(list)和元組(tuple)—— 它們是 Python 中最常用的 “序列類型”,專門用來批量存儲數據。
核心區別(一句話記牢):
列表(list):可變容器(像 “散裝辣條”),元素可增刪改; 元組(tuple):不可變容器(像 “包裝辣條”),元素創建後無法修改。 2.1 列表(list):最常用的可變容器 (1)創建列表
兩種核心方式,推薦用 [ ] (更簡潔)
創建列表
1. 直接使用字面值來創建
[] 就表示一個 空的列表
a = [] print(type(a))
2. 使用 list() 來創建
b = list() print(type(b))
3. 可以在創建列表的時候,在[]中指定列表的初始值
元素之間使用 , 來分割
a = [1,2,3,4] print(a)
4. 可以在同一個列表裏放不同類型的變量
a = [1,'hello',True,[4,5,6]] print(a)
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ⚠️ 注意:不要用 list 作為變量名(會覆蓋內置函數 list()),建議命名為 list1,alist 等。
(2)列表的核心操作(必練)
列表的操作都圍繞 “下標” 展開,下標從 0 開始(負數表示倒數,-1 是最後一個元素),核心操作如下:
操作目的 代碼示例 説明 訪問元素 list3[2] 訪問下標 2 的元素(list3 [2] = 3),下標越界報 IndexError 修改元素 list3[2] = 100 把下標 2 的元素改成 100,list3 變成 [1,2,100,4] 切片(取子列表) list3[1:3] 取下標 1 到 3(左閉右開)的元素,輸出 [2,100] 新增元素 list3.append(5) 尾插(添加到末尾);list3.insert(1, "a")(插入到下標 1) 刪除元素 list3.pop() 刪除末尾元素;list3.pop(2)(刪除下標 2 元素);list3.remove(2)(按值刪除) 查找元素 2 in list3 判斷元素是否存在(返回布爾值);list3.index(2)(找下標,不存在報異常) 連接列表 list3 + list4 拼接兩個列表(生成新列表);list3.extend(list4)(拼接到 list3 末尾,修改原列表) 遍歷元素 for elem in list3: 直接遍歷元素(推薦);也可按下標遍歷(for i in range(len(list3))) 下標訪問:
5. 使用下標來訪問列表元素
a = [1,2,3,4] print(a[2]) # 3
6. 使用下標來修改列表元素
a = [1,2,3,4] a[2] = 100 print(a)
7. 超出下標有效範圍,就會出現異常
a = [1,2,3,4]
a[100] = 0
print(a)
Traceback (most recent call last):
File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--11--24\code42.py", line 33, in
a[100] = 0
~^^^^^
IndexError: list assignment index out of range
8. 可以使用內建函數 len 來獲取列表的長度(元素個數),和字符串類似
a = [1,2,3,4] print(len(a))
9. Python 中的下標,其實還可以寫成負數!!!
例如寫成 -1,其實等價於 len(a) - 1
a = [1,2,3,4] print(a[len(a) - 1])
-1 就是倒數第一個元素
print(a[-1]) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 循環遍歷:
1. 使用 for 循環來遍歷列表
不會改變原來的數組
a = [1,2,3,4,5]
for elem in a:
elem = elem + 10
print(elem)
print(a)
2. 使用 for 循環遍歷,通過下標的方式
會改變原來的數組
a = [1,2,3,4,5]
for i in range(0,len(a)):
a[i] = a[i] + 10
print(a)
3. 使用 while 循環,通過下標遍歷這個列表
a = [1,2,3,4,5] i = 0 while i < len(a): print(a[i]) i += 1 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 增刪查改 && 連接等:
1. 使用 append 往列表末尾新增一個元素
a = [1,2,3,4]
a.append(5)
a.append("hello")
print(a)
b = [5,6,7,8]
b.append("world")
print(b)
2. 還可以使用 insert 方法,往列表的任意位置來新增元素
a = [1,2,3,4] a.insert(1,"hello") a.insert(100,"hello") # 會在最後插入一個 hello print(a)
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1. 使用 in 來判定某個元素是否在列表中存在
a = [1,2,3,4]
print(1 in a)
print(10 in a)
print(1 not in a)
print(10 not in a)
2. 使用 index 方法,來判定當前元素在列表中的位置,得到一個下標
a = [1,2,3,4] print(a.index(2)) print(a.index(3))
print(a.index(10)) # 會報錯
運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12
1. 使用 pop 刪除列表中的最末尾的元素
a = [1,2,3,4] a.pop() print(a)
2. 使用 pop 還能刪除任意位置的元素,pop的參數
a = [1,2,3,4] a.pop(1) print(a)
3. 使用 remove 方法,可以按照值來進行刪除
a = ["aa","bb","cc","dd"] a.remove("cc") print(a) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14
1. 使用 + 針對兩個列表進行拼接
a = [1,2,3,4]
b = [5,6,7,8]
c = b + a
print(c)
c = a + b
print(c)
print(a)
print(b)
2. 使用 extend 來進行拼接
這個拼接是把後一個列表的內容拼接到前一個列表裏頭
a = [1,2,3,4]
b = [5,6,7,8]
c = a.extend(b) # extend 不返回任何內容
a.extend(b)
print(a) # a 這裏改變了
print(b)
3. 使用 += 來進行拼接
a = [1,2,3,4] b = [5,6,7,8] a += b # a = a + b print(a) print(b) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 (3)切片操作的靈活用法(重點)
切片是列表的 “靈魂操作”,支持省略邊界、指定步長(正數從左到右,負數從右到左):
1. 切片操作的基本使用
a = [1,2,3,4]
左閉右開區間
print(a[1:3])
2. 使用切片的時候,可以省略邊界
a = [1,2,3,4]
省略右邊界,意思是從指定的開始位置,一直取到整個列表結束
print(a[1:])
省略左邊界,意思是從列表的 0 號元素開始取,一直取到指定的結束位置
print(a[:2])
此處切邊中的下標也可以寫成負數
print(a[:-1])
還可以把開始邊界和結束邊界都省掉,得到的就還是列表本身
print(a[:])
3. 帶有步長的切片操作
a = [1,2,3,4,5,6,7,8,9,0] print(a[::1]) print(a[::2]) print(a[::3]) print(a[1:-1:2])
4. 步長的數值還可以是負數,當步長為負數的時候,意思是從後往前來取元素
a = [1,2,3,4,5,6,7,8,9,0] print(a[::-1]) print(a[::-2])
5. 當切片中的範圍超出有效下標之後,不會出現異常!,而是儘可能的把符合要求的元素給獲取到
a = [1,2,3,4,5,6,7,8,9,0] print(a[1:100]) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 2.2 元組(tuple):不可變的序列容器 元組的用法和列表幾乎一致,但核心區別是"不可變"(元素無法增刪改),適合存儲不需要修改的數據(比如身份證號,座標)。
(1)創建元組
用()表示,空元組用()或tuple(),注意單個元素的元組要加逗號(避免被當作普通括號):
1. 創建元組
a = () print(type(a)) b = tuple() print(type(b))
2. 創建元組的時候,指定初始值
a = (1,2,3,4) print(a)
3. 元組中的元素也可以是任意類型的
a = (1,2,'hello',True,[]) print(a) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 (2)元組的核心操作
支持的操作(和列表一致):訪問下標、切片、遍歷、in判斷、index查找、+拼接;
不支持的操作(因為不可變):修改元素、append/insert/pop/remove/extend
4. 通過下標來訪問元組中的元素,下標也是從 0 開始,到 len - 1 結束
a = (1,2,3,4) print(a[1]) print(a[-1])
print(a[100]) # 錯誤
5. 通過切片來獲取元組的一部分
a = [1,2,3,4] print(a[1:3])
6. 也同樣可以使用 for 循環等方式來進行遍歷元素
a = (1,2,3,4) for elem in a: print(elem)
7. 可以使用 in 來判斷元素是否存在,使用 index 查找元素的下標
a = (1,2,3,4) print(3 in a) print(a.index(3))
8. 可以使用 + 來拼接兩個元組
a = (1,2,3) b = (4,5,6) print(a + b)
9. 元組只支持 “讀” 操作,不能支持 “修改” 操作
a = (1,2,3,4)
不支持以下修改的操作
a[0] = 100
a.append(5)
a.pop()
a.extend()
10. 當進行多元賦值的時候,其實本質上是按照元組的方式來進行工作的,
def getPoint(): x = 10 y = 20 return x,y
x,y = getPoint() print(type(getPoint())) 運行項目並下載源碼 python 運行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
(3)為什麼有了列表,還需要元組?
安全性: 傳遞數據時,用元組可避免數據被意外修改(比如傳給一個未知函數,元組更安全);
可作為字典的鍵: 後續要學的字典,鍵必須是 “可哈希對象”(不可變類型),元組可以,列表不行。
補充:
2.3 列表的元組小結
結語:不知不覺這篇 Python 相關的分享就到尾聲啦~ 作為一門靈活又實用的語言,Python 的魅力從來都藏在 “上手易、場景廣” 裏 —— 不管是入門時的語法摸索,還是實戰中的問題拆解,每一次代碼跑通的瞬間,都是對 “實踐出真知” 的最好印證。如果這篇內容幫你理清了某個知識點,或是給你的項目開發帶來了一點啓發,歡迎在評論區交流你的心得或疑問~ 後續會持續分享 Python 進階技巧、實戰案例等乾貨,從基礎夯實到場景落地,陪大家一起在編程路上少踩坑、多收穫! 編程之路漫漫,但熱愛可抵歲月漫長~ 咱們下篇博客見!