国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

入門初學(xué)者短期內(nèi)快速掌握Python的經(jīng)典全面教程(專家學(xué)習(xí)筆記)

 更新時間:2026年01月02日 10:45:29   作者:張彥峰ZYF  
本文從工程實踐視角出發(fā),對Python基礎(chǔ)知識進(jìn)行了系統(tǒng)梳理與總結(jié),內(nèi)容涵蓋運(yùn)行環(huán)境、基礎(chǔ)語法、控制流、函數(shù)、字符串處理以及列表、字典、集合等常用數(shù)據(jù)結(jié)構(gòu),并結(jié)合可運(yùn)行示例,幫助讀者建立清晰、連貫的語言認(rèn)知體系,適合初學(xué)者入門,為后續(xù)學(xué)習(xí)與實際應(yīng)用打下穩(wěn)定基礎(chǔ)

本博客將自己初步學(xué)習(xí)Python過程中的階段性整理與沉淀。難免存在理解不夠嚴(yán)謹(jǐn)或表述不夠完善之處,歡迎各位讀者在評論區(qū)留言指正、交流探討,這對我和后續(xù)讀者都會非常有價值。

同時說明一下:從當(dāng)前基礎(chǔ)學(xué)習(xí)和實踐驗證來看,當(dāng)前準(zhǔn)備的這些分享內(nèi)容,確實是可以在一天半的時間內(nèi)就可以快速學(xué)習(xí)完成并可以理解的,希望對我們彼此都有所收獲?。。?/p>

一、快速了解 Python 和 環(huán)境準(zhǔn)備

(一)Python 快速介紹

Python 是一種 簡潔、強(qiáng)大、易讀 的編程語言,廣泛應(yīng)用于 Web 開發(fā)、數(shù)據(jù)分析、人工智能、自動化運(yùn)維領(lǐng)域。它由 Guido van Rossum 在 1991 年設(shè)計,因其清晰的語法和強(qiáng)大的生態(tài)系統(tǒng),迅速成為全球最受歡迎的編程語言之一。

2017 年底,Stack Overflow 發(fā)布的數(shù)據(jù)顯示,Python 已經(jīng)超越 JavaScript 成為了該平臺上提問流量最多的編程語言。

(二)Jupyter Notebook:從夢想到行業(yè)標(biāo)配

Jupyter Notebook 的誕生源于創(chuàng)始人 Fernando Pérez一個大膽的想法:打造一個能整合 Julia(Ju)、Python(Py)和 R(ter) 這三種科學(xué)計算語言的通用計算平臺。但目前Jupyter 早已超越最初的設(shè)想,成為一個支持幾乎所有編程語言的多功能計算環(huán)境。

2017 年起,北美頂尖高校紛紛全面擁抱 Jupyter Notebook:

  • 學(xué)術(shù)界:斯坦福的 CS231N《計算機(jī)視覺與神經(jīng)網(wǎng)絡(luò)》 課程2017 年便完全遷移到 Jupyter Notebook、UC Berkeley 的 《數(shù)據(jù)科學(xué)基礎(chǔ)》 課程也在同年改用 Jupyter 作為唯一的作業(yè)平臺。
  • 工業(yè)界: Facebook盡管大型后端開發(fā)仍依賴傳統(tǒng) IDE,但幾乎所有 內(nèi)部分析、機(jī)器學(xué)習(xí)訓(xùn)練和數(shù)據(jù)探索 都基于 Jupyter Notebook 運(yùn)行。同時 Google 的 AI Research 部門 Google Brain,也是清一色地全部使用 Jupyter Notebook(改進(jìn)定制版,叫 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 3brew install python安裝最新的 Python 3
3. 驗證 Python 版本python3 --version確保安裝成功,顯示 Python 3.x.x
4. 安裝 Jupyter Notebookpip3 install jupyter通過 pip3 安裝 Jupyter
5. 檢查 Jupyter 是否可用jupyter --version確保 Jupyter 已正確安裝
6. 啟動 Jupyter Notebookjupyter notebook打開 Jupyter Notebook,瀏覽器自動打開

這樣,我們就可以在 Mac 上使用 Jupyter Notebook 進(jìn)行 Python 開發(fā)了!

備注:

  • 如果你不習(xí)慣也可以直接idea,畢竟這么多年習(xí)慣了java開發(fā),我就是兩個都安裝了,無所謂!
  • 如果不想安裝也可以在線使用:Jupyter 官方在線工具

二、Python 基礎(chǔ):變量、數(shù)據(jù)類型與輸入輸出

Python 以其 簡潔、易讀 的語法受到歡迎,而理解變量、數(shù)據(jù)類型和輸入輸出是學(xué)習(xí) Python 的第一步。這部分內(nèi)容構(gòu)成了 Python 編程的基石。這部分代碼我寫的時候都是直接在idea中,網(wǎng)絡(luò)版本有時很慢。Jupyter 官方在線工具

(一)變量:數(shù)據(jù)的存儲與引用

變量(Variable是用于存儲數(shù)據(jù)的容器,在 Python 中變量不需聲明類型,直接賦值即可創(chuàng)建。

1. 變量的定義與賦值

x = 10  # 整數(shù)變量
name = "Alice"  # 字符串變量
pi = 3.14159  # 浮點(diǎn)數(shù)變量
is_python_fun = True  # 布爾變量

Python 是動態(tài)類型語言,變量的類型是根據(jù)賦值內(nèi)容自動推導(dǎo)的。

2. 變量命名規(guī)則

  • 變量名必須 以字母或下劃線(_)開頭,不能以數(shù)字開頭。

  • 變量名只能包含 字母、數(shù)字和下劃線,不能包含空格或特殊符號。

  • 變量名區(qū)分大小寫(ageAge 是不同的變量)。

  • 推薦使用 小寫字母+下劃線snake_case)風(fēng)格,如 user_name,符合 Python 代碼規(guī)范(PEP 8)。

示例:正確與錯誤的變量命名

valid_name = "OK"  # 正確
_valid_123 = 42  # 正確
2nd_value = "wrong"  # ? 錯誤:不能以數(shù)字開頭
user-name = "error"  # ? 錯誤:不能包含 `-`

(二)數(shù)據(jù)類型(Data Types)

Python 具有豐富的數(shù)據(jù)類型,主要包括:

數(shù)據(jù)類型示例說明
整數(shù)(int)x = 42存儲整數(shù),如 10, -5, 1000
浮點(diǎn)數(shù)(float)pi = 3.14存儲小數(shù),如 3.1415, -0.5
字符串(str)name = "ZYF"存儲文本,如 "hello"
布爾值(bool)is_valid = True只有 TrueFalse
列表(list)nums = [1, 2, 3]有序可變的集合
元組(tuple)colors = ('red', 'blue')有序不可變的集合
字典(dict)person = {"name": "Alice", "age": 25}鍵值對存儲
集合(set)unique_nums = {1, 2, 3}無序不重復(fù)元素集合

Python 提供 type() 函數(shù)來查看變量的數(shù)據(jù)類型:

x = 42
print(type(x))  # 輸出:<class 'int'>

Python 允許不同類型之間的轉(zhuǎn)換:

age = "25"  
age = int(age)  # 將字符串轉(zhuǎn)換為整數(shù)
pi = 3.14
pi_str = str(pi)  # 將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串

(三)輸入與輸出(Input & Output)

1. 標(biāo)準(zhǔn)輸入(input)

input() 用于從用戶獲取輸入,所有輸入默認(rèn)是 字符串類型

name = input("請輸入你的名字: ")
print("你好,", name)

如果需要數(shù)值類型,需要進(jìn)行 類型轉(zhuǎn)換

age = int(input("請輸入你的年齡: "))  # 輸入默認(rèn)是字符串,需要轉(zhuǎn)換成整數(shù)
print("你明年就", age + 1, "歲了!")

基本驗證:

2. 標(biāo)準(zhǔn)輸出(print)

print() 用于向控制臺輸出內(nèi)容:

name = "Alice"
age = 25
print("姓名:", name, "年齡:", age)  # 多個參數(shù)用逗號分隔

格式化輸出(推薦使用 f-string,Python 3.6+ 支持):

print(f"姓名: {name}, 年齡: {age}") # 推薦的寫法

? 小練習(xí)題

嘗試自己編寫代碼練習(xí)以下問題:

  1. 定義一個變量 temperature,存儲 36.6,并使用 print() 輸出 "體溫: 36.6 攝氏度"

  2. 編寫一個程序,提示用戶輸入姓名和年齡,并打印 "你好,XX!你今年 YY 歲"(其中 XXYY 由用戶輸入)。

Python 的變量、數(shù)據(jù)類型和輸入輸出構(gòu)成了編程的基礎(chǔ),熟練掌握這些概念后,就可以進(jìn)行更復(fù)雜的邏輯編寫了!

三、控制流:讓代碼具備決策能力

在編程中,控制流 決定了代碼的執(zhí)行順序,使程序能夠做出決策(條件判斷),或重復(fù)執(zhí)行任務(wù)(循環(huán))。通過 布爾值、邏輯運(yùn)算、if 語句、for 和 while 循環(huán),我們可以讓 Python 代碼變得更加智能和高效。這部分我會總結(jié)下這些關(guān)鍵概念,其是構(gòu)建更具邏輯性程序的基礎(chǔ)。

(一)布爾值與邏輯判斷

在 Python 中,布爾值(Boolean) 是控制程序邏輯的基礎(chǔ)。它用于 條件判斷、循環(huán)控制和邏輯運(yùn)算,讓代碼具備決策能力。

1. 布爾值(Boolean)

布爾值只有兩個取值:

True  # 代表 "真"
False  # 代表 "假"

布爾值本質(zhì)上是整數(shù)的特殊形式,其中:

True == 1  # 結(jié)果為 True
False == 0  # 結(jié)果為 True
布爾值的基本使用
is_python_fun = True
is_raining = False

print(is_python_fun)  # 輸出:True
print(type(is_python_fun))  # 輸出:<class 'bool'>

2. 比較運(yùn)算符(Comparison Operators)

比較運(yùn)算符用于比較兩個值,返回 TrueFalse

運(yùn)算符含義示例結(jié)果
==等于5 == 5True
!=不等于5 != 3True
>大于10 > 3True
<小于2 < 8True
>=大于等于5 >= 5True
<=小于等于3 <= 2False
代碼示例
a = 10
b = 5

print(a > b)   # True
print(a == b)  # False
print(a != b)  # True

3. 布爾運(yùn)算符(Boolean Operators)

Python 提供了 and、ornot 三種邏輯運(yùn)算符,用于組合多個布爾表達(dá)式。

運(yùn)算符含義示例結(jié)果
and邏輯與(都為 True 時才為 TrueTrue and FalseFalse
or邏輯或(只要一個為 True 就是 TrueTrue or FalseTrue
not邏輯非(取反)not TrueFalse
3.1and邏輯與
x = 5
y = 10
print(x > 0 and y > 5)  # True,因為兩個條件都成立
print(x > 0 and y < 5)  # False,因第二個條件不成立
3.2or邏輯或
x = 5
y = 10
print(x > 0 or y < 5)  # True,只要有一個條件為 True 即可
print(x < 0 or y < 5)  # False,兩個條件都為 False
3.3not邏輯非
is_python_fun = True
print(not is_python_fun)  # False,因為取反了

4. 混合布爾運(yùn)算(優(yōu)先級)

運(yùn)算符的 優(yōu)先級 從高到低依次為:not(最高)、and、or(最低)

知道黃曉明的“鬧太套”英文梗,這里直接記成“鬧安套”就好了

print(True or False and False)  
# 等價于 True or (False and False) → True or False → True

print(not True or False)  
# 等價于 (not True) or False → False or False → False

5. 布爾值與其他數(shù)據(jù)類型的轉(zhuǎn)換

在 Python 中,所有數(shù)據(jù)類型 都可以轉(zhuǎn)換為布爾值:

  • 以下情況視為 False

    • 0(整數(shù) 0)

    • 0.0(浮點(diǎn)數(shù) 0)

    • ""(空字符串)

    • [](空列表)

    • {}(空字典)

    • None(特殊值,表示“空”)

  • 其他情況均為 True

5.1 使用bool()進(jìn)行類型轉(zhuǎn)換
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:  # 相當(dāng)于 if bool(name) == True
    print("名字有效")  
else:
    print("名字為空")

輸出:

名字有效

? 小練習(xí)題

練習(xí) 1:布爾運(yùn)算

判斷以下表達(dá)式的結(jié)果:

  • True and False or True

  • not (False or True)

  • (10 > 5) and (3 != 3)

練習(xí) 2:用戶輸入比較

讓用戶輸入兩個數(shù)字,比較它們的大小,并輸出 "第一個數(shù)字更大""第二個數(shù)字更大"。

# 提示:使用 input() 和 if 語句

布爾值和邏輯判斷是 條件判斷和循環(huán) 的基礎(chǔ),熟練掌握它們后,代碼將更加智能化! ??

(二)?? 條件判斷(if語句)

在編程中,我們經(jīng)常需要根據(jù)不同條件來執(zhí)行不同的代碼。這就要用到 條件判斷語句(if statement)。Python 中使用 if、elifelse 關(guān)鍵字來實現(xiàn)條件分支。

1. 基本 if 語句

語法結(jié)構(gòu):

if 條件:
    語句塊

? 當(dāng)“條件”為 True 時,語句塊才會被執(zhí)行。

示例:

age = 20

if age >= 18:
    print("你已經(jīng)成年了")

輸出:

你已經(jīng)成年了

2. if-else 結(jié)構(gòu)(兩分支選擇)

用于處理“要么這樣,要么那樣”的情況。

語法結(jié)構(gòu):

if 條件:
    語句塊1
else:
    語句塊2

示例:

temperature = 15

if temperature > 20:
    print("北京天氣今天很暖和")
else:
    print("北京天氣今天有點(diǎn)冷")

輸出:

北京天氣今天有點(diǎn)冷

3. if-elif-else 結(jié)構(gòu)(多分支選擇)

用于處理多個條件判斷的情況(相當(dāng)于“多項選擇”)。

語法結(jié)構(gòu):

if 條件1:
    語句塊1
elif 條件2:
    語句塊2
elif 條件3:
    語句塊3
else:
    默認(rèn)語句塊

示例:

score = 85

if score >= 90:
    print("優(yōu)秀")
elif score >= 80:
    print("良好")
elif score >= 60:
    print("及格")
else:
    print("不及格")

輸出:

良好

?? elif 是 "else if" 的縮寫。Python 中沒有 switch 語句,if-elif-else 是推薦的替代方案。

4. 嵌套 if 語句

嵌套 指的是在一個 if 塊內(nèi)部再寫 if 判斷。可以用來表示更復(fù)雜的邏輯結(jié)構(gòu)。

示例:

age = 25
is_student = True

if age < 30:
    if is_student:
        print("你是年輕的學(xué)生")
    else:
        print("你是年輕的上班族")

輸出:

你是年輕的學(xué)生

?? 注意縮進(jìn)層級,Python 是靠縮進(jìn)來識別代碼塊的!

5. 條件表達(dá)式(三元運(yùn)算符)

Python 支持一種簡潔的寫法:在一行中完成 if-else 判斷

語法:

變量 = 值1 if 條件 else 值2

示例:

age = 16
status = "成年" if age >= 18 else "未成年"
print(status)

輸出:

未成年

適合用于 根據(jù)條件選擇一個值賦給變量 的情況。

小結(jié)一下吧

類型場景示例
if只有一個條件
if-else兩種可能,二選一
if-elif-else多種情況,依次判斷
嵌套 if條件套條件,多層判斷
三元表達(dá)式簡潔地賦值,適合一行判斷

? 小練習(xí)題

練習(xí) 1:分?jǐn)?shù)等級判斷器

讓用戶輸入一個 0~100 的整數(shù),判斷其屬于哪個等級:

  • 90 以上:優(yōu)秀

  • 80~89:良好

  • 70~79:中等

  • 60~69:及格

  • 低于 60:不及格

  • 其他情況提示“輸入有誤”

練習(xí) 2:三角形合法性判斷

輸入三條邊的長度,判斷是否能組成一個三角形(任意兩邊之和大于第三邊),并進(jìn)一步判斷:

  • 是等邊三角形

  • 是等腰三角形

  • 是普通三角形

  • 否則輸出“不合法的三角形”

練習(xí) 3:模擬 ATM 登錄與權(quán)限檢查(嵌套)

假設(shè)用戶名為 admin,密碼為 8888,登錄成功后再檢查是否為管理員(管理員輸入 "yes" 才能繼續(xù)操作)。

練習(xí) 4:三元運(yùn)算小測試

輸入一個數(shù)字,輸出 "正數(shù)"、"負(fù)數(shù)""零"用三元運(yùn)算符 實現(xiàn)。

(三)循環(huán)(Loops)

在編程中,我們常常需要重復(fù)執(zhí)行某些操作,比如遍歷列表、處理每一行數(shù)據(jù)、執(zhí)行某個動作直到滿足條件等等。Python 提供了兩種主要的循環(huán)結(jié)構(gòu):while 循環(huán)和 for 循環(huán),配合控制語句(如 break、continue可以構(gòu)建出豐富的循環(huán)邏輯。

1. while循環(huán)(基于條件重復(fù)執(zhí)行)

? 基本語法
while 條件表達(dá)式:
    循環(huán)體
  • 每次循環(huán)前都會檢查“條件表達(dá)式”的值;

  • 條件為 True → 執(zhí)行循環(huán)體;

  • 條件為 False → 結(jié)束循環(huán)。

?? 示例:打印 1 到 5 的數(shù)字
i = 1
while i <= 5:
    print(i)
    i += 1
??break語句(提前終止循環(huán))

break 用于立即跳出整個循環(huán)結(jié)構(gòu),不管循環(huán)條件是否還為 True。

i = 1
while True:
    print(i)
    if i == 3:
        break
    i += 1

輸出:1, 2, 3,然后退出循環(huán)

??continue語句(跳過當(dāng)前迭代)

continue 用于跳過本次循環(huán)中剩下的語句,直接進(jìn)入下一次判斷。

i = 0
while i < 5:
    i += 1
    if i == 3:
        continue
    print(i)

輸出:1, 2, 4, 5(跳過了 3)

2.for循環(huán)(用于遍歷序列)

? 基本語法
for 變量 in 可迭代對象:
    循環(huán)體

可迭代對象包括:字符串、列表、字典、集合、元組等。

?? 遍歷字符串
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()函數(shù)與數(shù)值循環(huán)
for i in range(1, 6):
    print(i)
  • range(n):0 到 n-1

  • range(start, end):start 到 end-1

  • range(start, end, step):按步長生成

??enumerate()結(jié)合索引遍歷

想同時獲取元素和下標(biāo)時使用 enumerate()

colors = ['red', 'green', 'blue']
for index, color in enumerate(colors):
    print(f"{index}: {color}")

3. 循環(huán)控制語句

?break:提前終止整個循環(huán)

通常與 if 配合使用,用于在滿足某個條件時立即退出循環(huán)。

for i in range(1, 10):
    if i == 5:
        break
    print(i)
?continue:跳過當(dāng)前迭代

用于跳過某些不符合條件的值。

for i in range(1, 6):
    if i % 2 == 0:
        continue
    print(i)  # 輸出 1 3 5(跳過偶數(shù))
?else語句在循環(huán)中的作用

else 可以與 forwhile 循環(huán)一起使用:

  • 當(dāng)循環(huán)沒有被 break 中斷時,else 中的語句會執(zhí)行。

    for i in range(1, 5):
        if i == 10:
            break
    else:
        print("未被 break,循環(huán)正常結(jié)束")
    

    這在處理搜索類問題時特別有用:

    nums = [1, 3, 5, 7]
    target = 4
    for num in nums:
        if num == target:
            print("找到目標(biāo)")
            break
    else:
        print("未找到目標(biāo)")
    

小結(jié)一下吧

循環(huán)類型用途特點(diǎn)
while條件控制循環(huán)不確定次數(shù)時使用
for遍歷序列更簡潔,適合固定結(jié)構(gòu)
break跳出循環(huán)終止整個循環(huán)體
continue跳過本次迭代繼續(xù)下一輪
else循環(huán)結(jié)構(gòu)補(bǔ)充僅在循環(huán)未被 break時執(zhí)行

? 小練習(xí)題

?? 練習(xí)題 1:打印 1~100 中所有能被 7 整除的數(shù)
?? 練習(xí)題 2:使用while計算從 1 累加到 n 的和(n 由用戶輸入)
?? 練習(xí)題 3:找出列表中第一個大于 50 的元素,并輸出其值和索引
?? 練習(xí)題 4:輸出 1~30 中除了能被 3 整除的數(shù)(使用 continue)
?? 練習(xí)題 5:統(tǒng)計一段字符串中元音字母的個數(shù)(不區(qū)分大小寫)
?? 練習(xí)題 6:使用for和else實現(xiàn)一個猜數(shù)字小游戲

四、函數(shù)與相關(guān)基礎(chǔ)知識:讓代碼會“思考”的魔法工具

在編程的世界里,函數(shù)就像是程序的“積木”:它們能把一段可復(fù)用的操作封裝起來,想用就調(diào)用,修改也方便,堪稱優(yōu)雅代碼的起點(diǎn)。

無論是打印一行文字,計算一個數(shù)列的和,還是訓(xùn)練一個 AI 模型,本質(zhì)上你做的都是“定義功能 + 調(diào)用功能” —— 這正是函數(shù)的使命。

(一)函數(shù)基礎(chǔ)

1. 什么是函數(shù)?為什么要使用函數(shù)?

在編程中,函數(shù)是一個非常重要的概念,它可以被理解為“功能塊”,用來封裝一段代碼,供其他地方調(diào)用。通過函數(shù),開發(fā)者可以:

  • 提高代碼復(fù)用性:避免重復(fù)寫相同的代碼,簡化開發(fā)和維護(hù)。

  • 增強(qiáng)可讀性:將復(fù)雜的任務(wù)拆解成小的、獨(dú)立的單元,便于理解。

  • 分隔邏輯:函數(shù)讓代碼的邏輯結(jié)構(gòu)更加清晰和模塊化,有助于團(tuán)隊協(xié)作開發(fā)。

例如,我們可以定義一個函數(shù)來計算兩個數(shù)字的和,而不需要每次都重復(fù)寫加法的操作。只要定義一次,后續(xù)就可以隨時調(diào)用。

2. 使用def定義函數(shù)

在 Python 中,函數(shù)是通過 def 關(guān)鍵字來定義的。它的基本語法如下:

def function_name(parameters):
    # 函數(shù)體
    return result
  • def 是 Python 中定義函數(shù)的關(guān)鍵字

  • function_name 是你給函數(shù)命名的名稱,符合命名規(guī)則

  • parameters 是函數(shù)的輸入(可以沒有)

  • return 是返回結(jié)果的關(guān)鍵字(如果不返回任何值,則默認(rèn)為 None

示例:一個簡單的加法函數(shù)
def add(a, b):
    return a + b

# 調(diào)用函數(shù)
result = add(3, 5)
print(result)  # 輸出: 8

這里我們定義了一個 add 函數(shù),輸入?yún)?shù)是 ab,它們會被加在一起并返回結(jié)果。

3. 函數(shù)的調(diào)用和執(zhí)行流程

定義函數(shù)后,調(diào)用函數(shù)就能執(zhí)行該函數(shù)的代碼。Python 會根據(jù)函數(shù)調(diào)用的順序進(jìn)入函數(shù)體,并執(zhí)行其中的代碼。

  • 當(dāng)函數(shù)被調(diào)用時,程序會暫停當(dāng)前位置,跳轉(zhuǎn)到函數(shù)體執(zhí)行代碼,直到遇到 return 語句(或者函數(shù)執(zhí)行完畢)才返回。

  • 如果沒有 return 語句,則返回 None。

示例:簡單的函數(shù)調(diào)用與返回值
def greet(name):
    return f"Hello, {name}!"

message = greet("Alice")
print(message)  # 輸出: Hello, Alice!

這里的 greet 函數(shù)通過 return 語句返回了一個字符串,調(diào)用時傳入了參數(shù) "Alice",最終返回 "Hello, Alice!"。

4.print()與return的區(qū)別與使用場景

在 Python 中,print()return 都用于輸出數(shù)據(jù),但它們有顯著的不同:

  • print() 用于將信息輸出到控制臺,主要用于調(diào)試、輸出中間結(jié)果或與用戶交互。

  • return 用于函數(shù)的輸出,它將值返回給調(diào)用者,可以被其他代碼再次使用。

示例: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 返回結(jié)果,這個返回值可以在代碼的其他地方使用或存儲。

小結(jié)一下吧

  • 函數(shù)是代碼復(fù)用、模塊化的核心工具。

  • 使用 def 定義函數(shù),return 返回值。

  • print() 用于輸出調(diào)試信息,return 用于返回計算結(jié)果。

(二)函數(shù)參數(shù)

函數(shù)參數(shù)是函數(shù)接收外部輸入的方式。理解和掌握函數(shù)參數(shù)的使用,不僅能幫助你編寫更靈活的代碼,還能讓你的程序更具擴(kuò)展性和可維護(hù)性。

1. 位置參數(shù)

位置參數(shù)是最常見的函數(shù)參數(shù)類型,它是指參數(shù)傳遞時位置的順序決定了每個參數(shù)的含義。

例如,在函數(shù)定義時,參數(shù) ab 的位置決定了它們的意義。當(dāng)調(diào)用函數(shù)時,傳遞的參數(shù)值會根據(jù)位置匹配到相應(yīng)的參數(shù)。

示例:位置參數(shù)
def add(a, b):
    return a + b

result = add(3, 5)  # 位置參數(shù):3 被賦值給 a,5 被賦值給 b
print(result)  # 輸出: 8

這里的 add 函數(shù)有兩個位置參數(shù):ab。我們調(diào)用 add(3, 5) 時,3 會賦值給 a,5 會賦值給 b,最終返回它們的和。

2. 關(guān)鍵字參數(shù)

關(guān)鍵字參數(shù)允許你在調(diào)用函數(shù)時顯式地指定每個參數(shù)的名稱。這樣可以不關(guān)心參數(shù)的順序,只需要知道參數(shù)名。

示例:關(guān)鍵字參數(shù)
def greet(name, age):
    return f"Hello, {name}! You are {age} years old."

message = greet(age=25, name="Alice")  # 參數(shù)順序不重要
print(message)  # 輸出: Hello, Alice! You are 25 years old.

在調(diào)用 greet 函數(shù)時,agename 的順序不再重要,關(guān)鍵字參數(shù)通過指定 age=25name="Alice" 來傳遞值。

3. 默認(rèn)參數(shù)

默認(rèn)參數(shù)是指在定義函數(shù)時,為某些參數(shù)提供默認(rèn)值。如果調(diào)用時沒有提供這些參數(shù)的值,Python 會使用默認(rèn)值。

示例:默認(rèn)參數(shù)
def greet(name, age=18):  # age 有默認(rèn)值
    return f"Hello, {name}! You are {age} years old."

message1 = greet("Alice")  # 調(diào)用時沒有提供 age,使用默認(rèn)值
message2 = greet("Bob", 30)  # 調(diào)用時提供了 age,覆蓋默認(rèn)值

print(message1)  # 輸出: Hello, Alice! You are 18 years old.
print(message2)  # 輸出: Hello, Bob! You are 30 years old.

greet 函數(shù)中,age 有默認(rèn)值 18。如果調(diào)用時沒有傳入 age,就會使用默認(rèn)值;如果傳入了 age,則會覆蓋默認(rèn)值。

4. 可變參數(shù):*args與**kwargs

有時候我們不知道函數(shù)需要接收多少個參數(shù),這時可以使用 可變參數(shù)

  • *args 用于接收位置參數(shù),它將接收多余的位置參數(shù)并將其打包成一個元組。

  • **kwargs 用于接收關(guān)鍵字參數(shù),它將接收多余的關(guān)鍵字參數(shù)并將其打包成一個字典。

示例:*args和**kwargs
def example(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

# 調(diào)用函數(shù)時傳入不同數(shù)量的參數(shù)
example(1, 2, 3, name="Alice", age=25)

# 輸出:
# args: (1, 2, 3)
# kwargs: {'name': 'Alice', 'age': 25}
  • *args 將所有位置參數(shù)(1, 2, 3)打包成一個元組 (1, 2, 3)。

  • **kwargs 將所有關(guān)鍵字參數(shù)(name="Alice", age=25)打包成一個字典 {'name': 'Alice', 'age': 25}

5. 參數(shù)順序規(guī)范

當(dāng)一個函數(shù)同時使用位置參數(shù)、默認(rèn)參數(shù)和可變參數(shù)時,有一定的順序規(guī)范,必須遵循以下順序:

  • 位置參數(shù)

  • 默認(rèn)參數(shù)

  • *args

  • **kwargs

示例:參數(shù)順序
def function(a, b=2, *args, c, **kwargs):
    print(a, b, args, c, kwargs)

# 調(diào)用時,按照順序傳遞參數(shù)
function(1, c=3, d=4, e=5)
# 輸出: 1 2 () 3 {'d': 4, 'e': 5}
  • a 是位置參數(shù),必須最先提供。

  • b 是默認(rèn)參數(shù),如果不提供則使用默認(rèn)值。

  • *args 用于接收多余的所有位置參數(shù)。

  • c 是一個關(guān)鍵字參數(shù),調(diào)用時必須顯式指定。

  • **kwargs 用于接收多余的所有關(guān)鍵字參數(shù)。

小結(jié)一下吧

  • 位置參數(shù):根據(jù)參數(shù)順序傳遞值。

  • 關(guān)鍵字參數(shù):顯式指定參數(shù)名和值。

  • 默認(rèn)參數(shù):函數(shù)定義時為參數(shù)提供默認(rèn)值。

  • 可變參數(shù):*args 用于接收多位置參數(shù),**kwargs 用于接收多關(guān)鍵字參數(shù)。

  • 參數(shù)順序:位置參數(shù) > 默認(rèn)參數(shù) > *args > **kwargs。

(三)函數(shù)返回值

在 Python 中,函數(shù)不僅可以執(zhí)行某些操作,還可以將結(jié)果“返回”給調(diào)用者。這就是 返回值(Return Value) 的概念。

通過 return 語句,函數(shù)可以把處理的結(jié)果交給外部使用。如果函數(shù)沒有 return,那它默認(rèn)返回的是 None。

1. 使用return返回結(jié)果

基本語法:

def function_name(...):
    ...
    return result

示例:

def square(x):
    return x * x

result = square(5)
print(result)  # 輸出: 25

函數(shù) square 返回的是 x 的平方,調(diào)用后我們可以拿到這個結(jié)果并繼續(xù)使用。

2. 返回多個值(元組)

Python 支持從一個函數(shù)中返回多個值,這些值實際上被打包成一個元組返回。

示例:

def get_name_and_age():
    name = "Alice"
    age = 30
    return name, age

n, a = get_name_and_age()
print(n)  # Alice
print(a)  # 30

多值返回的本質(zhì)是:return name, age 等價于 return (name, age),然后通過拆包語法接收。

3. 函數(shù)無返回值時的表現(xiàn)

如果函數(shù)中沒有 return 語句,或者只是 return 而沒有值,那默認(rèn)返回的是 None。

示例:

def say_hello():
    print("Hello!")

result = say_hello()
print(result)  # 輸出: None

這個函數(shù) say_hello() 雖然做了事情(打?。珱]有 return,因此返回值是 None

4. 提前終止函數(shù)執(zhí)行

return 不僅能返回值,還能用來提前終止函數(shù)的執(zhí)行。

示例:

def divide(a, b):
    if b == 0:
        return "除數(shù)不能為 0"
    return a / b

print(divide(10, 0))  # 輸出: 除數(shù)不能為 0
print(divide(10, 2))  # 輸出: 5.0

當(dāng) b 是 0 時,函數(shù)遇到第一個 return 后立即終止執(zhí)行,不會繼續(xù)往下運(yùn)行。

5. 將返回值作為表達(dá)式使用

函數(shù)返回值可以被用在其他表達(dá)式或函數(shù)中,像這樣:

def add(a, b):
    return a + b

print(add(2, 3) * 10)  # 輸出: 50

add(2, 3) 會返回 5,然后再與 10 相乘。

小結(jié)一下吧

內(nèi)容示例返回值說明
返回單個值return x返回一個對象
返回多個值return x, y返回一個元組
無 return 或 return Nonereturn / 無 return返回 None
提前結(jié)束函數(shù)if ...: return ...直接退出函數(shù)
返回值可以參與表達(dá)式add(1, 2) * 3函數(shù)結(jié)果用于計算

(四)函數(shù)返回值類型注解(Type Hint / Type Annotation)

1. Python 3 引入的類型注解(Type Hints)

先用一句話理解:

def add(a: int, b: int) -> int:
    return a + b

?? -> int 的意思是:

這個函數(shù)“設(shè)計上”應(yīng)該返回一個 int

不是強(qiáng)制,只是“聲明”。這是 給“人”和“工具”看的,不是給 Python 解釋器強(qiáng)制執(zhí)行的

注意Python 不會強(qiáng)制檢查!下面的代碼 是合法的

def add(a: int, b: int) -> int:
    return "not a number"

Python 不會報錯。?類型注解的作用在于:

  • IDE(PyCharm)

  • 靜態(tài)檢查工具(mypy、pyright)

  • 閱讀代碼的人(包括未來的你)

2. 為什么現(xiàn)在的 Python 項目都強(qiáng)烈推薦用?

2.1 PyCharm 會變得非常聰明

def foo() -> dict[str, int]:
    return {"a": 1}

你輸入:

result = foo()
result["a"].

PyCharm 會自動提示:?? 這是 int,有哪些方法

2.2 提前發(fā)現(xiàn) bug(不用等運(yùn)行)

def get_age() -> int:
    return "18"

PyCharm / mypy 會直接警告你:

Expected int, got str

3. 常見的返回值寫法(你一定會遇到)

3.1 返回多個類型(Union)

from typing import Union

def parse(s: str) -> Union[int, None]:
    if s.isdigit():
        return int(s)
    return None

Python 3.10+ 更推薦:

def parse(s: str) -> int | None:
    ...

3.2 返回列表 / 字典

def get_names() -> list[str]:
    return ["Alice", "Bob"]

def get_scores() -> dict[str, int]:
    return {"math": 90}

3.3 返回自定義對象

class User:
    ...

def get_user() -> User:
    return User()

五、字符串操作模塊

在 Python 中,字符串(str)是最常用、最重要的數(shù)據(jù)類型之一。無論你是在處理用戶輸入、讀取文件、構(gòu)建網(wǎng)頁內(nèi)容、分析文本數(shù)據(jù),幾乎都繞不開對字符串的處理。

現(xiàn)在我們總結(jié)掌握 Python 字符串的各種操作方法,從最基本的創(chuàng)建與訪問,到復(fù)雜的格式化,我們需要學(xué)會如何清洗、切割、替換、判斷和重組字符串,并為后續(xù)的數(shù)據(jù)處理與文本分析打下堅實基礎(chǔ)。

(一)字符串基礎(chǔ)

在 Python 中,字符串(str)是用來表示文本的數(shù)據(jù)類型。本部分介紹字符串的創(chuàng)建方式、基本特性、訪問技巧以及常見的基本操作。

1. 字符串的定義與創(chuàng)建

字符串可以用 單引號 '、雙引號 "三引號 ''' / """ 括起來。

# 單引號
s1 = 'hello'

# 雙引號
s2 = "world"

# 三引號(支持多行)
s3 = '''This is
a multi-line
string.'''

?? Python 中單引號和雙引號作用相同,主要用于避免轉(zhuǎn)義沖突。

2. 字符串是不可變對象

字符串是 不可變的(immutable):創(chuàng)建后無法修改,只能重新賦值。

s = "hello"
# s[0] = 'H'  # ? 錯誤!字符串不能直接修改
s = "Hello"   # ? 只能重新賦值

3. 字符串的索引與切片

字符串可以看作字符的序列,可以通過索引或切片訪問其部分內(nèi)容。

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(反轉(zhuǎn)字符串)

? 切片非常強(qiáng)大,是字符串處理中不可或缺的工具。

4. 字符串的連接與重復(fù)

# 拼接字符串
a = "Hello"
b = "World"
c = a + " " + b
print(c)  # Hello World

# 重復(fù)字符串
print("ha" * 3)   # hahaha

5. 字符串的成員運(yùn)算

s = "python"
print("p" in s)      # True
print("z" not in s)  # True

6. 字符串與類型轉(zhuǎn)換

num = 123
text = str(num)  # 數(shù)字轉(zhuǎn)字符串
print("數(shù)字是:" + text)

# 也可以使用 f-string(推薦)
print(f"數(shù)字是:{num}")

小結(jié)一下吧

操作類型常用方法 / 語法
創(chuàng)建字符串'abc', "abc", '''abc'''
索引s[0], s[-1]
切片s[1:4], s[::-1]
拼接與重復(fù)+, *
判斷是否存在in, not in
類型轉(zhuǎn)換str(x), f"{x}"

(二)字符串常見操作方法

Python 的字符串類型(str)內(nèi)建了大量實用的方法,幫助我們完成查找、替換、對齊、大小寫轉(zhuǎn)換、格式化等各類文本處理任務(wù)。本節(jié)將系統(tǒng)講解所有主流、實用的方法,并配合用例說明。

1. 大小寫轉(zhuǎn)換

方法作用
.lower()轉(zhuǎn)為小寫
.upper()轉(zhuǎn)為大寫
.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)找到子串首次出現(xiàn)的位置(找不到返回 -1)
.rfind(sub)從右側(cè)開始查找
.index(sub)與 find 類似,但找不到拋出異常
.startswith(prefix)是否以某前綴開頭
.endswith(suffix)是否以某后綴結(jié)尾
.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()刪除左側(cè)空白符
.rstrip()刪除右側(cè)空白符
.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 填充左側(cè)數(shù)字部分
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. 內(nèi)容判斷類方法(返回布爾值)

方法判斷類型
.isalpha()是否全字母
.isdigit()是否全數(shù)字
.isalnum()是否全是字母或數(shù)字
.isspace()是否全是空白符
.isupper()是否全為大寫
.islower()是否全為小寫
.istitle()是否符合標(biāo)題規(guī)范(首字母大寫)
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}|")  # 居中+右對齊:|  Alice   | 30|

8. 轉(zhuǎn)義字符與原始字符串

字符含義
\n換行
\t制表符
\\反斜杠
r""原始字符串,不轉(zhuǎn)義
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."
    )
    
  • 字符串比較支持 <, >, == 等字典序?qū)Ρ龋?/p>

    print("apple" < "banana")  # True

小結(jié):常用字符串方法分類對照表

類型常用方法
查找判斷find(), startswith(), in
修改清洗strip(), replace()
大小寫處理lower(), capitalize()
對齊填充center(), zfill()
格式化f"", format()
判斷內(nèi)容isdigit(), isalpha()
分割拼接split(), join()
其他len(), 轉(zhuǎn)義、比較等

(三)字符串切片與索引

1. 字符串索引(正向索引 / 負(fù)向索引)

Python 字符串是序列類型,每個字符都有對應(yīng)的索引位置。我們可以通過索引訪問字符串中的單個字符。

?? 正向索引(從 0 開始)
s = "python"
print(s[0])  # p
print(s[1])  # y
print(s[5])  # n
字符python
索引012345
?? 負(fù)向索引(從 -1 開始,表示從右往左)
s = "python"
print(s[-1])  # n
print(s[-2])  # o
print(s[-6])  # p
字符python
索引-6-5-4-3-2-1

注意

  • 超出索引范圍(如 s[10])會拋出 IndexError。

  • 字符串是 不可變對象,不能通過索引修改某個字符。

2. 字符串切片([start:stop:step])

切片(slice)是從字符串中提取子串的一種方式,語法格式為:

s[start : stop : step]
  • start:起始索引(包含)

  • stop:終止索引(不包含)

  • step:步長(默認(rèn)為 1)

基礎(chǔ)切片
s = "Hello, Python!"

print(s[0:5])   # Hello
print(s[7:13])  # Python
print(s[:5])    # Hello(從頭開始)
print(s[7:])    # Python!(直到結(jié)尾)
使用負(fù)數(shù)索引切片
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 個取)
反向切片(步長為負(fù)數(shù))
s = "abcdef"
print(s[::-1])   # fedcba(字符串反轉(zhuǎn))
print(s[-1:-7:-1]) # fedcba(等同上行)
切片邊界記憶口訣
  • 包頭不包尾:起始位置包含,結(jié)束位置不包含。

  • 步長方向一致:正數(shù)步長從左到右,負(fù)數(shù)步長從右到左。

  • 索引可以為負(fù):負(fù)索引從末尾向前數(shù)。

3. 字符串的遍歷

遍歷字符串可以逐個訪問其字符,常用于統(tǒng)計、查找、生成新字符串等任務(wù)。

基礎(chǔ)遍歷
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

經(jīng)典應(yīng)用場景小結(jié)

場景示例
提取子串s[3:7]
字符串反轉(zhuǎn)s[::-1]
判斷回文s == s[::-1]
截取前綴/后綴s[:3]s[-3:]
每隔一個字符取s[::2]

(四)字符串格式化

Python 提供了三種主要的字符串格式化方式:

  • % 占位符格式化(經(jīng)典寫法)

  • str.format() 方法格式化(兼容寫法)

  • f-string 格式化(推薦方式,Python 3.6+)

1.%占位符格式化(C 風(fēng)格)

這是最早期的格式化方式,語法類似于 C 語言:

name = "Alice"
age = 25
print("My name is %s and I am %d years old." % (name, age))
占位符含義
%s字符串
%d整數(shù)
%f浮點(diǎn)數(shù)(默認(rèn)小數(shù)點(diǎn)后 6 位)
%.2f浮點(diǎn)數(shù)保留 2 位小數(shù)

缺點(diǎn):可讀性差、容易出錯,不推薦用于新代碼。

2.str.format()方法格式化

引入于 Python 2.7 / 3.0,支持位置參數(shù)、關(guān)鍵字參數(shù),更靈活:

name = "Alice"
age = 25
print("My name is {} and I am {} years old.".format(name, age))
?? 支持位置參數(shù) / 關(guān)鍵字參數(shù)
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

缺點(diǎn):寫法較冗長,推薦 f-string 替代。

3.f-string 格式化(Python 3.6+,推薦?)

最現(xiàn)代、最簡潔的格式化方式,代碼更清晰,推薦作為首選寫法。

name = "Alice"
age = 25
print(f"My name is {name} and I am {age} years old.")
?? 支持表達(dá)式
a = 5
b = 3
print(f"{a} +  = {a + b}")
?? 支持格式化控制
pi = 3.1415926
print(f"Pi rounded to 2 digits: {pi:.2f}")
?? 與函數(shù)、數(shù)據(jù)結(jié)構(gòu)結(jié)合
user = {"name": "Bob", "score": 88}
print(f"{user['name']} scored {user['score']}")

三種方式對比

特性% 格式化str.format()f-string
可讀性?????
功能強(qiáng)大一般?????
寫法簡潔一般????
推薦程度? 不推薦? 過渡用法??? 首選

小結(jié)一下吧

  • 新代碼推薦 f-string,語法簡潔、表達(dá)能力強(qiáng)。

  • str.format() 適用于兼容舊版本 Python。

  • % 占位符方式適合了解,不建議用于正式項目中。

六、列表、字典與集合 —— Python 中的數(shù)據(jù)組織能力

(一)為什么需要“數(shù)據(jù)結(jié)構(gòu)”

在前面的章節(jié)中,我們已經(jīng)學(xué)習(xí)了 變量、基本數(shù)據(jù)類型、控制流和函數(shù)以及字符串。這些知識可以幫助我們描述一個值、處理一次邏輯、完成一個功能。

但在真實的程序中,我們面對的往往不是“一個值”,而是:

  • 一組數(shù)據(jù)

  • 多條記錄

  • 多個對象

  • 一批狀態(tài)或配置項

這正是 “數(shù)據(jù)結(jié)構(gòu)”存在的意義

1. 單個變量的局限性

先看一個最簡單的例子。如果我們只需要保存一個人的名字,用一個變量就足夠:

name = "張彥峰"

但如果現(xiàn)在要保存 10 個、100 個、甚至更多名字 呢?你顯然不可能這樣寫:

name1 = "盧政伯" name2 = "呂鴻昌" name3 = "秦學(xué)磊"

這種寫法存在明顯問題:

  • 變量數(shù)量不可控

  • 無法方便地進(jìn)行循環(huán)處理

  • 代碼幾乎不可維護(hù)

這時,我們需要一種方式,把“一組相關(guān)的數(shù)據(jù)”組織在一起。

2. 從“一個值”到“一組值”

繼續(xù)剛才的例子,如果我們希望把多個名字放在一起,Python 提供了 列表(list) 這樣的數(shù)據(jù)結(jié)構(gòu):

names = ["張彥峰","盧政伯","呂鴻昌","秦學(xué)磊"]

這樣做的好處是:

  • 所有名字屬于同一個整體

  • 可以通過循環(huán)統(tǒng)一處理

  • 可以按順序訪問、修改、刪除

這一步,本質(zhì)上是從:“一個變量保存一個值”升級為:“一個變量保存一組有結(jié)構(gòu)的數(shù)據(jù)”

3. 一條記錄 vs 多條記錄

再看一個更貼近實際開發(fā)的例子。假設(shè)我們要表示一個用戶的信息:

user_name = "張彥峰" user_age = 18 user_email = "zyf@alibaba.com"

這種寫法的問題在于:

  • 信息是分散的

  • 很難整體傳遞或管理

  • 字段之間缺乏明確的“歸屬關(guān)系”

這時,更合理的做法是使用 字典(dict)

user = {
    "name": "張彥峰",
    "age": 18,
    "email": "zyf@alibaba.com"
}

字典的特點(diǎn)是:

  • 通過 key(鍵) 來訪問數(shù)據(jù)

  • 每個字段都有清晰的含義

  • 非常適合描述“一條記錄”

如果現(xiàn)在有 多條用戶記錄,我們就可以把多個字典放進(jìn)一個列表中:

users = [
    {"name": "張彥峰", "age": 18},
    {"name": "張琴", "age": 18}
]

你可以看到:數(shù)據(jù)結(jié)構(gòu)是可以組合使用的這正是后面處理嵌套數(shù)據(jù)(如 JSON)的基礎(chǔ)。

4. 最常用的幾種數(shù)據(jù)結(jié)構(gòu)

在本章中,我們將系統(tǒng)學(xué)習(xí) Python 中最常用的幾種數(shù)據(jù)結(jié)構(gòu):

  • 列表(list):用于存儲有序、可變的一組數(shù)據(jù)

  • 字典(dict):用于存儲鍵值映射關(guān)系

  • 集合(set):用于去重和集合運(yùn)算

  • 元組(tuple):用于表示不可變的數(shù)據(jù)組合

通過這一章,你將逐步建立起這樣的能力:

根據(jù)問題特點(diǎn),選擇合適的數(shù)據(jù)結(jié)構(gòu),并高效地操作它們

這也是后續(xù)學(xué)習(xí) 嵌套結(jié)構(gòu)、JSON 數(shù)據(jù)解析、配置處理 的必要基礎(chǔ)。

(二)列表(List):有序數(shù)據(jù)的容器

列表是 Python 中最常用且強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)之一,廣泛用于存儲有序、可變的數(shù)據(jù)。作為一個容器類型,它不僅能存儲多種數(shù)據(jù)類型,還能高效支持?jǐn)?shù)據(jù)的添加、刪除、修改和訪問。掌握列表的使用是理解 Python 數(shù)據(jù)處理能力的重要基礎(chǔ)。

1. 列表的基本概念

列表(list)是一個有序的容器,可以存儲任意類型的數(shù)據(jù),包括整數(shù)、字符串、布爾值,甚至是其他列表。列表的核心特點(diǎn)包括:

  • 有序性:列表中的元素是按順序排列的,每個元素都有一個對應(yīng)的索引,索引從 0 開始。

  • 可變性:列表是可變的,可以在原地修改列表的內(nèi)容,例如添加、刪除或更新元素。

  • 支持多種數(shù)據(jù)類型:列表可以包含不同類型的元素,甚至可以存儲其他容器類型(如列表、字典等)。

# 示例:包含整數(shù)的列表
numbers = [1, 2, 3, 4, 5]

# 示例:包含不同數(shù)據(jù)類型的列表
info = ["Alice", 18, True, 3.14, ["nested", "list"]]

關(guān)鍵點(diǎn)與字符串(str)類似,列表也支持通過索引訪問和切片操作,但字符串是不可變的,而列表可以直接修改。

2. 列表的創(chuàng)建與訪問

創(chuàng)建列表

列表的創(chuàng)建非常簡便,可以通過方括號 [] 來定義??梢詣?chuàng)建空列表、包含多個元素的列表,或是包含混合類型元素的列表。

# 空列表
empty_list = []

# 含有多個整數(shù)的列表
numbers = [1, 2, 3, 4, 5]

# 含有不同類型的元素的列表
mixed = [1, "Alice", True, 3.14]
訪問列表元素

通過索引訪問列表中的元素,索引從 0 開始。列表還支持負(fù)索引,允許從列表的末尾開始訪問元素。

numbers = [10, 20, 30, 40]

# 正向索引
print(numbers[0])  # 10
print(numbers[3])  # 40

# 負(fù)向索引
print(numbers[-1])  # 40
print(numbers[-2])  # 30

此外,列表支持切片操作,可以通過指定起始和結(jié)束索引來獲取子列表。

# 切片示例
print(numbers[1:3])  # [20, 30]
print(numbers[:2])   # [10, 20]
print(numbers[2:])   # [30, 40]

注意:切片操作返回的是新列表,原列表內(nèi)容不受影響。

3. 列表的常用修改操作

列表是可變的,意味著可以在原地修改其內(nèi)容。常見的修改操作包括添加元素刪除元素修改元素。

添加元素
  • append():將元素添加到列表的末尾。

  • insert():將元素插入到指定的索引位置。

  • extend():批量追加

# 示例:添加元素
nums = [1, 2, 3]
nums.append(4)  # 在末尾添加元素
nums.insert(1, 1.5)  # 在索引 1 處插入元素
nums.extend([3, 4])   # [1, 2, 3, 4]

print(nums)  # 輸出: [1, 1.5, 2, 3, 4, 3, 4]
刪除元素
  • remove():刪除第一個匹配到的元素。

  • pop():刪除并返回指定索引位置的元素(默認(rèn)刪除最后一個元素)。

  • del:根據(jù)索引刪除元素。

  • clear():清空列表

# 示例:刪除元素
nums.remove(1.5)  # 刪除元素 1.5
popped_element = nums.pop()  # 刪除并返回最后一個元素
del nums[0]  # 刪除索引 0 處的元素

print(nums)  # 輸出: [2, 3, 4, 3]
修改元素

通過索引可以直接修改列表中的元素:

nums[0] = 10  # 將索引 0 處的元素修改為 10
print(nums)    # 輸出: [10, 3]

4. 列表的遍歷與循環(huán)配合

遍歷列表元素

遍歷列表元素時,最常用的是 for 循環(huán)??梢灾苯颖闅v列表的每個元素,或者使用 range() 函數(shù)配合索引來遍歷列表。

# 直接遍歷元素
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)  # 輸出每個水果

# 使用索引遍歷
for i in range(len(fruits)):
    print(i, fruits[i])  # 輸出索引和值

# 使用 enumerate 獲取索引和值
for idx, fruit in enumerate(fruits):
    print(idx, fruit)  # 輸出索引和值

應(yīng)用場景

  • 只關(guān)心值:直接遍歷元素。

  • 需要索引:使用 range()enumerate()

5. 列表的常用內(nèi)置操作與函數(shù)

Python 提供了豐富的內(nèi)置函數(shù)和方法來操作列表。以下是一些常用操作:

  • len():返回列表的長度。

  • in:檢查元素是否存在于列表中。

  • count():統(tǒng)計元素在列表中出現(xiàn)的次數(shù)。

  • index():查找元素首次出現(xiàn)的位置。

  • sort():原地排序。

  • sorted():返回一個新排序的列表。

  • reverse():原地反轉(zhuǎn)列表。

nums = [4, 2, 7, 1]

print(len(nums))     # 輸出: 4
print(2 in nums)     # 輸出: True
print(nums.count(2)) # 輸出: 1
print(nums.index(7)) # 輸出: 2

nums.sort()          # 原地排序
sorted_nums = sorted(nums)  # 返回新列表
nums.reverse()       # 原地反轉(zhuǎn)

注意sort()reverse() 會改變原列表,而 sorted() 返回新列表。

6. 列表推導(dǎo)式(List Comprehension)

列表推導(dǎo)式是 Python 中非常強(qiáng)大且簡潔的語法,它允許在一行代碼內(nèi)創(chuàng)建一個新的列表。相比于傳統(tǒng)的 for 循環(huán),列表推導(dǎo)式更加簡潔且執(zhí)行效率高。

# 基本語法:生成平方數(shù)列表
squares = [x**2 for x in range(5)]
print(squares)  # 輸出: [0, 1, 4, 9, 16]

# 帶條件的推導(dǎo)式:生成偶數(shù)的平方數(shù)列表
even_squares = [x**2 for x in range(5) if x % 2 == 0]
print(even_squares)  # 輸出: [0, 4, 16]

列表推導(dǎo)式的優(yōu)勢:

  • 簡潔性:可以用一行代碼替代多行。

  • 可讀性:語法清晰、易懂。

  • 性能:避免了手動使用 append()

7. 淺拷貝(Shallow Copy)與深拷貝(Deep Copy)

在 Python 中,理解淺拷貝與深拷貝的前提,是理解一個核心事實:

Python 中的變量,本質(zhì)上保存的是對象的引用(reference),而不是對象本身。

因此,“拷貝”并不等價于“生成一個完全獨(dú)立的新對象”,是否真正獨(dú)立,取決于拷貝的層級。

7.1 對象、引用與容器的關(guān)系模型

先從一個最小示例理解引用關(guān)系:

a = [1, 2, 3]
b = a

此時:

  • ab 指向 同一個 list 對象

  • a 的任何修改,都會體現(xiàn)在 b

a[0] = 100
print(b)  # [100, 2, 3]

這不是拷貝,而是 引用綁定(aliasing)。

7.2 淺拷貝(Shallow Copy)

淺拷貝的定義:創(chuàng)建一個新的容器對象,但容器中保存的元素仍然是對原對象中元素的引用。

換句話說:

  • 外層容器是新的

  • 內(nèi)層對象是共享的

常見的淺拷貝方式

以下方式都會產(chǎn)生淺拷貝:

b = a.copy()
b = a[:]
b = list(a)

淺拷貝的行為示意

a = [[1, 2], [3, 4]]
b = a.copy()

內(nèi)存關(guān)系可以抽象為:

a ──? list ──? [ L1 , L2 ]
b ──? list ──? [ L1 , L2 ]
  • ab 是兩個不同的列表對象

  • 但它們內(nèi)部的 L1L2 指向同一個子列表對象

淺拷貝的典型“坑”

a = [[1, 2], [3, 4]]
b = a.copy()

b[0][0] = 100
print(a)  # [[100, 2], [3, 4]]

原因分析:

  • b[0]a[0] 指向同一子列表

  • 修改子列表,會影響所有引用它的容器

淺拷貝何時是安全的

列表中包含 不可變對象,后續(xù)操作只涉及 整體替換,不修改內(nèi)部對象

a = [1, 2, 3, "abc"]
b = a.copy()

b[0] = 100  # 不影響 a

print(a) # [1, 2, 3, 'abc']
print(b) # [100, 2, 3, 'abc']
7.3 深拷貝(Deep Copy)

深拷貝的定義:遞歸地復(fù)制對象本身以及其內(nèi)部引用的所有子對象,生成完全獨(dú)立的對象樹。

特點(diǎn):

  • 外層容器獨(dú)立

  • 內(nèi)層對象也完全獨(dú)立

  • 修改任何層級都不會相互影響

深拷貝的標(biāo)準(zhǔn)方式

import copy

b = copy.deepcopy(a)

深拷貝的行為示意

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)

內(nèi)存模型:

a ──? list ──? [ L1 , L2 ]
b ──? list ──? [ L1' , L2' ]
  • L1 ≠ L1'

  • L2 ≠ L2'

深拷貝示例驗證

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)

b[0][0] = 100
print(a)  # [[1, 2], [3, 4]]
7.4 淺拷貝 vs 深拷貝的核心對比
維度淺拷貝深拷貝
外層容器新對象新對象
內(nèi)層對象共享引用完全獨(dú)立
性能相對較低
內(nèi)存占用
修改風(fēng)險高(嵌套結(jié)構(gòu))極低

8. list * n與淺拷貝的本質(zhì)關(guān)系

a = [[0]] * 3

等價于:

sub = [0]
a = [sub, sub, sub]

因此:

a[0][0] = 1
print(a)  # [[1], [1], [1]]

這是淺拷貝的一種極端形式:

  • 外層列表新建

  • 內(nèi)層對象全部指向同一個引用

正確構(gòu)造獨(dú)立子列表的方式

a = [[0] for _ in range(3)]

9. 列表的常見坑

淺拷貝問題

當(dāng)使用 * 運(yùn)算符復(fù)制包含可變元素的列表時,可能會發(fā)生意外的引用問題。例如:

a = [[1, 2]] * 3
a[0][0] = 100
print(a)  # 輸出: [[100, 2], [100, 2], [100, 2]]

原因:所有子列表都引用了同一個內(nèi)存地址,修改一個元素會影響所有子列表??梢允褂?copy.deepcopy() 來避免這種問題。

遍歷時修改列表

直接在遍歷列表時修改列表,可能會導(dǎo)致不預(yù)期的結(jié)果。例如:

nums = [1, 2, 3, 4]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)  # 刪除偶數(shù)元素
print(nums)  # 輸出: [1, 3]

解決辦法:遍歷列表的副本,如 nums[:],或者使用列表推導(dǎo)式來過濾元素。

# 解決方法:遍歷副本
for n in nums[:]:
    if n % 2 == 0:
        nums.remove(n)

小結(jié)一下吧

  • 列表是 有序、可變 的數(shù)據(jù)容器,是 Python 數(shù)據(jù)結(jié)構(gòu)的核心之一

  • 支持索引訪問、切片操作、原地修改和高效遍歷

  • 提供大量內(nèi)置方法,配合列表推導(dǎo)式可以寫出高效、優(yōu)雅的代碼

  • 常見風(fēng)險點(diǎn)主要集中在:

    • 淺拷貝與引用共享

    • 遍歷過程中修改列表

    • 誤用 list * n 構(gòu)造嵌套結(jié)構(gòu)

熟練掌握列表,將為后續(xù)學(xué)習(xí)字典、集合、嵌套數(shù)據(jù)結(jié)構(gòu)以及 JSON / 數(shù)據(jù)分析場景打下堅實基礎(chǔ)。

(三)字典(dict):鍵值映射的數(shù)據(jù)結(jié)構(gòu)

字典(dict)是 Python 中最核心、使用頻率極高的一種內(nèi)置數(shù)據(jù)結(jié)構(gòu),用于存儲 鍵值對(key-value)映射關(guān)系。它通過 key 直接定位 value,而不是像列表那樣依賴下標(biāo)位置,因此在表達(dá)“記錄型數(shù)據(jù)”“配置數(shù)據(jù)”“映射關(guān)系”時具有不可替代的優(yōu)勢。

從底層實現(xiàn)角度看,Python 字典基于 哈希表(Hash Table) 實現(xiàn),在絕大多數(shù)場景下,其查找、插入、刪除操作的時間復(fù)雜度都接近 O(1)。

1. 字典的設(shè)計思想

為什么需要字典?

列表適合解決以下問題:

  • 數(shù)據(jù) 有明確順序

  • 主要通過 位置(索引) 訪問

但在很多真實業(yè)務(wù)中,我們更關(guān)心的是:

  • “這個人的 年齡 是多少?”

  • “這個配置項 timeout 對應(yīng)的值是多少?”

此時,如果仍然依賴下標(biāo)訪問:

  • 可讀性差

  • 容易出錯

  • 不利于擴(kuò)展和維護(hù)

字典的核心思想是:

用有意義的 key,直接映射到對應(yīng)的 value

對比示例

# 使用列表表示用戶信息(語義不清晰)
user_list = ["Alice", 18, "alice@example.com"]

# 使用字典表示用戶信息(結(jié)構(gòu)清晰)
user_dict = {
    "name": "Alice",
    "age": 18,
    "email": "alice@example.com"
}

字典的優(yōu)勢

  • 字段含義清晰,代碼自解釋

  • 不依賴順序,結(jié)構(gòu)穩(wěn)定

  • 便于新增、刪除字段

  • 非常貼近 JSON / 配置文件 / 數(shù)據(jù)庫記錄的結(jié)構(gòu)

2. 字典的基本使用

創(chuàng)建字典
# 使用花括號(最常見)
user = {"name": "Alice", "age": 18}

# 使用 dict 構(gòu)造函數(shù)
user2 = dict(name="Bob", age=20)

# 從鍵值對列表創(chuàng)建
pairs = [("name", "Charlie"), ("age", 22)]
user3 = dict(pairs)
訪問 value
print(user["name"])        # Alice
print(user.get("age"))     # 18
重要約束說明
  • key 必須唯一:后定義的 key 會覆蓋之前的值

  • key 必須是不可變類型

    • 合法:strintfloat、tuple

    • 非法:list、dictset

# 合法
d = {(1, 2): "ok"}

# 非法(會拋出 TypeError)
d = {[1, 2]: "error"}

3. 字典的增刪改查(CRUD)

新增 / 修改(統(tǒng)一語法)
user["email"] = "alice@example.com"  # 新增
user["age"] = 19                       # 修改

字典不會區(qū)分“新增”和“修改”,是否存在 key 決定行為。

刪除元素
# 刪除指定 key
del user["email"]

# 刪除并返回 value
age = user.pop("age")
# 指定默認(rèn)值,避免 KeyError
age = user.pop("age", None)
查詢
user["name"]                 # 不存在會拋 KeyError
user.get("email")             # 不存在返回 None
user.get("email", "N/A")     # 返回默認(rèn)值
是否存在某個 key
"name" in user      # True / False
"email" not in user # True / False

4. 字典的遍歷方式

遍歷 key(默認(rèn)行為)
for key in user:
    print(key, user[key])
遍歷 value
for value in user.values():
    print(value)
遍歷 key-value 對(最常用)
for key, value in user.items():
    print(key, value)
遍歷時的注意事項
  • 遍歷過程中 不建議修改字典結(jié)構(gòu)(增刪 key)

  • 若需要修改,可先遍歷 list(user.keys())

5. 字典的常用方法與典型模式

常用方法速覽
user.keys()        # 所有 key(視圖對象)
user.values()      # 所有 value
user.items()       # (key, value) 對
user.clear()       # 清空字典
user.copy()        # 淺拷貝
setdefault:安全設(shè)置默認(rèn)值
user.setdefault("age", 18)

等價于:

if "age" not in user:
    user["age"] = 18
update:批量更新
user.update({"email": "alice@example.com", "age": 20})
典型模式一:計數(shù)器
words = ["apple", "banana", "apple", "cherry"]
counter = {}

for word in words:
    counter[word] = counter.get(word, 0) + 1

print(counter)
典型模式二:分組
students = [
    ("Alice", "A"),
    ("Bob", "B"),
    ("Charlie", "A")
]

groups = {}
for name, grade in students:
    groups.setdefault(grade, []).append(name)

print(groups) #{'A': ['Alice', 'Charlie'], 'B': ['Bob']}

6. 字典的拷貝與可變性

淺拷貝(Shallow Copy)
d1 = {"a": [1, 2]}
d2 = d1.copy()

d2["a"].append(3)
print(d1)  # {'a': [1, 2, 3]}

淺拷貝只復(fù)制“引用”,不會復(fù)制內(nèi)部的可變對象。

深拷貝(Deep Copy)
import copy

d1 = {"a": [1, 2]}
d2 = copy.deepcopy(d1)

d2["a"].append(3)
print(d1)  # {'a': [1, 2]}

7. 字典與列表的組合(復(fù)雜結(jié)構(gòu)建模)

列表中放字典
users = [
    {"name": "Alice", "age": 18},
    {"name": "Bob", "age": 20}
]

for user in users:
    print(user["name"], user["age"])
字典中放列表
grades = {
    "Alice": [90, 95, 88],
    "Bob": [75, 80, 82]
}

for name, scores in grades.items():
    avg = sum(scores) / len(scores)
    print(name, avg)
多層嵌套字典
users = {
    "Alice": {"age": 18, "email": "alice@example.com"},
    "Bob": {"age": 20, "email": "bob@example.com"}
}

print(users["Alice"]["email"])

小結(jié)一下吧

  • 字典是 鍵值映射容器,核心優(yōu)勢是按 key 快速訪問

  • 基于哈希表實現(xiàn),查找效率高

  • 支持完整的增刪改查操作

  • 提供豐富的方法與常見編程模式

  • 可與列表自由組合,構(gòu)建任意復(fù)雜數(shù)據(jù)結(jié)構(gòu)

熟練掌握字典,是后續(xù)學(xué)習(xí) JSON 處理、配置管理、Web 開發(fā)、數(shù)據(jù)分析 的關(guān)鍵基礎(chǔ)。

(四)集合(set):去重與集合運(yùn)算

集合(set)是 Python 中用于存儲唯一元素并支持數(shù)學(xué)集合運(yùn)算的一種內(nèi)置數(shù)據(jù)結(jié)構(gòu)。其核心價值在于:

  • 天然去重

  • 高效的成員判斷(O(1) 平均時間復(fù)雜度)

  • 直觀表達(dá)集合關(guān)系(交集、并集、差集等)

在實際開發(fā)中,集合常用于數(shù)據(jù)清洗、權(quán)限控制、標(biāo)簽計算、關(guān)系判斷等場景。

1. 什么是集合(set)

集合的概念來源于數(shù)學(xué)中的集合:一組不重復(fù)的元素構(gòu)成的整體。

# 使用大括號創(chuàng)建集合
fruits = {"apple", "banana", "cherry"}
print(fruits)
# 輸出順序不固定,例如:{'banana', 'apple', 'cherry'}

# 使用 set() 構(gòu)造函數(shù)
nums = set([1, 2, 3, 2, 1])
print(nums)  # {1, 2, 3},自動去重

核心特性

  • 無序(unordered)不支持索引和切片操作;元素順序不穩(wěn)定,每次打印結(jié)果可能不同

  • 元素唯一(unique)相同元素只會保留一份,適合用于去重、排重邏輯

  • 成員判斷高效x in set 的時間復(fù)雜度為 O(1),明顯快于列表的 O(n)

  • 僅支持可哈希(hashable)類型合法元素:intfloat、str、tuple;非法元素:list、dict、set

s = {(1, 2), "abc", 10}   # 合法
# s = {[1, 2], 3}         # TypeError: unhashable type: 'list'

2. 集合的創(chuàng)建方式

# 空集合(注意不能用 {})
empty_set = set()

# 從列表 / 元組 / 字符串創(chuàng)建
set([1, 2, 2, 3])
set(("a", "b", "a"))
set("hello")   # {'h', 'e', 'l', 'o'}

?? {} 表示空字典,而不是空集合。

3. 集合的基本操作

添加元素
nums = {1, 2, 3}
nums.add(4)
print(nums)  # {1, 2, 3, 4}
  • add():一次只能添加一個元素

刪除元素
nums.remove(2)    # 元素不存在會拋 KeyError
nums.discard(5)   # 元素不存在不會報錯
popped = nums.pop()  # 隨機(jī)刪除并返回一個元素
nums.clear()      # 清空集合

對比說明

方法元素不存在時使用建議
remove拋異常確保元素一定存在
discard不報錯更安全,推薦
pop隨機(jī)刪除不依賴具體元素
成員判斷
nums = {1, 2, 3}
print(2 in nums)       # True
print(5 not in nums)  # True

集合是做“是否存在”判斷的首選結(jié)構(gòu)。

4. 集合運(yùn)算(重點(diǎn))

集合支持與數(shù)學(xué)集合一致的運(yùn)算語義。

a = {1, 2, 3}
b = {3, 4, 5}
并集(Union)
print(a | b)
print(a.union(b))
# {1, 2, 3, 4, 5}
交集(Intersection)
print(a & b)
print(a.intersection(b))
# {3}
差集(Difference)
print(a - b)
print(a.difference(b))
# {1, 2}
對稱差集(Symmetric Difference)
print(a ^ b)
print(a.symmetric_difference(b))
# {1, 2, 4, 5}

5. 集合關(guān)系判斷

a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b))      # True  子集
print(b.issuperset(a))   # True  超集
print(a.isdisjoint({4})) # True  是否無交集

常用于:權(quán)限校驗、條件覆蓋判斷。

6. 可變集合與不可變集合

set(可變)
  • 支持 add / remove

  • 不能作為字典的 key

frozenset(不可變)
fs = frozenset([1, 2, 3])
  • 一旦創(chuàng)建不可修改

  • 可作為字典 key 或集合元素

  • 常用于配置、常量集合

7. 典型應(yīng)用場景

去重
nums = [1, 2, 2, 3, 4, 4]
unique_nums = list(set(nums))
權(quán)限 / 標(biāo)簽判斷
user_roles = {"admin", "editor"}
required_roles = {"editor", "viewer"}

if user_roles & required_roles:
    print("有權(quán)限")
查找共同元素
team_a = {"Alice", "Bob", "Charlie"}
team_b = {"Bob", "David"}

common = team_a & team_b
數(shù)據(jù)差異分析
old_users = {1, 2, 3}
new_users = {2, 3, 4}

lost = old_users - new_users   # 流失用戶
added = new_users - old_users  # 新增用戶

8. 與列表、字典的對比

結(jié)構(gòu)是否有序是否可重復(fù)核心用途
list順序數(shù)據(jù)
dict是(3.7+)key 不可重復(fù)映射關(guān)系
set去重 / 關(guān)系計算

小結(jié)一下吧

  • 集合是 無序、不重復(fù) 的數(shù)據(jù)結(jié)構(gòu)

  • 成員判斷和集合運(yùn)算效率極高

  • 核心能力:

    • 去重

    • 并 / 交 / 差 / 對稱差

    • 子集 / 超集判斷

  • 是處理“關(guān)系型數(shù)據(jù)”和“唯一性約束”的利器

掌握集合后,你可以用更簡潔、更高效的方式解決大量實際問題,為后續(xù)復(fù)雜數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)打下堅實基礎(chǔ)。

(五)元組(tuple):不可變序列

元組(tuple)是 Python 中的一種有序、不可變的序列類型。它在語法和使用方式上與列表(list)非常相似,但核心差異在于:一旦創(chuàng)建,元組的結(jié)構(gòu)不能被修改

在實際開發(fā)中,元組常用于:

  • 表示固定含義的數(shù)據(jù)組合

  • 作為函數(shù)的多返回值

  • 作為字典的 key

  • 在某些場景下,替代列表以提升安全性和性能

1. 元組的基本概念

元組的核心特性

  • 有序(Ordered)元素按順序存儲,可以通過索引訪問

  • 不可變(Immutable)元組創(chuàng)建后,不能修改、添加、刪除元素

  • 可包含任意類型支持混合類型,支持嵌套結(jié)構(gòu)

point = (10, 20)
info = ("Alice", 18, True, ["Python", "Go"])

元素訪問

print(point[0])   # 10
print(info[1])    # 18
print(info[-1])   # ['Python', 'Go']

元組 vs 列表(核心對比)

特性列表 list元組 tuple
是否可變可變不可變
是否有序
是否可作為 dict key
使用場景動態(tài)數(shù)據(jù)固定數(shù)據(jù)
語法[ ]( )

2. 創(chuàng)建元組的多種方式

使用圓括號(最常見)
t = (1, 2, 3)
省略圓括號(語法層面支持)
t = 1, 2, 3

? 常用于函數(shù)返回多個值或簡單賦值場景
? 不建議初學(xué)階段頻繁使用,容易降低可讀性

單元素元組(非常重要)
single = (5,)     # 正確
single2 = (5)     # 錯誤,這是整數(shù)

?? 結(jié)論是否為元組,關(guān)鍵不在于括號,而在于 逗號

使用tuple()構(gòu)造函數(shù)
nums = [1, 2, 3]
chars = "abc"

print(tuple(nums))   # (1, 2, 3)
print(tuple(chars))  # ('a', 'b', 'c')

3. 元組的索引、切片與遍歷

索引訪問
t = (10, 20, 30, 40)

print(t[0])    # 10
print(t[-1])   # 40
切片操作
print(t[1:3])  # (20, 30)
print(t[:2])   # (10, 20)

注意

  • 切片返回的是 新元組

  • 原元組不會發(fā)生任何變化

遍歷元組
for item in t:
    print(item)

4. 元組的不可變性(核心理解)

不允許的操作
t = (1, 2, 3)

# t[0] = 10        # TypeError
# t.append(4)     # AttributeError
# del t[1]         # TypeError
元組中包含可變對象的情況(重點(diǎn))
t = (1, [2, 3])
t[1].append(4)

print(t)  # (1, [2, 3, 4])

如何理解?

  • 元組不可變:指的是
    ?? t[1] 這個“引用”不能被替換

  • 列表可變
    ?? 列表內(nèi)部的內(nèi)容仍然可以修改

?? 一句話總結(jié):

元組保證的是“結(jié)構(gòu)不變”,而不是“內(nèi)容絕對不變”

5. 元組解包(非常重要的能力)

基本解包
point = (10, 20)
x, y = point

print(x, y)  # 10 20
解包與函數(shù)返回值
def get_min_max(nums):
    return min(nums), max(nums)

min_val, max_val = get_min_max([3, 7, 1, 9])
print(min_val, max_val) # 1 9
使用*進(jìn)行擴(kuò)展解包
a, *b = (1, 2, 3, 4)
print(a)  # 1
print(b)  # [2, 3, 4]

6. 元組的常見應(yīng)用場景

作為字典的 key
location = {}
location[(10, 20)] = "Home"

print(location)

原因:

  • 字典 key 必須是 不可變類型

  • 列表不能作為 key,元組可以

函數(shù)返回多個值(Pythonic 寫法)
def user_info():
    return "Alice", 18, True

name, age, active = user_info()
表示“業(yè)務(wù)含義固定”的數(shù)據(jù)
HOST = "localhost"
PORT = 8080
CONFIG = (HOST, PORT)

?? 語義層面表達(dá):

“這組數(shù)據(jù)不應(yīng)該被修改”

7. 元組的常用方法與內(nèi)置函數(shù)

元組方法非常少,這是其設(shè)計的一部分:

t = (1, 2, 2, 3)

print(t.count(2))   # 2
print(t.index(3))   # 3

常配合使用的內(nèi)置函數(shù):

len(t)
max(t)
min(t)
sum(t)

8. 元組與列表的深入對比

維度列表元組
內(nèi)存占用較高較低
創(chuàng)建速度較慢較快
安全性易被修改更安全
可讀性偏數(shù)據(jù)容器偏結(jié)構(gòu)表達(dá)

小結(jié)一下吧

  • 元組是 不可變的有序序列

  • 與列表相似,但語義更偏向 “固定結(jié)構(gòu)”

  • 常見用途:

    • 函數(shù)多返回值

    • 字典 key

    • 不可修改的配置數(shù)據(jù)

  • 支持:

    • 索引、切片、遍歷

    • 解包(非常重要)

(六)總結(jié):如何選擇合適的數(shù)據(jù)結(jié)構(gòu)

? 至此,你已經(jīng)系統(tǒng)掌握 Python 的四大基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)::

  • 列表(list):有序、可變的序列

  • 字典(dict):鍵值映射

  • 集合(set):無序、不重復(fù)

  • 元組(tuple):不可變的序列

每種數(shù)據(jù)結(jié)構(gòu)都有自己的特點(diǎn)和適用場景,選擇合適的數(shù)據(jù)結(jié)構(gòu)能夠讓程序更高效、更易維護(hù)、更易理解

1. 數(shù)據(jù)結(jié)構(gòu)選擇對比表

數(shù)據(jù)結(jié)構(gòu)特性使用場景注意事項
列表 list有序,可變,可包含任意類型保存順序數(shù)據(jù),循環(huán)處理,多次增刪改遍歷修改時要小心;切片返回新列表
字典 dict鍵值映射,key 唯一,可變記錄型數(shù)據(jù)(用戶信息、配置、狀態(tài)映射),快速查找key 必須不可變;get 可提供默認(rèn)值
集合 set無序,不重復(fù),高效成員判斷去重、集合運(yùn)算、權(quán)限判斷、標(biāo)簽判斷無索引;遍歷順序不可控
元組 tuple有序,不可變,可包含任意類型固定數(shù)據(jù)、函數(shù)多值返回、字典 key內(nèi)部可變對象仍可修改;不可修改元素

2. 如何選擇數(shù)據(jù)結(jié)構(gòu)

選擇數(shù)據(jù)結(jié)構(gòu)可以按以下幾個維度:

1?? 是否需要順序
  • 是 → 列表或元組

  • 否 → 集合或字典

2?? 是否需要唯一性
  • 是 → 集合

  • 否 → 列表或元組

3?? 是否需要通過名字訪問
  • 是 → 字典

  • 否 → 列表或集合

4?? 是否需要可變性
  • 可變 → 列表、字典、集合

  • 不可變 → 元組、不可變字典(擴(kuò)展應(yīng)用)

3. 常見組合場景

在實際開發(fā)中,這些數(shù)據(jù)結(jié)構(gòu)經(jīng)常組合使用:

場景數(shù)據(jù)結(jié)構(gòu)組合示例
多條記錄,每條記錄有多個字段列表 + 字典users = [{"name": "Alice", "age":18}, {"name": "Bob", "age":20}]
字典中某字段有多個值字典 + 列表grades = {"Alice":[90,95], "Bob":[80,82]}
去重的列表列表 + 集合unique_nums = list(set(nums))
函數(shù)返回多個值元組min_val, max_val = get_min_max([3,7,1,9])

4. 選用原則總結(jié)

  • 順序性優(yōu)先 → 列表/元組

  • 鍵值訪問優(yōu)先 → 字典

  • 唯一性 / 集合運(yùn)算 → 集合

  • 數(shù)據(jù)固定不變 → 元組

  • 復(fù)雜嵌套 → 根據(jù)組合場景選擇最合適的容器

?? 核心思想:
數(shù)據(jù)結(jié)構(gòu)是工具,目的是高效組織和操作數(shù)據(jù)。
不要只記語法,要根據(jù)問題特性選擇最合適的數(shù)據(jù)結(jié)構(gòu)。

七、結(jié)構(gòu)化數(shù)據(jù):Python 中的數(shù)據(jù)組織與處理

(一)為什么需要結(jié)構(gòu)化數(shù)據(jù)建模

在前面的章節(jié)中,我們已經(jīng)學(xué)習(xí)了 Python 提供的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu):列表(list)、字典(dict)、集合(set)和元組(tuple)。
這些數(shù)據(jù)結(jié)構(gòu)在表達(dá)簡單數(shù)據(jù)時非常高效,但當(dāng)我們開始處理真實世界中的業(yè)務(wù)數(shù)據(jù)時,很快就會發(fā)現(xiàn):僅靠基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),往往難以支撐復(fù)雜數(shù)據(jù)的長期演進(jìn)與工程化使用。

結(jié)構(gòu)化數(shù)據(jù)建模,正是為了解決這一問題而出現(xiàn)的。

1. 現(xiàn)實世界數(shù)據(jù)的天然復(fù)雜性

現(xiàn)實中的數(shù)據(jù)幾乎從來不是“單值”的,而是具有以下典型特征:

  • 多字段(Multi-attribute)一個用戶不僅有名字,還包含年齡、郵箱、狀態(tài)、注冊時間等多個屬性;一個訂單不僅有金額,還包含商品列表、支付方式、物流信息等

  • 層級關(guān)系(Hierarchical)用戶包含地址信息;訂單包含多個商品;商品又包含規(guī)格、價格、庫存等子結(jié)構(gòu)

  • 實體之間存在關(guān)聯(lián)一對多:一個用戶對應(yīng)多個訂單;多對一:多個訂單屬于同一個商家;多對多:用戶與標(biāo)簽、商品與分類

  • 狀態(tài)與行為并存數(shù)據(jù)不僅是“靜態(tài)描述”,還會涉及狀態(tài)變化(如訂單狀態(tài)流轉(zhuǎn)),以及業(yè)務(wù)行為(如校驗、計算、轉(zhuǎn)換)

這些特征決定了:現(xiàn)實世界的數(shù)據(jù),本質(zhì)上是結(jié)構(gòu)化、層級化、并且語義明確的。

2. 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的能力邊界

Python 的 list 和 dict 是非常強(qiáng)大的工具,但它們的設(shè)計初衷是通用容器,而不是“領(lǐng)域模型”

以字典為例:

  • 字典可以存任意鍵值對

  • 但它并不關(guān)心:

    • 這個字段是否必須存在

    • 這個字段應(yīng)該是什么類型

    • 不同字段之間是否存在約束關(guān)系

隨著業(yè)務(wù)復(fù)雜度的上升,單純使用 dict 會逐漸暴露出問題:

  • 結(jié)構(gòu)不透明字段依賴“約定”而非“定義”,閱讀代碼時無法一眼看出數(shù)據(jù)結(jié)構(gòu)

  • 缺乏約束鍵名拼寫錯誤只能在運(yùn)行時報錯,類型錯誤難以及早發(fā)現(xiàn)

  • 可維護(hù)性下降字段增加或調(diào)整會波及大量代碼,缺乏統(tǒng)一的數(shù)據(jù)入口

  • 業(yè)務(wù)語義缺失data["status"] == 1 本身無法說明業(yè)務(wù)含義,需要額外注釋或上下文才能理解

這意味著:基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)更適合“存數(shù)據(jù)”,但并不適合“表達(dá)數(shù)據(jù)含義”。

3. 從“數(shù)據(jù)容器”到“數(shù)據(jù)模型”的轉(zhuǎn)變

當(dāng)系統(tǒng)規(guī)模逐漸擴(kuò)大時,我們需要的不再只是一個“能裝東西的容器”,而是一個明確表達(dá)業(yè)務(wù)含義的數(shù)據(jù)模型(Data Model)。

數(shù)據(jù)模型關(guān)注的不僅是“數(shù)據(jù)長什么樣”,還包括:

  • 字段的業(yè)務(wù)語義

  • 字段之間的結(jié)構(gòu)關(guān)系

  • 數(shù)據(jù)的合法性規(guī)則

  • 數(shù)據(jù)可支持的操作與行為

這種轉(zhuǎn)變,本質(zhì)上是:從“如何存數(shù)據(jù)”,升級為“如何描述現(xiàn)實世界中的對象”。

4. Python 在結(jié)構(gòu)化數(shù)據(jù)建模上的天然優(yōu)勢

Python 之所以適合結(jié)構(gòu)化數(shù)據(jù)建模,主要得益于以下能力:

  • 靈活的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)(list / dict)

  • 完整的面向?qū)ο篌w系(Class)

  • 強(qiáng)大的類型注解支持

  • 內(nèi)建 JSON 處理能力

  • dataclass 等高級建模工具

這些能力,使得 Python 可以自然地完成從:原始數(shù)據(jù) → 半結(jié)構(gòu)化數(shù)據(jù) → 領(lǐng)域模型 → 工程化數(shù)據(jù)體系的逐層演進(jìn)。

小結(jié)一下吧

  • 現(xiàn)實世界的數(shù)據(jù)天然是結(jié)構(gòu)化的

  • 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)適合存儲,但不適合長期建模

  • 結(jié)構(gòu)化數(shù)據(jù)建模是代碼工程化的必經(jīng)之路

  • Python 提供了從簡單到復(fù)雜的完整建模能力

在接下來的學(xué)習(xí)中,我們將從嵌套數(shù)據(jù)結(jié)構(gòu)開始,逐步引入 JSON 處理,最終過渡到 基于 Class 的結(jié)構(gòu)化數(shù)據(jù)建模,構(gòu)建可維護(hù)、可擴(kuò)展的 Python 數(shù)據(jù)體系。

(二)Python 中的嵌套結(jié)構(gòu)化數(shù)據(jù)

在明確了為什么需要結(jié)構(gòu)化數(shù)據(jù)建模之后,我們首先要面對的是:如何在 Python 中表達(dá)“多字段 + 多層級”的數(shù)據(jù)結(jié)構(gòu)

在不引入面向?qū)ο笾?,Python 最直接、最常見的做法,就是使用嵌套的數(shù)據(jù)結(jié)構(gòu)——即在 list 或 dict 中再包含 list 或 dict。

嵌套結(jié)構(gòu),是 Python 邁向結(jié)構(gòu)化數(shù)據(jù)處理的第一步

1. 嵌套結(jié)構(gòu)化數(shù)據(jù)的基本思想

所謂嵌套結(jié)構(gòu),本質(zhì)上是:用 dict 表達(dá)“對象”,用 list 表達(dá)“集合”,并通過層級組合還原現(xiàn)實關(guān)系。

這種思想非常直觀,也幾乎不需要額外語法成本,因此被廣泛用于:

  • 接口返回數(shù)據(jù)

  • 配置文件

  • 臨時數(shù)據(jù)組織

  • JSON 原始載體

2. 字典嵌套字典:表達(dá)對象的層級屬性

適用場景:一個對象內(nèi)部存在子結(jié)構(gòu)

user = {
    "id": 1001,
    "name": "Alice",
    "profile": {
        "age": 28,
        "email": "alice@example.com",
        "address": {
            "city": "Beijing",
            "zipcode": "100000"
        }
    }
}

結(jié)構(gòu)理解

  • user:整體對象

  • profile:用戶的擴(kuò)展屬性

  • address:更細(xì)粒度的子結(jié)構(gòu)

這種結(jié)構(gòu)清晰地反映了現(xiàn)實語義:地址不屬于用戶本身,而屬于用戶的資料信息。

訪問方式

city = user["profile"]["address"]["city"]

此時你已經(jīng)可以感受到第一個問題:

  • 訪問路徑依賴結(jié)構(gòu)穩(wěn)定

  • 任意一層缺失,都會導(dǎo)致運(yùn)行期錯誤

3. 字典嵌套列表:表達(dá)一對多關(guān)系

適用場景:一個主體擁有多個子對象

order = {
    "order_id": "ORD-001",
    "user_id": 1001,
    "items": [
        {"sku": "SKU-1", "price": 100, "quantity": 2},
        {"sku": "SKU-2", "price": 50, "quantity": 1}
    ]
}

結(jié)構(gòu)理解

  • order 是訂單對象

  • items 是訂單下的商品集合

  • 每個商品仍然是一個“對象”

典型處理邏輯

total_amount = 0
for item in order["items"]:
    total_amount += item["price"] * item["quantity"]

此時一個非常關(guān)鍵的變化已經(jīng)出現(xiàn):業(yè)務(wù)計算邏輯,開始直接寫在“嵌套結(jié)構(gòu)遍歷”之中。

這是后續(xù)引入 Class 建模的重要動機(jī)。

4. 列表嵌套字典:同構(gòu)對象的集合

適用場景:多個結(jié)構(gòu)相同的對象

users = [
    {"id": 1, "name": "Alice", "active": True},
    {"id": 2, "name": "Bob", "active": False},
    {"id": 3, "name": "Charlie", "active": True}
]

遍歷與篩選

active_users = []
for user in users:
    if user["active"]:
        active_users.append(user)

這種結(jié)構(gòu)在接口返回數(shù)據(jù)中極為常見,但它也暴露了嵌套結(jié)構(gòu)的本質(zhì)問題之一:

  • 字段完全依賴字符串約定

  • 沒有任何顯式結(jié)構(gòu)定義

  • 錯誤只能在運(yùn)行期發(fā)現(xiàn)

5. 多層混合嵌套:真實系統(tǒng)中的常態(tài)

在真實系統(tǒng)中,嵌套結(jié)構(gòu)往往是多種形式的組合:

response = {
    "code": 0,
    "data": {
        "user": {
            "id": 1001,
            "orders": [
                {
                    "order_id": "ORD-001",
                    "items": [
                        {"sku": "SKU-1", "price": 100}
                    ]
                }
            ]
        }
    }
}

訪問路徑示例

sku = response["data"]["user"]["orders"][0]["items"][0]["sku"]

此類代碼的特征非常明顯:

  • 訪問鏈路極長

  • 強(qiáng)依賴數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)

  • 可讀性和可維護(hù)性迅速下降

6. 防御式訪問:必要但有限的改進(jìn)

為了避免異常,開發(fā)中常使用防御式寫法:

user = response.get("data", {}).get("user", {})
orders = user.get("orders", [])

if orders:
    first_order = orders[0]

這種方式可以:

  • 降低運(yùn)行期錯誤概率

  • 提高代碼健壯性

但需要清醒認(rèn)識到:防御式訪問解決的是“不崩潰”,而不是“結(jié)構(gòu)合理”。

7. 嵌套結(jié)構(gòu)的工程性問題總結(jié)

通過以上示例,可以清晰看到嵌套結(jié)構(gòu)在工程中的局限:

  • 結(jié)構(gòu)定義分散:數(shù)據(jù)結(jié)構(gòu)存在于代碼路徑中,而非集中定義

  • 業(yè)務(wù)語義缺失:字段只是字符串,無法承載規(guī)則和含義

  • 強(qiáng)耦合:結(jié)構(gòu)變更會影響大量訪問代碼

  • 邏輯與數(shù)據(jù)混雜:業(yè)務(wù)計算被迫寫在遍歷和索引中

當(dāng)代碼中大量出現(xiàn)如下形式時:

data["a"]["b"][0]["c"]["d"]

通常意味著:嵌套結(jié)構(gòu)已經(jīng)達(dá)到了可維護(hù)性的上限。

8. 嵌套結(jié)構(gòu)在整體體系中的正確定位

嵌套 dict / list 并不是“錯誤做法”,而是階段性工具

使用場景評價
原始 JSON 承載合適
臨時數(shù)據(jù)處理合適
腳本 / Demo合適
核心業(yè)務(wù)模型不合適
長期維護(hù)系統(tǒng)不合適

它更適合作為:數(shù)據(jù)的“中間形態(tài)”,而非最終模型。

小結(jié)一下吧

  • 嵌套結(jié)構(gòu)是 Python 表達(dá)復(fù)雜數(shù)據(jù)的基礎(chǔ)方式

  • 它通過 dict + list 組合還原現(xiàn)實關(guān)系

  • 隨著層級加深,維護(hù)成本迅速上升

  • 這正是引入 JSON 規(guī)范與 Class 建模的直接動因

接著我們將進(jìn)入 半結(jié)構(gòu)化數(shù)據(jù):JSON 在 Python 中的處理,你會發(fā)現(xiàn):JSON 的便利性,并沒有從根本上解決嵌套結(jié)構(gòu)的問題,而只是讓它“標(biāo)準(zhǔn)化”了。

(三)半結(jié)構(gòu)化數(shù)據(jù):JSON 在 Python 中的處理

在上一節(jié)中,我們已經(jīng)看到:通過 list 與 dict 的嵌套,Python 可以完整表達(dá)復(fù)雜數(shù)據(jù)結(jié)構(gòu),但可維護(hù)性迅速下降。

在真實工程中,這類嵌套結(jié)構(gòu)往往并不是“手寫”的,而是來自:

  • HTTP 接口返回

  • 配置文件

  • 消息隊列

  • 日志或存儲系統(tǒng)

這些數(shù)據(jù)最常見的載體形式,就是 JSON(JavaScript Object Notation)

1. 什么是半結(jié)構(gòu)化數(shù)據(jù)

從數(shù)據(jù)組織角度看,數(shù)據(jù)大致可以分為三類:

  • 非結(jié)構(gòu)化數(shù)據(jù):文本、圖片、音頻

  • 結(jié)構(gòu)化數(shù)據(jù):表結(jié)構(gòu)、強(qiáng)約束模型

  • 半結(jié)構(gòu)化數(shù)據(jù):結(jié)構(gòu)存在,但約束較弱

JSON 正是典型的半結(jié)構(gòu)化數(shù)據(jù)格式,其特點(diǎn)是:

  • 結(jié)構(gòu)清晰(層級、鍵值)

  • 可嵌套

  • 無強(qiáng)類型約束

  • 字段可選、可變

這使得 JSON 非常適合數(shù)據(jù)交換,但不適合直接作為業(yè)務(wù)模型。

2. JSON 的數(shù)據(jù)模型與 Python 的映射關(guān)系

JSON 本身支持的數(shù)據(jù)類型非常有限:

JSON 類型Python 對應(yīng)類型
objectdict
arraylist
stringstr
numberint / float
booleanbool
nullNone

也正因如此,JSON 在 Python 中的本質(zhì)就是:嵌套的 dict 與 list

換句話說:JSON 并沒有解決嵌套結(jié)構(gòu)的問題,只是把它“標(biāo)準(zhǔn)化”了。

3. Python 中的 JSON 解析(反序列化)

Python 內(nèi)置 json 模塊,用于 JSON 與 Python 對象之間的轉(zhuǎn)換。

import json

json_str = '''
{
    "id": 1001,
    "name": "Alice",
    "active": true,
    "roles": ["admin", "editor"]
}
'''

data = json.loads(json_str)

解析后:

  • data 是一個 dict

  • 所有字段完全不受約束

  • 訪問方式與普通嵌套結(jié)構(gòu)一致

name = data["name"]
roles = data["roles"]

4. 從文件加載 JSON 數(shù)據(jù)

JSON 文件是配置與數(shù)據(jù)交換的常見形式(這里暫時先理解,后續(xù)這部分會在新博客單獨(dú)講解):

import json

with open("config.json", "r", encoding="utf-8") as f:
    config = json.load(f)

此時你獲得的是:

  • 一個完全動態(tài)的嵌套結(jié)構(gòu)

  • 所有字段都只能“運(yùn)行期驗證”

5. JSON 的典型嵌套結(jié)構(gòu)示例

考慮一個真實接口返回示例:

response = {
    "code": 0,
    "message": "success",
    "data": {
        "user": {
            "id": 1001,
            "name": "Alice",
            "orders": [
                {
                    "order_id": "ORD-001",
                    "items": [
                        {"sku": "SKU-1", "price": 100, "quantity": 2}
                    ]
                }
            ]
        }
    }
}

業(yè)務(wù)代碼往往會這樣寫:

orders = response["data"]["user"]["orders"]
first_item_price = orders[0]["items"][0]["price"]

到這里,你應(yīng)該已經(jīng)非常熟悉這種訪問模式——它與嵌套結(jié)構(gòu)沒有任何本質(zhì)區(qū)別

6. JSON 帶來的“結(jié)構(gòu)假象”

JSON 的一個常見誤區(qū)是:“有格式 ≠ 有模型”

雖然 JSON 看起來“結(jié)構(gòu)清晰”,但它存在以下天然問題:

  • 字段完全不受約束缺字段不會報錯,多字段也不會報錯

  • 類型不可靠price 可能是數(shù)字,也可能是字符串,錯誤只能在運(yùn)行期暴露

  • 業(yè)務(wù)語義缺失status = 1 的含義無法自解釋,需要依賴外部文檔或注釋

  • 結(jié)構(gòu)變更極具破壞性任意字段調(diào)整都會影響訪問鏈

JSON 解決的是“數(shù)據(jù)如何傳輸”,而不是“數(shù)據(jù)如何使用

7. 防御式 JSON 解析的常見寫法

為了避免運(yùn)行期異常,代碼中常見如下寫法:

data = response.get("data", {})
user = data.get("user", {})
orders = user.get("orders", [])

if orders:
    order_id = orders[0].get("order_id")

這種寫法與上面講的嵌套方式依舊沒啥區(qū)別,更重要的是:仍然沒有一個“明確的數(shù)據(jù)模型”。

8. JSON 在工程體系中的正確角色

在成熟系統(tǒng)中,JSON 的定位應(yīng)當(dāng)非常明確:

角色是否合適
網(wǎng)絡(luò)傳輸格式非常合適
配置文件合適
接口輸入 / 輸出合適
業(yè)務(wù)內(nèi)部模型不合適
核心領(lǐng)域?qū)ο?/span>不合適

JSON 更適合作為:系統(tǒng)邊界上的數(shù)據(jù)格式,而非系統(tǒng)內(nèi)部的結(jié)構(gòu)表達(dá)。

系統(tǒng)引入結(jié)構(gòu)化建模的階段,Python 給出的答案是:

  • Class

  • dataclass

  • 明確的數(shù)據(jù)模型定義

  • JSON ↔ Model 的轉(zhuǎn)換邊界

小結(jié)一下吧

  • JSON 是典型的半結(jié)構(gòu)化數(shù)據(jù)格式

  • 在 Python 中,JSON 本質(zhì)仍是嵌套 dict / list

  • JSON 適合傳輸,不適合直接承載業(yè)務(wù)模型

  • 防御式解析無法從根本上解決結(jié)構(gòu)問題

  • 這直接引出了:為什么必須使用 Class 進(jìn)行結(jié)構(gòu)化建模

(四)面向?qū)ο蟮慕Y(jié)構(gòu)化建模:Class 的引入

在前面的講解中無論哪一步,數(shù)據(jù)始終以同一種形態(tài)存在:dict,只是內(nèi)容變“干凈”了而已。

接下來將通過一組連續(xù)示例說明:為什么必須引入 Class,以及 Class 在工程中應(yīng)該如何使用。

1. 問題起點(diǎn):業(yè)務(wù)邏輯正在“侵蝕”數(shù)據(jù)結(jié)構(gòu)

先看一個非常真實的場景,接口返回訂單數(shù)據(jù):

order_data = {
    "order_id": "ORD-001",
    "price": "100",
    "quantity": 2
}

業(yè)務(wù)中需要計算訂單金額,代碼往往這樣寫:

total_amount = int(order_data["price"]) * order_data["quantity"]

這段代碼沒有語法問題,但存在嚴(yán)重的工程隱患

  • 類型轉(zhuǎn)換是“臨時的”

  • 規(guī)則是“隱含的”

  • 任意地方都可以重復(fù)這段邏輯

此時系統(tǒng)出現(xiàn)了第一個危險信號:業(yè)務(wù)規(guī)則開始散落在 dict 操作中。

2. 第一次建模:用 Class 固定結(jié)構(gòu)與類型

我們引入最基礎(chǔ)的 Class,僅做一件事:把“字段定義”和“類型規(guī)則”集中到一個地方

class Order:
    def __init__(self, order_id, price, quantity):
        self.order_id = order_id
        self.price = int(price)
        self.quantity = int(quantity)

此時發(fā)生了三件非常重要的變化:

  • 結(jié)構(gòu)集中Order 明確有哪些字段

  • 類型前置類型轉(zhuǎn)換只發(fā)生一次

  • 使用成本下降后續(xù)代碼不再關(guān)心字段細(xì)節(jié)

業(yè)務(wù)代碼變?yōu)椋?/p>

order = Order("ORD-001", "100", 2)

3. 第二次建模:讓業(yè)務(wù)行為回歸模型

現(xiàn)在再看金額計算邏輯。如果繼續(xù)寫在外部:

total = order.price * order.quantity

雖然比 dict 好,但語義仍然分散。正確的工程做法是:只要邏輯“屬于對象”,就應(yīng)進(jìn)入對象本身

class Order:
    def __init__(self, order_id, price, quantity):
        self.order_id = order_id
        self.price = int(price)
        self.quantity = int(quantity)

    def total_amount(self):
        return self.price * self.quantity

此時:

  • 金額計算的業(yè)務(wù)含義被明確命名

  • 外部代碼無需關(guān)心實現(xiàn)細(xì)節(jié)

total = order.total_amount()

4. 工程規(guī)范一:Class 不是“數(shù)據(jù)殼”,而是“業(yè)務(wù)單元”

到這里,可以明確一個重要規(guī)范

一個 Class 不應(yīng)該只是 dict 的替代品,而應(yīng)該是一個“可用對象”。

如果一個 Class:

  • 只有屬性

  • 沒有任何方法

那它的價值是非常有限的。

5. 第三次建模:讓 Class 成為解析與清洗的邊界

回到真實輸入數(shù)據(jù)的問題。接口返回的往往是 不可信 JSON

raw_data = {
    "order_id": "ORD-001",
    "price": None,
    "quantity": "2"
}

工程上正確的做法是:讓 Class 成為“不可信數(shù)據(jù) → 可信對象”的邊界

class Order:
    def __init__(self, data: dict):
        self.order_id = data.get("order_id")
        self.price = self._to_int(data.get("price"), default=0)
        self.quantity = self._to_int(data.get("quantity"), default=1)

    def _to_int(self, value, default=0):
        try:
            return int(value)
        except (TypeError, ValueError):
            return default

此時:

  • 所有防御邏輯被“封裝”

  • 外部世界不再處理臟數(shù)據(jù)

  • 構(gòu)造完成的對象即“可用對象”

6. 工程規(guī)范二:業(yè)務(wù)代碼只接觸“可信對象”

正確的調(diào)用方式應(yīng)當(dāng)是:

order = Order(raw_data)
total = order.total_amount()

而不是:

# ? 不推薦
total = int(raw_data["price"]) * int(raw_data["quantity"])

規(guī)范總結(jié):

解析、清洗、校驗,必須發(fā)生在模型內(nèi)部
業(yè)務(wù)代碼不應(yīng)再做任何字段判斷

7. 第四次建模:用對象組合替代嵌套結(jié)構(gòu)

考慮一個更真實的訂單結(jié)構(gòu):

raw_order = {
    "order_id": "ORD-001",
    "items": [
        {"sku": "SKU-1", "price": "100"},
        {"sku": "SKU-2", "price": "50"}
    ]
}

如果繼續(xù)使用嵌套 dict:

total = 0
for item in raw_order["items"]:
    total += int(item["price"])

正確的建模方式是:用對象組合替代嵌套結(jié)構(gòu)

class OrderItem:
    def __init__(self, data):
        self.sku = data.get("sku")
        self.price = int(data.get("price", 0))

class Order:
    def __init__(self, data):
        self.order_id = data.get("order_id")
        self.items = [OrderItem(item) for item in data.get("items", [])]

    def total_amount(self):
        return sum(item.price for item in self.items)

此時,結(jié)構(gòu)發(fā)生了質(zhì)變:

  • 嵌套 dict → 對象關(guān)系

  • 遍歷邏輯 → 模型內(nèi)部能力

8. 工程規(guī)范三:嵌套數(shù)據(jù) ≠ 嵌套 dict,而是“對象層級”

這是結(jié)構(gòu)化建模中非常重要的一條規(guī)范

嵌套關(guān)系應(yīng)通過“對象組合”表達(dá),而不是嵌套 dict 訪問路徑。

一旦遵循這條規(guī)范:

  • 訪問路徑顯著變短

  • 代碼可讀性成倍提升

  • 結(jié)構(gòu)演進(jìn)成本大幅下降

小結(jié)一下吧

通過示例可以總結(jié)出 Class 建模的核心工程規(guī)范:

  • Class 是模型,不是數(shù)據(jù)殼

  • 結(jié)構(gòu)、語義、行為必須統(tǒng)一

  • 解析與清洗是模型的職責(zé)

  • 業(yè)務(wù)代碼只操作可信對象

  • 嵌套關(guān)系用對象組合表達(dá)

到這里,你已經(jīng)完成了:

從“操作數(shù)據(jù)” → “使用模型” 的關(guān)鍵轉(zhuǎn)變

(五)復(fù)雜對象組合與領(lǐng)域建模

在真實系統(tǒng)中,所謂“復(fù)雜數(shù)據(jù)”,并不僅僅是 層級多,而是同時具備:

  • 多層嵌套結(jié)構(gòu)

  • 不同子結(jié)構(gòu)承擔(dān)不同職責(zé)

  • 局部規(guī)則 + 全局規(guī)則并存

  • 數(shù)據(jù)來自不可信邊界(接口 / MQ / DB)

這一節(jié),我們用一個 接近真實電商/交易系統(tǒng)的數(shù)據(jù)模型,完整展示 Python 中的復(fù)雜領(lǐng)域建模方式

1. 原始輸入:近真實系統(tǒng)級 JSON 結(jié)構(gòu)

這是一個 近真實工程中常見復(fù)雜度 的訂單數(shù)據(jù)(已適度抽象):

raw_order = {
    "order_id": "ORD-9001",
    "user": {
        "id": "U-1001",
        "profile": {
            "name": "Alice",
            "level": "VIP"
        }
    },
    "items": [
        {
            "sku": "SKU-1",
            "pricing": {
                "unit_price": "100",
                "currency": "CNY"
            },
            "quantity": 2,
            "discounts": [
                {"type": "PROMOTION", "amount": "10"},
                {"type": "VIP", "amount": "5"}
            ]
        }
    ],
    "payment": {
        "method": "CREDIT_CARD",
        "transactions": [
            {"tx_id": "TX-1", "amount": "185"},
            {"tx_id": "TX-2", "amount": "10"}
        ]
    }
}

特點(diǎn):

  • 最深層級:5 層

  • 同時包含:列表嵌套 + 對象嵌套

  • 金額、規(guī)則、行為全部混在 JSON 中

如果直接用 dict 操作,這類代碼幾乎不可維護(hù)。

2. 第一步:識別領(lǐng)域與聚合邊界(不是拆字段)

復(fù)雜建模的第一步不是寫類,而是劃分領(lǐng)域?qū)ο?/strong>

從業(yè)務(wù)語義出發(fā):

JSON 片段領(lǐng)域?qū)ο?/th>
orderOrder(聚合根)
userUser
profileUserProfile
itemsOrderItem
pricingPricing
discountsDiscount
paymentPayment
transactionsPaymentTransaction

原則:

只要一個子結(jié)構(gòu)有“獨(dú)立業(yè)務(wù)含義”,就值得一個 Class。

3. 底層值對象(Value Object)建模

Discount(最小業(yè)務(wù)單元)

class Discount:
    def __init__(self, data):
        self.type = data.get("type")
        self.amount = int(data.get("amount", 0))

Pricing(價格不是一個字段,而是一組規(guī)則)

class Pricing:
    def __init__(self, data):
        self.unit_price = int(data.get("unit_price", 0))
        self.currency = data.get("currency")

    def total(self, quantity):
        return self.unit_price * quantity

4. OrderItem:多層對象的“局部聚合”

class OrderItem:
    def __init__(self, data):
        self.sku = data.get("sku")
        self.quantity = int(data.get("quantity", 1))

        self.pricing = Pricing(data.get("pricing", {}))
        self.discounts = [
            Discount(d) for d in data.get("discounts", [])
        ]

    def discount_amount(self):
        return sum(d.amount for d in self.discounts)

    def subtotal(self):
        return self.pricing.total(self.quantity) - self.discount_amount()

注意這里已經(jīng)出現(xiàn)了領(lǐng)域行為協(xié)同

  • 折扣規(guī)則不在 Order

  • 價格規(guī)則不在 Order

  • OrderItem 自洽完成金額計算

5. 用戶領(lǐng)域:嵌套對象中的語義建模

class UserProfile:
    def __init__(self, data):
        self.name = data.get("name")
        self.level = data.get("level")

    def is_vip(self):
        return self.level == "VIP"


class User:
    def __init__(self, data):
        self.user_id = data.get("id")
        self.profile = UserProfile(data.get("profile", {}))

6. 支付領(lǐng)域:獨(dú)立聚合,不混入訂單邏輯

class PaymentTransaction:
    def __init__(self, data):
        self.tx_id = data.get("tx_id")
        self.amount = int(data.get("amount", 0))

class Payment:
    def __init__(self, data):
        self.method = data.get("method")
        self.transactions = [
            PaymentTransaction(tx)
            for tx in data.get("transactions", [])
        ]

    def paid_amount(self):
        return sum(tx.amount for tx in self.transactions)

7. Order:真正的“領(lǐng)域聚合根”

class Order:
    def __init__(self, data):
        self.order_id = data.get("order_id")

        self.user = User(data.get("user", {}))
        self.items = [OrderItem(i) for i in data.get("items", [])]
        self.payment = Payment(data.get("payment", {}))

    def order_amount(self):
        return sum(item.subtotal() for item in self.items)

    def is_fully_paid(self):
        return self.payment.paid_amount() >= self.order_amount()

注意:

  • Order 不參與任何底層計算

  • Order 只做“聚合協(xié)調(diào)”

  • 各領(lǐng)域職責(zé)清晰、不交叉

8. 工程級規(guī)范總結(jié)(復(fù)雜場景)

這一示例隱含了一套非常重要的工程規(guī)范

規(guī)范一:不要讓聚合根“變胖”
  • 金額計算下沉到 OrderItem

  • 折扣規(guī)則不寫在 Order

規(guī)范二:多層嵌套 ≠ 多層 dict
  • 每一層都是對象

  • 每一層都有行為

規(guī)范三:領(lǐng)域隔離
  • Payment 不知道 OrderItem 的存在

  • Order 不知道 Discount 的細(xì)節(jié)

規(guī)范四:結(jié)構(gòu)變化可控
  • JSON 結(jié)構(gòu)變化只影響局部 Class

這一節(jié)完成的不是“示例升級”,而是復(fù)雜度躍遷

  • 從 2 層嵌套 → 5 層嵌套

  • 從數(shù)據(jù)組合 → 領(lǐng)域協(xié)作

  • 從“能跑” → “可演進(jìn)、可維護(hù)”

你現(xiàn)在已經(jīng)具備:用 Python Class 構(gòu)建真實業(yè)務(wù)領(lǐng)域模型的能力

(六)JSON ↔ Class 的雙向轉(zhuǎn)換:邊界層與 DTO 設(shè)計

在 (五) 中,我們已經(jīng)構(gòu)建了一套復(fù)雜、內(nèi)聚、可演進(jìn)的領(lǐng)域模型。但此時如果直接將這些 Class 用在接口層或存儲層,會立即遇到新的問題:

  • 接口層需要 JSON

  • MQ / RPC 需要可序列化結(jié)構(gòu)

  • 數(shù)據(jù)庫存儲結(jié)構(gòu)與領(lǐng)域模型不一致

  • 外部系統(tǒng)字段經(jīng)常變動

這引出了一個非常重要的工程問題領(lǐng)域模型不應(yīng)直接暴露在系統(tǒng)邊界。

1. 為什么不能讓領(lǐng)域模型“裸奔”到邊界

一個常見但危險的做法是:

json.dumps(order.__dict__)

這種方式存在嚴(yán)重問題:

  • 結(jié)構(gòu)不可控:私有字段、內(nèi)部狀態(tài)一并暴露

  • 語義污染:內(nèi)部對象結(jié)構(gòu)被外部依賴

  • 變更風(fēng)險極高:內(nèi)部模型調(diào)整會破壞接口

  • 無法做版本治理:接口字段無法演進(jìn)

工程結(jié)論:領(lǐng)域模型 ≠ 接口數(shù)據(jù)模型

2. 邊界層的核心職責(zé)

在工程上,通常需要一個邊界層(Boundary Layer),它負(fù)責(zé):

  • JSON → DTO

  • DTO → Domain Model

  • Domain Model → DTO

  • DTO → JSON

其中,DTO(Data Transfer Object) 是核心中介。

3. DTO 的設(shè)計原則(非常重要)

DTO 與領(lǐng)域模型的關(guān)系,應(yīng)遵循以下原則:

  • 只包含數(shù)據(jù),不包含業(yè)務(wù)行為

  • 結(jié)構(gòu)扁平,面向接口需求

  • 允許字段冗余或命名不一致

  • 變化頻率遠(yuǎn)高于領(lǐng)域模型

  • 邊界轉(zhuǎn)換集中化

    一個成熟系統(tǒng)中,應(yīng)當(dāng)遵循:

    所有 JSON ↔ Domain 的轉(zhuǎn)換,都集中在邊界層完成

    而不是:Controller 中拼 dict; Service 中解析字段; Model 中關(guān)心接口格式

3.1 示例:為 Order 定義輸入 DTO

接口輸入 JSON:

{
  "order_id": "ORD-9001",
  "user_id": "U-1001",
  "items": [
    {
      "sku": "SKU-1",
      "unit_price": "100",
      "quantity": 2
    }
  ]
}

對應(yīng) DTO:

class OrderCreateDTO:
    def __init__(self, data):
        self.order_id = data.get("order_id")
        self.user_id = data.get("user_id")
        self.items = data.get("items", [])

DTO 的特點(diǎn):

  • 不做復(fù)雜解析

  • 不包含嵌套對象建模

  • 只服務(wù)接口需求

3.2 DTO → Domain Model(反序列化邊界)

將 DTO 轉(zhuǎn)換為領(lǐng)域模型,是邊界層的核心工作之一。

class OrderFactory:
    @staticmethod
    def from_create_dto(dto: OrderCreateDTO):
        raw = {
            "order_id": dto.order_id,
            "user": {"id": dto.user_id},
            "items": [
                {
                    "sku": item["sku"],
                    "pricing": {"unit_price": item["unit_price"]},
                    "quantity": item["quantity"],
                    "discounts": []
                }
                for item in dto.items
            ]
        }
        return Order(raw)

注意幾點(diǎn):

  • DTO 不知道領(lǐng)域模型

  • 領(lǐng)域模型不依賴 DTO

  • 轉(zhuǎn)換邏輯集中在 Factory / Assembler 中

3.3 Domain Model → DTO(序列化邊界)

對外輸出時,同樣不能直接暴露領(lǐng)域模型。

class OrderResponseDTO:
    def __init__(self, order: Order):
        self.order_id = order.order_id
        self.total_amount = order.order_amount()
        self.paid = order.is_fully_paid()

再由 DTO 轉(zhuǎn)為 JSON:

response = json.dumps(order_response_dto.__dict__)

3.4. 復(fù)雜結(jié)構(gòu)下的 DTO 拆分策略

當(dāng)結(jié)構(gòu)進(jìn)一步復(fù)雜時,應(yīng)避免:

class BigDTO:
    ...

而采用:

  • OrderDTO

  • ItemDTO

  • PaymentDTO

再由 Assembler 負(fù)責(zé)組合。

3.5 防腐層(Anti-Corruption Layer)視角

在對接外部系統(tǒng)時,DTO 還承擔(dān)著一個更重要的角色:

防止外部模型“污染”內(nèi)部領(lǐng)域模型

字段改名、結(jié)構(gòu)變更、類型異常,都被限制在 DTO 層。

小結(jié)一下吧

通過本節(jié),你應(yīng)該建立起以下清晰認(rèn)知:

  • 領(lǐng)域模型只服務(wù)領(lǐng)域邏輯

  • DTO 是系統(tǒng)邊界的語言

  • JSON 永遠(yuǎn)不應(yīng)直接進(jìn)入領(lǐng)域模型

  • Factory / Assembler 是關(guān)鍵角色

  • 邊界清晰,系統(tǒng)才能長期演進(jìn)

(七)使用 dataclass 與類型系統(tǒng)增強(qiáng)結(jié)構(gòu)化建模

在前面的分享中,我們已經(jīng)用“原生 Class”完成了復(fù)雜領(lǐng)域建模。但你可能已經(jīng)感受到幾個現(xiàn)實問題:

  • __init__ 代碼大量重復(fù)

  • 字段類型只能靠約定

  • 對象結(jié)構(gòu)難以一眼看清

  • 重構(gòu)時缺乏工具輔助

這正是 dataclass 與類型系統(tǒng) 登場的時機(jī)。

1. 為什么在復(fù)雜建模階段引入 dataclass

dataclass 并不是“語法糖”,而是結(jié)構(gòu)化建模的工程工具。

它解決的核心問題是:

問題原生 Classdataclass
字段聲明分散在 __init__集中聲明
類型表達(dá)隱式顯式
可讀性中等
維護(hù)成本

工程結(jié)論:當(dāng)模型成為系統(tǒng)核心資產(chǎn)時,必須使用 dataclass 或等價機(jī)制。

2. 從原生 Class 到 dataclass:逐步演進(jìn)

先看之前寫的的一個典型類:

class Discount:
    def __init__(self, data):
        self.type = data.get("type")
        self.amount = int(data.get("amount", 0))

使用 dataclass 重構(gòu)后:

from dataclasses import dataclass

@dataclass
class Discount:
    type: str
    amount: int

但這只是第一步,真實工程不會直接這樣寫。

3. dataclass 中的構(gòu)造邊界:__post_init__

在領(lǐng)域模型中:

  • 字段是“結(jié)構(gòu)”

  • 校驗、轉(zhuǎn)換是“規(guī)則”

dataclass 提供 __post_init__ 來承載規(guī)則。

from dataclasses import dataclass

@dataclass
class Discount:
    type: str
    amount: int

    def __post_init__(self):
        self.amount = int(self.amount)

規(guī)范:類型轉(zhuǎn)換、校驗邏輯應(yīng)放在 __post_init__,而不是外部代碼。

4. 復(fù)雜對象中的 dataclass 組合

重構(gòu) Pricing:

from dataclasses import dataclass

@dataclass
class Pricing:
    unit_price: int
    currency: str = "CNY"

    def total(self, quantity: int) -> int:
        return self.unit_price * quantity

OrderItem:

from dataclasses import dataclass, field
from typing import List

@dataclass
class OrderItem:
    sku: str
    pricing: Pricing
    quantity: int = 1
    discounts: List[Discount] = field(default_factory=list)

    def subtotal(self) -> int:
        discount = sum(d.amount for d in self.discounts)
        return self.pricing.total(self.quantity) - discount

此時,模型結(jié)構(gòu)已經(jīng)一眼可讀

5. 類型系統(tǒng)帶來的“隱性收益”

引入類型標(biāo)注后,產(chǎn)生的收益包括:

  • IDE 自動補(bǔ)全

  • 靜態(tài)檢查(mypy / pyright)

  • 重構(gòu)安全性

  • 模型即文檔

例如:

def calculate_total(items: List[OrderItem]) -> int:
    ...

類型本身就表達(dá)了設(shè)計意圖

6. dataclass 與不可變建模(高級用法)

在部分領(lǐng)域中(如支付、賬務(wù)),對象應(yīng)當(dāng)是不可變的

@dataclass(frozen=True)
class PaymentTransaction:
    tx_id: str
    amount: int

不可變對象的工程意義:

  • 防止?fàn)顟B(tài)被隨意修改

  • 更容易推理

  • 更適合并發(fā)場景

7. dataclass ≠ DTO:職責(zé)仍然要分清

一個常見誤區(qū)是:“既然 dataclass 很方便,那 DTO 也用它吧?”

可以,但要遵守原則:

對象是否可用 dataclass是否包含行為
DTO可以不應(yīng)該
Domain Model強(qiáng)烈推薦必須

關(guān)鍵點(diǎn)不是工具,而是職責(zé)。

8. 工程規(guī)范:領(lǐng)域模型的現(xiàn)代 Python 寫法

綜合前面內(nèi)容,可以形成一套明確規(guī)范:

  • 領(lǐng)域模型使用 dataclass

  • 字段必須有類型

  • 規(guī)則寫在方法或 __post_init__

  • 嵌套關(guān)系通過類型表達(dá)

  • 不可變對象優(yōu)先用于關(guān)鍵領(lǐng)域

小結(jié)一下吧

通過 dataclass 與類型系統(tǒng):

  • 模型從“能用”變?yōu)?ldquo;可靠”

  • 結(jié)構(gòu)從“隱式”變?yōu)?ldquo;顯式”

  • 重構(gòu)從“危險”變?yōu)?ldquo;可控”

(八)領(lǐng)域模型與數(shù)據(jù)庫模型的邊界:ORM 與持久化設(shè)計

前面整體學(xué)習(xí)了解了:

  • 復(fù)雜領(lǐng)域建模

  • 明確的邊界與 DTO

  • dataclass + 類型系統(tǒng)增強(qiáng)

系統(tǒng)幾乎不可避免地會進(jìn)入一個危險階段:為了“省事”,開始讓領(lǐng)域模型向數(shù)據(jù)庫結(jié)構(gòu)妥協(xié)。

這一節(jié)的目標(biāo),是明確劃清領(lǐng)域模型與持久化模型的邊界。

1. 一個常見但致命的誤區(qū)

很多系統(tǒng)會出現(xiàn)如下代碼風(fēng)格:

class Order(Base):
    __tablename__ = "orders"

    id = Column(String, primary_key=True)
    total_amount = Column(Integer)

看似優(yōu)雅,實際上隱藏著幾個問題:

  • 領(lǐng)域模型被 ORM 污染

  • 數(shù)據(jù)庫結(jié)構(gòu)決定了領(lǐng)域結(jié)構(gòu)

  • 業(yè)務(wù)規(guī)則被擠出模型

工程結(jié)論:ORM Model ≠ Domain Model

2. 三種模型的職責(zé)劃分(必須牢記)

在成熟系統(tǒng)中,通常存在三類模型:

模型類型關(guān)注點(diǎn)變化頻率
DTO接口 / 邊界
Domain Model業(yè)務(wù)規(guī)則
Persistence Model(ORM)表結(jié)構(gòu)

它們解決的是完全不同的問題。

3. 領(lǐng)域模型為什么不應(yīng)該“繼承 ORM”

原因并不抽象:

  • 數(shù)據(jù)庫字段不是業(yè)務(wù)語言

  • ORM 強(qiáng)制扁平化結(jié)構(gòu)

  • 懶加載/會話污染領(lǐng)域行為

  • 測試復(fù)雜度急劇上升

領(lǐng)域模型應(yīng)當(dāng):

  • 與數(shù)據(jù)庫無關(guān)

  • 可以脫離 ORM 獨(dú)立運(yùn)行與測試

4. 正確的工程結(jié)構(gòu)示意

一個合理的工程分層應(yīng)當(dāng)是:

領(lǐng)域模型永遠(yuǎn)不直接操作數(shù)據(jù)庫。

5. ORM Model:只做“表的映射”

以 SQLAlchemy 為例(僅作為概念說明):

class OrderORM(Base):
    __tablename__ = "orders"

    order_id = Column(String, primary_key=True)
    total_amount = Column(Integer)

特點(diǎn):

  • 結(jié)構(gòu)與表一一對應(yīng)

  • 沒有業(yè)務(wù)行為

  • 允許妥協(xié)命名

6. Repository:連接領(lǐng)域與持久化的橋梁

Repository 是最關(guān)鍵、但最容易被忽略的一層。

class OrderRepository:
    def save(self, order: Order):
        raise NotImplementedError

    def get(self, order_id: str) -> Order:
        raise NotImplementedError

領(lǐng)域?qū)又灰蕾?接口,而不是實現(xiàn)。

7. ORM → Domain 的裝配(反序列化)

class OrderRepositoryImpl(OrderRepository):
    def get(self, order_id: str) -> Order:
        orm = self.session.query(OrderORM).get(order_id)

        raw = {
            "order_id": orm.order_id,
            "items": self._load_items(orm),
            "payment": self._load_payment(orm)
        }

        return Order(raw)

注意:

  • ORM 結(jié)構(gòu)被“翻譯”

  • Domain Model 完全不知道 ORM 的存在

8. Domain → ORM 的持久化(序列化)

def save(self, order: Order):
    orm = OrderORM(
        order_id=order.order_id,
        total_amount=order.order_amount()
    )
    self.session.add(orm)

即使結(jié)構(gòu)重復(fù),也要接受。重復(fù)是隔離的代價,也是穩(wěn)定性的來源。

9. 工程規(guī)范:持久化永遠(yuǎn)是“外部關(guān)心的事”

領(lǐng)域模型中 絕對不應(yīng)出現(xiàn)

  • session

  • commit

  • save()

  • ORM 注解

如果你在領(lǐng)域模型中看到這些,說明:領(lǐng)域已經(jīng)被侵蝕。

小結(jié)一下吧

通過本節(jié),你應(yīng)當(dāng)形成以下堅定認(rèn)知:

  • 領(lǐng)域模型不為數(shù)據(jù)庫服務(wù)

  • ORM 只是技術(shù)實現(xiàn)

  • Repository 隔離變化

  • 結(jié)構(gòu)重復(fù)是合理且必要的

  • 領(lǐng)域模型必須可以脫離數(shù)據(jù)庫獨(dú)立存在

(九)校驗、異常與領(lǐng)域約束建模

現(xiàn)在我們已經(jīng)解決了:

  • 復(fù)雜結(jié)構(gòu)如何建模

  • 邊界如何隔離

  • 如何工程化增強(qiáng)模型

  • 如何與數(shù)據(jù)庫解耦

但到目前為止,仍有一個問題被刻意回避了:如果數(shù)據(jù)是“非法的”,怎么辦?

現(xiàn)實系統(tǒng)中,非法數(shù)據(jù)是常態(tài),而不是例外

1. 一個常見但危險的現(xiàn)狀

很多系統(tǒng)對“非法數(shù)據(jù)”的處理方式是:

if price <= 0:
    return None

或者:

try:
    ...
except Exception:
    pass

這些寫法的問題不在于“能不能跑”,而在于:

  • 錯誤被吞掉

  • 規(guī)則被隱式化

  • 系統(tǒng)進(jìn)入“不可預(yù)期狀態(tài)”

工程結(jié)論:校驗不是工具層問題,而是領(lǐng)域模型的職責(zé)。

2. 什么是“領(lǐng)域約束”(Domain Constraint)

領(lǐng)域約束指的是:

  • 業(yè)務(wù)上不允許被破壞的規(guī)則

  • 與技術(shù)、存儲、接口無關(guān)

  • 一旦違反,系統(tǒng)就不應(yīng)繼續(xù)執(zhí)行

例如:

  • 訂單金額不能為負(fù)

  • 支付金額不能小于 0

  • 已完成訂單不能再次支付

這些規(guī)則 不屬于 Controller,也不屬于 Service,而是:領(lǐng)域模型自身的邊界。

3. 領(lǐng)域異常:用“異常”表達(dá)規(guī)則破壞

在領(lǐng)域建模中,異常不是“程序錯誤”,而是:對業(yè)務(wù)規(guī)則被破壞的明確聲明

首先,定義領(lǐng)域異常基類:

class DomainError(Exception):
    pass

然后為關(guān)鍵規(guī)則定義具體異常:

class InvalidPriceError(DomainError):
    pass

class PaymentAmountError(DomainError):
    pass

class OrderStateError(DomainError):
    pass

規(guī)范:不要在領(lǐng)域中直接拋 ValueError、TypeError

4. 在模型內(nèi)部執(zhí)行校驗(而不是外部 if)

OrderItem 為例:

from dataclasses import dataclass

@dataclass
class OrderItem:
    sku: str
    quantity: int

    def __post_init__(self):
        if self.quantity <= 0:
            raise InvalidPriceError("quantity must be positive")

此時:

  • 非法對象 根本無法被構(gòu)造

  • 錯誤在最早階段暴露

5. 行為級校驗:規(guī)則與動作綁定

不是所有校驗都發(fā)生在構(gòu)造階段。

例如:支付行為。

class Order:
    ...

    def pay(self, amount: int):
        if amount <= 0:
            raise PaymentAmountError("payment must be positive")

        if self.is_fully_paid():
            raise OrderStateError("order already paid")

        self.payment.add_transaction(amount)

關(guān)鍵原則:規(guī)則應(yīng)當(dāng)與“動作”綁定,而不是與“字段”綁定。

6. 領(lǐng)域狀態(tài)與約束的結(jié)合

復(fù)雜系統(tǒng)中,狀態(tài)本身就是約束來源。

class OrderStatus:
    CREATED = "CREATED"
    PAID = "PAID"
    CANCELED = "CANCELED"


class Order:
    ...

    def cancel(self):
        if self.status == OrderStatus.PAID:
            raise OrderStateError("paid order cannot be canceled")

        self.status = OrderStatus.CANCELED

此時:

  • 狀態(tài)轉(zhuǎn)換路徑被嚴(yán)格限制

  • 非法流程無法發(fā)生

7. 校驗邏輯的分層原則(非常重要)

一個成熟系統(tǒng)中,校驗應(yīng)分為三層:

層級校驗內(nèi)容示例
接口層格式、必填JSON 字段是否存在
邊界層基本合法性字符串能否轉(zhuǎn) int
領(lǐng)域?qū)?/td>業(yè)務(wù)規(guī)則金額、狀態(tài)、約束

絕對禁止:在 Controller 中寫業(yè)務(wù)規(guī)則判斷。

8. 異常如何“向外傳播”

領(lǐng)域異常的傳播路徑應(yīng)當(dāng)是:

Controller 的職責(zé)不是“判斷規(guī)則”,而是:

try:
    order.pay(amount)
except DomainError as e:
    return error_response(str(e))

9. 工程規(guī)范:失敗是系統(tǒng)能力的一部分

一個系統(tǒng)是否健壯,不取決于:能否處理正常數(shù)據(jù)

而取決于:能否正確拒絕不合法行為

領(lǐng)域異常的價值在于:

  • 規(guī)則顯式

  • 行為可追蹤

  • 錯誤不可忽略

八、總結(jié)

至此,本篇內(nèi)容對 Python 基礎(chǔ)知識進(jìn)行了一個相對系統(tǒng)的梳理與總結(jié)。

從運(yùn)行環(huán)境與工具選擇,到變量、控制流、函數(shù)、字符串處理,再到列表、字典、集合等核心數(shù)據(jù)結(jié)構(gòu),本博客力求用工程視角 + 可運(yùn)行示例的方式,期望在較短時間內(nèi)建立起對 Python 編程的整體認(rèn)知和基本實戰(zhàn)能力。

需要說明的是,這份內(nèi)容同樣也是我在學(xué)習(xí) Python 過程中的階段性整理與沉淀。難免存在理解不夠嚴(yán)謹(jǐn)或表述不夠完善之處,歡迎各位讀者在評論區(qū)留言指正、交流探討,這對我和后續(xù)讀者都會非常有價值。

如果你能通過本文:

  • 理解 Python 的核心語法思想

  • 看懂并獨(dú)立編寫基礎(chǔ)程序

  • 對后續(xù)深入學(xué)習(xí)(如數(shù)據(jù)處理、Web、自動化或 AI 方向)不再畏懼

那么這篇總結(jié)就達(dá)到了它應(yīng)有的意義。

Python 是一門上手友好、上限極高的語言,但真正的成長來自持續(xù)實踐,而不是一次性閱讀。希望你在未來的學(xué)習(xí)過程中,多動手、多思考、多調(diào)試,把“會寫”逐步變成“寫得好、寫得穩(wěn)”。

以上就是入門初學(xué)者短期內(nèi)快速掌握Python的經(jīng)典全面教程(專家學(xué)習(xí)筆記)的詳細(xì)內(nèi)容,更多關(guān)于Python基礎(chǔ)學(xué)習(xí)總結(jié)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python?中將數(shù)字轉(zhuǎn)換為字母的方法

    Python?中將數(shù)字轉(zhuǎn)換為字母的方法

    本文詳細(xì)介紹了在 Python 中將數(shù)字轉(zhuǎn)換為字母的幾種常用方法,我們介紹了使用 chr() 函數(shù)、string 模塊和 ord() 函數(shù)等方法,并提供了示例代碼幫助你理解和應(yīng)用這些方法,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Python搭建代理IP池實現(xiàn)接口設(shè)置與整體調(diào)度

    Python搭建代理IP池實現(xiàn)接口設(shè)置與整體調(diào)度

    這篇文章主要介紹了Python搭建代理IP池實現(xiàn)接口設(shè)置與整體調(diào)度,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • jupyter notebook的安裝與使用詳解

    jupyter notebook的安裝與使用詳解

    這篇文章主要介紹了jupyter notebook的安裝與使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • python修改pip install默認(rèn)安裝路徑的詳細(xì)步驟

    python修改pip install默認(rèn)安裝路徑的詳細(xì)步驟

    pip安裝的第三方庫默認(rèn)存放在C盤中,為了便于管理和不過度占用C盤空間所以想修改默認(rèn)的pip路徑,文章通過圖文結(jié)合的方式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • python中numpy?常用操作總結(jié)

    python中numpy?常用操作總結(jié)

    這篇文章主要介紹了python中numpy常用操作總結(jié),NumPy是Python語言的一個擴(kuò)充程序庫,支持大量高維度數(shù)組與矩陣運(yùn)算,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫
    2022-09-09
  • python學(xué)習(xí)——內(nèi)置函數(shù)、數(shù)據(jù)結(jié)構(gòu)、標(biāo)準(zhǔn)庫的技巧(推薦)

    python學(xué)習(xí)——內(nèi)置函數(shù)、數(shù)據(jù)結(jié)構(gòu)、標(biāo)準(zhǔn)庫的技巧(推薦)

    這篇文章主要介紹了python學(xué)習(xí)——內(nèi)置函數(shù)、數(shù)據(jù)結(jié)構(gòu)、標(biāo)準(zhǔn)庫的技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • python?request要求接口參數(shù)必須是json數(shù)據(jù)的處理方式

    python?request要求接口參數(shù)必須是json數(shù)據(jù)的處理方式

    這篇文章主要介紹了python?request要求接口參數(shù)必須是json數(shù)據(jù)的處理方式,Reqeusts支持以form表單形式發(fā)送post請求,只需要將請求的參數(shù)構(gòu)造成一個字典,然后傳給requests.post()的data參數(shù)即可,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-08-08
  • 使用Python實現(xiàn)保存剪貼板中的圖像

    使用Python實現(xiàn)保存剪貼板中的圖像

    這篇文章主要為大家詳細(xì)介紹了如何使用Python創(chuàng)建一個簡單的GUI應(yīng)用程序,實現(xiàn)保存剪貼板中的圖像功能,文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-09-09
  • 零基礎(chǔ)學(xué)python應(yīng)該從哪里入手

    零基礎(chǔ)學(xué)python應(yīng)該從哪里入手

    在本篇文章里小編給大家分享的是一篇關(guān)于零基礎(chǔ)學(xué)python應(yīng)該從哪里入手的相關(guān)基礎(chǔ)內(nèi)容,需要的朋友們可以參考下。
    2020-08-08
  • 詳解python實現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe

    詳解python實現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe

    這篇文章主要為大家介紹了python實現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論

中文字母永久播放1区2区3区| 天堂av在线官网中文| 亚洲av自拍偷拍综合| 日本黄在免费看视频| 久久久久久久久久久免费女人| 国产久久久精品毛片| 9国产精品久久久久老师 | 五月婷婷在线观看视频免费| 男女啪啪啪啪啪的网站| 97人人模人人爽人人喊| 欧洲国产成人精品91铁牛tv| 成人国产小视频在线观看| 中文字幕av熟女人妻| 日韩a级黄色小视频| 亚洲av色图18p| a v欧美一区=区三区| 亚洲精品久久视频婷婷| 亚洲日本一区二区久久久精品| 91亚洲精品干熟女蜜桃频道 | 美女 午夜 在线视频| 日本一区美女福利视频| 伊人开心婷婷国产av| 97小视频人妻一区二区| 精品一区二区三区午夜| 亚洲激情,偷拍视频| 亚洲精品无码久久久久不卡| 一区二区三区日韩久久| 大香蕉大香蕉大香蕉大香蕉大香蕉| 中文字幕乱码av资源| 天天艹天天干天天操| 亚洲欧美福利在线观看| 久草视频中文字幕在线观看| 欧美久久久久久三级网| 中文字幕 亚洲av| 99的爱精品免费视频| 人妻丝袜精品中文字幕| 日本最新一二三区不卡在线 | 国产美女一区在线观看| 丁香花免费在线观看中文字幕| 精品一区二区三四区| 日韩加勒比东京热二区| 大屁股熟女一区二区三区| 天天日天天做天天日天天做| 伊人情人综合成人久久网小说 | 在线视频这里只有精品自拍| 人妻熟女在线一区二区| 欧美亚洲偷拍自拍色图| 啊用力插好舒服视频| 午夜精彩视频免费一区| 伊人综合免费在线视频| 国产黄色片在线收看| 久久永久免费精品人妻专区| 免费啪啪啪在线观看视频| jul—619中文字幕在线| 日本一区精品视频在线观看| 摧残蹂躏av一二三区| 亚洲精品麻豆免费在线观看| 视频一区二区在线免费播放| 晚上一个人看操B片| 一区二区三区视频,福利一区二区| 日韩无码国产精品强奸乱伦| 好男人视频在线免费观看网站| 精品久久久久久久久久久99| 888亚洲欧美国产va在线播放| 岛国毛片视频免费在线观看| 国产精品熟女久久久久浪潮| 国产av自拍偷拍盛宴| 爱爱免费在线观看视频| 自拍偷拍 国产资源| 在线观看av2025| 日韩熟女av天堂系列| 很黄很污很色的午夜网站在线观看 | 国产综合视频在线看片| 中字幕人妻熟女人妻a62v网| 久久永久免费精品人妻专区| 97年大学生大白天操逼| 女人精品内射国产99| 丰满的子国产在线观看| 日日夜夜精品一二三| eeuss鲁片一区二区三区| 日本黄色特一级视频| 中文人妻AV久久人妻水| 91九色porny国产蝌蚪视频| 大鸡吧插逼逼视频免费看| 国产精品久久久久久美女校花| 自拍偷拍 国产资源| 精品高跟鞋丝袜一区二区| 午夜精品久久久久久99热| 动色av一区二区三区| 中文字幕在线乱码一区二区 | 中文字幕在线视频一区二区三区| 水蜜桃一区二区三区在线观看视频| 中文字幕在线观看极品视频| 国产一区二区三免费视频 | 国产清纯美女al在线| 精品国产成人亚洲午夜| 亚洲最大黄 嗯色 操 啊| 欧美aa一级一区三区四区| 欧美日韩精品永久免费网址| 国产露脸对白在线观看| 亚洲av无乱一区二区三区性色| 国产成人午夜精品福利| 三上悠亚和黑人665番号| 免费一级黄色av网站| 老师让我插进去69AV| 久久精品亚洲国产av香蕉| 好了av中文字幕在线| 色吉吉影音天天干天天操 | 97精品视频在线观看| 丝袜肉丝一区二区三区四区在线 | 另类av十亚洲av| 国产精品成人xxxx| 少妇露脸深喉口爆吞精| 老鸭窝日韩精品视频观看| 男人的天堂一区二区在线观看| 含骚鸡巴玩逼逼视频| 大肉大捧一进一出好爽在线视频| 97色视频在线观看| 1区2区3区4区视频在线观看| 91亚洲手机在线视频播放| 中英文字幕av一区| 人人妻人人澡人人爽人人dvl| 在线免费视频 自拍| 人妻久久久精品69系列| 欧美日本国产自视大全| 成人色综合中文字幕| 端庄人妻堕落挣扎沉沦| 2018最新中文字幕在线观看| 插小穴高清无码中文字幕| 最新91九色国产在线观看| 亚洲麻豆一区二区三区| 黄色成人在线中文字幕| 欧美日本在线观看一区二区| yellow在线播放av啊啊啊| 99久久激情婷婷综合五月天| 免费看国产又粗又猛又爽又黄视频| 成人资源在线观看免费官网| 午夜蜜桃一区二区三区| 久久这里有免费精品| 91九色porny蝌蚪国产成人| 自拍 日韩 欧美激情| 2022中文字幕在线| 一区二区三区日韩久久| 亚洲av黄色在线网站| 青青青青视频在线播放| 337p日本大胆欧美人| 国产精品亚洲а∨天堂免| 超pen在线观看视频公开97 | 国产精品三级三级三级| 国产精品探花熟女在线观看| 日本高清成人一区二区三区| 美女福利视频导航网站| 93人妻人人揉人人澡人人| 亚洲1069综合男同| 亚洲免费国产在线日韩| 中文字幕高清在线免费播放| 天天摸天天亲天天舔天天操天天爽 | 亚洲在线观看中文字幕av| 国产janese在线播放| 2012中文字幕在线高清| 美女小视频网站在线| 香蕉aⅴ一区二区三区| 日本黄在免费看视频| 亚洲国产第一页在线观看| 欧美日韩v中文在线| 快插进小逼里大鸡吧视频| 老司机福利精品视频在线| 日本熟妇一区二区x x| 天天日天天干天天干天天日| 欧美精品中文字幕久久二区| 97精品综合久久在线| 99re6热在线精品| av中文字幕国产在线观看| 国产chinesehd精品麻豆| 99精品亚洲av无码国产另类| 日韩精品啪啪视频一道免费| 日本少妇的秘密免费视频| 91快播视频在线观看| 欧美亚洲自偷自拍 在线| 国产精品黄片免费在线观看| 一级A一级a爰片免费免会员| 男人的天堂在线黄色| av男人天堂狠狠干| 日本熟妇色熟妇在线观看| 亚洲精品欧美日韩在线播放| 日本少妇人妻xxxxxhd| 久久热这里这里只有精品| 国产乱弄免费视频观看| 1024久久国产精品| 欧美日韩高清午夜蜜桃大香蕉| 青青青青视频在线播放| 中文字幕网站你懂的| 午夜大尺度无码福利视频| 插逼视频双插洞国产操逼插洞| 欧美香蕉人妻精品一区二区| av无限看熟女人妻另类av| 亚洲免费国产在线日韩| 亚洲高清国产自产av| 女同久久精品秋霞网| 岛国青草视频在线观看| 99热国产精品666| av天堂资源最新版在线看| 91色九色porny| 成年人中文字幕在线观看| 老司机在线精品福利视频| 经典av尤物一区二区| 直接能看的国产av| 亚洲熟妇无码一区二区三区| 日本韩国在线观看一区二区| 日韩a级黄色小视频| 女生自摸在线观看一区二区三区 | 亚洲精品乱码久久久本| 国产精品手机在线看片| 日本女大学生的黄色小视频| 国产va在线观看精品| 国产亚洲精品品视频在线| 1000小视频在线| 任你操视频免费在线观看| 国产成人无码精品久久久电影| 精品国产午夜视频一区二区| 精品高潮呻吟久久av| 337p日本大胆欧美人| 天天日天天添天天爽| 亚洲av琪琪男人的天堂| 日本高清成人一区二区三区| 国产三级影院在线观看| 久草福利电影在线观看| 九色精品视频在线播放| 一级黄色av在线观看| 国产午夜男女爽爽爽爽爽视频 | 国产麻豆国语对白露脸剧情| 黑人大几巴狂插日本少妇| 狠狠躁狠狠爱网站视频| 2022中文字幕在线| 一区二区三区的久久的蜜桃的视频 | 成人区人妻精品一区二视频| 啊啊啊想要被插进去视频| 1000小视频在线| 在线免费观看靠比视频的网站| 国产黄色高清资源在线免费观看| 亚洲Av无码国产综合色区| 亚洲av成人免费网站| 国际av大片在线免费观看| 在线观看操大逼视频| AV无码一区二区三区不卡| 国产自拍在线观看成人| 少妇人妻二三区视频| 亚洲嫩模一区二区三区| 中文字幕一区二区三区人妻大片 | 性感美女高潮视频久久久| 国产精彩对白一区二区三区| 久久久精品欧洲亚洲av| 99av国产精品欲麻豆| 天天日天天爽天天爽| 国产女孩喷水在线观看| 中文字幕熟女人妻久久久| 99热久久这里只有精品8| 欧美偷拍自拍色图片| 人妻激情图片视频小说| 韩国女主播精品视频网站| 久久久久久国产精品| 91桃色成人网络在线观看| 天天干天天插天天谢| 无忧传媒在线观看视频| 成年人午夜黄片视频资源| 日韩欧美在线观看不卡一区二区| 日韩午夜福利精品试看| 欧美偷拍亚洲一区二区| 狠狠操操操操操操操操操| 亚洲一级美女啪啪啪| 不卡一区一区三区在线| 亚洲成高清a人片在线观看| 中文字幕一区二区三区蜜月| 国产aⅴ一线在线观看| 无码精品一区二区三区人| 视频在线亚洲一区二区| 青娱乐蜜桃臀av色| 91久久精品色伊人6882| 天天干夜夜操啊啊啊| 亚洲精品国品乱码久久久久| 特大黑人巨大xxxx| 日韩人妻在线视频免费| 好吊视频—区二区三区| 日本xx片在线观看| 国产精彩福利精品视频| 91久久国产成人免费网站| 免费男阳茎伸入女阳道视频| 日本裸体熟妇区二区欧美| 日韩欧美在线观看不卡一区二区| 成人亚洲国产综合精品| 精品国产高潮中文字幕| 成人sm视频在线观看| 一级黄色片夫妻性生活| 精品91高清在线观看| 中文字幕高清免费在线人妻| 人妻丰满熟妇综合网| 天天操天天干天天艹| 5528327男人天堂| 欧美女同性恋免费a| 四川乱子伦视频国产vip| 成年女人免费播放视频| 99久久中文字幕一本人| 男人的天堂av日韩亚洲| 自拍偷拍,中文字幕| 中文字幕第1页av一天堂网| av天堂资源最新版在线看| 中文字幕第1页av一天堂网| 国产精品国产三级国产精东| 综合色区亚洲熟妇shxstz| 日美女屁股黄邑视频| 人妻无码色噜噜狠狠狠狠色| 夫妻在线观看视频91| 97精品成人一区二区三区| 老司机福利精品免费视频一区二区| 年轻的人妻被夫上司侵犯| 亚洲成人国产综合一区| 乱亲女秽乱长久久久| 精品一区二区三四区| 国产chinesehd精品麻豆| 午夜影院在线观看视频羞羞羞| 欧美成人一二三在线网| 欧美视频不卡一区四区| 超pen在线观看视频公开97| 亚洲成人国产综合一区| 午夜蜜桃一区二区三区| 国产丰满熟女成人视频| 4个黑人操素人视频网站精品91| 熟女人妻在线观看视频| sw137 中文字幕 在线| 91国内精品自线在拍白富美| 青青青青在线视频免费观看| 91天堂天天日天天操| 国产福利小视频免费观看| 天天干天天日天天干天天操 | 影音先锋女人av噜噜色| 成人资源在线观看免费官网| 老司机午夜精品视频资源| 人妻丝袜诱惑我操她视频| 欧美日韩一级黄片免费观看| 97国产福利小视频合集| 欧美乱妇无乱码一区二区| 在线观看免费视频网| 漂亮 人妻被中出中文| 人人爱人人妻人人澡39| 91超碰青青中文字幕| 久久精品亚洲成在人线a| 国产精品国产三级国产午| 国产精品人妻66p| 大香蕉日本伊人中文在线| 性感美女高潮视频久久久| 自拍偷拍亚洲精品第2页| 国产一区二区欧美三区 | 人人妻人人澡欧美91精品| 91天堂精品一区二区| 欧美精品激情在线最新观看视频| huangse网站在线观看| 亚洲av天堂在线播放| 日本真人性生活视频免费看| 亚洲精品国产在线电影| 在线观看黄色成年人网站| 午夜av一区二区三区| 日韩美av高清在线| 88成人免费av网站| 色哟哟在线网站入口| 免费啪啪啪在线观看视频| 天天摸天天日天天操| 久久精品在线观看一区二区| 亚洲精品高清自拍av| 免费人成黄页网站在线观看国产| 国产精品sm调教视频| 无码日韩人妻精品久久| 91大神福利视频网| 在线免费观看av日韩| 水蜜桃一区二区三区在线观看视频 | 大陆胖女人与丈夫操b国语高清| 香蕉aⅴ一区二区三区| 97资源人妻免费在线视频| 午夜免费体验区在线观看| 粉嫩欧美美人妻小视频| caoporm超碰国产| 男人和女人激情视频| 精品美女福利在线观看| jiujiure精品视频在线| 78色精品一区二区三区| 五十路息与子猛烈交尾视频 | 动漫黑丝美女的鸡巴| 国产不卡av在线免费| 亚洲av日韩av第一区二区三区| 天天干天天操天天扣| 国产av国片精品一区二区| 中文字幕在线观看极品视频| 欧美专区第八页一区在线播放| 青青青青青手机视频| 在线观看的黄色免费网站| 在线观看操大逼视频| 老熟妇凹凸淫老妇女av在线观看| 在线观看国产网站资源| 十八禁在线观看地址免费| 粗大的内捧猛烈进出爽大牛汉子| 黄工厂精品视频在线观看| 2021久久免费视频| 2021国产一区二区| 日本韩国免费一区二区三区视频 | 大学生A级毛片免费视频| 久草福利电影在线观看| 精品国产成人亚洲午夜| 最近的中文字幕在线mv视频| 一区二区麻豆传媒黄片| 天天色天天操天天透| 国产麻豆剧传媒精品国产av蜜桃| 亚洲国产精品美女在线观看| 99久久中文字幕一本人| 97青青青手机在线视频| 初美沙希中文字幕在线| 激情五月婷婷免费视频| 手机看片福利盒子日韩在线播放| 美女大bxxxx内射| 日韩欧美高清免费在线| 中文字幕第三十八页久久| 九九热99视频在线观看97| 成年人黄色片免费网站| 男人操女人的逼免费视频| wwwxxx一级黄色片| 丝袜国产专区在线观看| 精品一区二区三四区| 色综合天天综合网国产成人| 91快播视频在线观看| 91九色porny蝌蚪国产成人| 亚洲精品精品国产综合| 久久精品久久精品亚洲人| 2022国产综合在线干| 亚洲欧美激情国产综合久久久| 欧美另类重口味极品在线观看| 伊人综合aⅴ在线网| 秋霞午夜av福利经典影视| 强行扒开双腿猛烈进入免费版| 日韩av有码一区二区三区4| 在线播放一区二区三区Av无码| 老司机午夜精品视频资源| 色综合久久五月色婷婷综合| 精品美女久久久久久| 日韩视频一区二区免费观看| 中文 成人 在线 视频| 久久精品36亚洲精品束缚| 视频 国产 精品 熟女 | 日韩欧美高清免费在线| 五月精品丁香久久久久福利社| 日本精品美女在线观看| 久久这里只有精彩视频免费| 91麻豆精品久久久久| 99热国产精品666| 中文字幕在线观看国产片| 久久国产精品精品美女| 免费福利av在线一区二区三区| 在线国产日韩欧美视频| 精品视频国产在线观看| 91九色porny国产蝌蚪视频| 免费黄页网站4188| 国产精品探花熟女在线观看| 天天日天天爽天天干| 东京热男人的av天堂| 狠狠躁夜夜躁人人爽天天久天啪| 不卡一区一区三区在线| caoporm超碰国产| 好太好爽好想要免费| 又粗又长 明星操逼小视频| 国产午夜福利av导航| 国内精品在线播放第一页| 天天干夜夜操啊啊啊| 中文字幕,亚洲人妻| 1769国产精品视频免费观看| 精品一区二区三区欧美| 自拍偷区二区三区麻豆| 亚洲人妻视频在线网| 激情伦理欧美日韩中文字幕| 亚洲国产成人av在线一区| 红杏久久av人妻一区| 久久热久久视频在线观看| 超碰在线观看免费在线观看| 中出中文字幕在线观看 | 日日夜夜大香蕉伊人| 国产黄色a级三级三级三级 | 99精品国自产在线人| 日韩av有码中文字幕| 日本欧美视频在线观看三区| 天天干天天搞天天摸| 天天躁日日躁狠狠躁av麻豆| 无码日韩人妻精品久久| 中文字幕网站你懂的| 沙月文乃人妻侵犯中文字幕在线 | 自拍偷拍日韩欧美亚洲| 亚洲高清视频在线不卡| 亚洲精品麻豆免费在线观看| 久久香蕉国产免费天天| 午夜影院在线观看视频羞羞羞| 免费岛国喷水视频在线观看 | 天天干天天啪天天舔| 偷拍自拍国产在线视频| 亚洲一区二区三区在线高清| 国产福利在线视频一区| 国产又色又刺激在线视频| 亚洲va欧美va人人爽3p| 国产精品伦理片一区二区| 国产一区av澳门在线观看| 国内资源最丰富的网站| 大鸡巴插入美女黑黑的阴毛| 自拍偷拍亚洲欧美在线视频| 97超碰免费在线视频| 人妻丝袜av在线播放网址| av老司机精品在线观看| 亚洲国产在人线放午夜| 欧美专区第八页一区在线播放| 在线免费观看日本伦理| 亚洲天天干 夜夜操| 五月婷婷在线观看视频免费| 美味人妻2在线播放| 一个色综合男人天堂| 亚洲美女美妇久久字幕组| 91亚洲国产成人精品性色| 久久丁香婷婷六月天| h国产小视频福利在线观看| 中文字幕 人妻精品| 久久一区二区三区人妻欧美| 最近中文字幕国产在线| 2017亚洲男人天堂| 99精品一区二区三区的区| 男人的天堂av日韩亚洲| 可以免费看的www视频你懂的| 亚洲一区二区三区精品视频在线| 欧美老妇精品另类不卡片| 三级av中文字幕在线观看| 久久艹在线观看视频| 国产精品自偷自拍啪啪啪| 国产janese在线播放| 久久久久久久久久性潮| 亚洲国产精品久久久久蜜桃| 欧美精品久久久久久影院| 亚洲一级 片内射视正片| h国产小视频福利在线观看| 男女啪啪视频免费在线观看| 日本中文字幕一二区视频| 亚洲粉嫩av一区二区三区| 黄色片黄色片wyaa| 风流唐伯虎电视剧在线观看| av亚洲中文天堂字幕网| 啪啪啪啪啪啪啪啪啪啪黄色| 免费成人av中文字幕| 男生用鸡操女生视频动漫| 亚洲午夜福利中文乱码字幕| 亚洲成人激情av在线| 80电影天堂网官网| 日本午夜爽爽爽爽爽视频在线观看 | 天天做天天爽夜夜做少妇| 欧美精品伦理三区四区| 班长撕开乳罩揉我胸好爽| 国产亚洲视频在线二区| 国产又粗又猛又爽又黄的视频在线| 国产超码片内射在线| 国产变态另类在线观看| heyzo蜜桃熟女人妻| 中文乱理伦片在线观看| 老司机午夜精品视频资源| 亚洲精品国品乱码久久久久| 国产成人自拍视频播放| 欧美精产国品一二三产品价格| 天天做天天干天天操天天射| 欧美特级特黄a大片免费| 熟女国产一区亚洲中文字幕| 亚洲一区制服丝袜美腿| 亚洲欧美清纯唯美另类| www天堂在线久久| 欧美一区二区中文字幕电影| 亚洲国产欧美一区二区丝袜黑人| 日韩中文字幕福利av| 国产亚洲精品品视频在线| 大香蕉玖玖一区2区| 人妻av无码专区久久绿巨人 | 神马午夜在线观看视频| 日韩欧美一级精品在线观看| 青青青青青手机视频| 日本乱人一区二区三区| 制服丝袜在线人妻中文字幕| 98视频精品在线观看| av一本二本在线观看| 精内国产乱码久久久久久| 日比视频老公慢点好舒服啊| 男人靠女人的逼视频| 国产综合视频在线看片| 成人性爱在线看四区| 日韩影片一区二区三区不卡免费| 99精品国产自在现线观看| av在线免费中文字幕| 欧美亚洲一二三区蜜臀| 沈阳熟妇28厘米大战黑人| 五月婷婷在线观看视频免费| 青青草人人妻人人妻| 精品一区二区三区三区色爱| 日韩一区二区电国产精品| 在线观看的a站 最新| 欧美成人精品欧美一级黄色| 国产使劲操在线播放| 久久香蕉国产免费天天| aⅴ五十路av熟女中出| 久草视频 久草视频2| 蝴蝶伊人久久中文娱乐网| 大学生A级毛片免费视频| 国产精品污污污久久| 日本一二三区不卡无| 国产欧美日韩在线观看不卡| 爱有来生高清在线中文字幕| 果冻传媒av一区二区三区| 欧美视频中文一区二区三区| 欧美成一区二区三区四区| 亚洲天堂精品福利成人av| 天天艹天天干天天操| 国产日韩欧美视频在线导航| 国产第一美女一区二区三区四区| 精品一区二区三区三区色爱| 天天操夜夜操天天操天天操| 亚洲天天干 夜夜操| 阴茎插到阴道里面的视频| 91快播视频在线观看| 欧美va亚洲va天堂va| 国产又粗又黄又硬又爽| 91av精品视频在线| 青青青aaaa免费| 日本欧美视频在线观看三区| 青青青aaaa免费| 亚洲熟色妇av日韩熟色妇在线| 视频一区二区综合精品| lutube在线成人免费看| 日韩成人综艺在线播放| 黄色录像鸡巴插进去| 玖玖一区二区在线观看| 午夜91一区二区三区| 91老师蜜桃臀大屁股| 日日摸夜夜添夜夜添毛片性色av| 91一区精品在线观看| 久久精品亚洲国产av香蕉| 亚洲免费va在线播放| 91小伙伴中女熟女高潮| 成人av免费不卡在线观看| 超鹏97历史在线观看| 91久久综合男人天堂| 蜜臀av久久久久蜜臀av麻豆| eeuss鲁片一区二区三区| 免费大片在线观看视频网站| 国产熟妇人妻ⅹxxxx麻豆| 精品人妻每日一部精品| 天天爽夜夜爽人人爽QC| 国产麻豆国语对白露脸剧情| 19一区二区三区在线播放| 欧美男人大鸡吧插女人视频| 100%美女蜜桃视频| 丝袜长腿第一页在线| 日韩欧美一级aa大片| 一区二区三区四区视频在线播放| 亚洲精品亚洲人成在线导航| 欧美专区第八页一区在线播放 | 边摸边做超爽毛片18禁色戒 | 日韩亚国产欧美三级涩爱| 日韩影片一区二区三区不卡免费| 国产欧美精品一区二区高清| 欧美激情电影免费在线| 国产熟妇一区二区三区av| 久久www免费人成一看片| 久草视频中文字幕在线观看| 最新的中文字幕 亚洲| 久久农村老妇乱69系列| 天堂av在线最新版在线| japanese五十路熟女熟妇| 国产刺激激情美女网站| 九色视频在线观看免费| 亚洲av人人澡人人爽人人爱| 婷婷色国产黑丝少妇勾搭AV| 日视频免费在线观看| 在线视频精品你懂的| 日本免费一级黄色录像| 天天色天天爱天天爽| xxx日本hd高清| 亚洲激情偷拍一区二区| 97精品成人一区二区三区 | 久久免看30视频口爆视频| 在线国产日韩欧美视频| 亚洲人妻国产精品综合| 亚洲综合色在线免费观看| 男人靠女人的逼视频| 国产污污污污网站在线| 男人操女人的逼免费视频| 国产刺激激情美女网站| 亚洲 欧美 精品 激情 偷拍| 日本成人不卡一区二区| 11久久久久久久久久久| 人妻少妇一区二区三区蜜桃| 日韩av熟妇在线观看| 扒开让我视频在线观看| 国产视频网站一区二区三区| 成人av电影免费版| 成人动漫大肉棒插进去视频| 亚洲精品国产久久久久久| 黑人借宿ntr人妻的沦陷2| gogo国模私拍视频| 97超碰人人搞人人| 亚洲一级av大片免费观看| www日韩a级s片av| 宅男噜噜噜666免费观看| 91成人精品亚洲国产| 亚洲成人线上免费视频观看| 国产亚州色婷婷久久99精品| 18禁美女羞羞免费网站| 日韩北条麻妃一区在线| 熟妇一区二区三区高清版| 一区二区三区视频,福利一区二区| 自拍偷拍 国产资源| 中文字幕人妻av在线观看| 欧美一区二区三区乱码在线播放| 3344免费偷拍视频| 欧美中国日韩久久精品| 天天日天天日天天射天天干| 色婷婷久久久久swag精品| 国产一区二区三免费视频| 国产福利小视频大全| 91快播视频在线观看| 2021最新热播中文字幕| 国产一区二区欧美三区| 国产密臀av一区二区三| 欧美亚洲一二三区蜜臀| 国产视频一区在线观看| 91高清成人在线视频| av天堂中文字幕最新| 青青伊人一精品视频| 操的小逼流水的文章| 中文亚洲欧美日韩无线码| 粉嫩av蜜乳av蜜臀| 免费十精品十国产网站| 国产极品精品免费视频| 亚洲av男人的天堂你懂的| 天天日天天干天天干天天日| 超黄超污网站在线观看| 国产一区二区视频观看| 亚洲欧美综合另类13p| 国产日韩欧美视频在线导航| 国产亚州色婷婷久久99精品| 91福利视频免费在线观看| 亚洲超碰97人人做人人爱| 欧美性受xx黑人性猛交| 2022天天干天天操| 亚洲一区制服丝袜美腿| 久久美欧人妻少妇一区二区三区| 中国无遮挡白丝袜二区精品| 黄色片黄色片wyaa| 快点插进来操我逼啊视频| 天堂av中文在线最新版| 大香蕉伊人国产在线| 久久国产精品精品美女| 精彩视频99免费在线| 黑人大几巴狂插日本少妇| 黄色三级网站免费下载| 一区二区三区日本伦理| 久草视频在线免播放| 含骚鸡巴玩逼逼视频| 国产一区自拍黄视频免费观看| 亚洲熟妇久久无码精品| 成人av在线资源网站| 国产麻豆91在线视频| 成人sm视频在线观看| 人妻素人精油按摩中出| 天天操天天污天天射| 亚洲av第国产精品| 欧美爆乳肉感大码在线观看| 3337p日本欧洲大胆色噜噜| 青青草视频手机免费在线观看| 91人妻人人做人人爽在线| 日视频免费在线观看| 亚洲狠狠婷婷综合久久app| 美洲精品一二三产区区别| 中文字幕奴隷色的舞台50| 天天干天天操天天爽天天摸| 99久久激情婷婷综合五月天| 2020韩国午夜女主播在线| 欧美一级视频一区二区| 久草视频中文字幕在线观看| 欧美色婷婷综合在线| 99精品免费观看视频| 激情小视频国产在线| 中文字幕人妻被公上司喝醉在线| 亚洲精品久久综合久| 人妻久久无码中文成人| 黄色视频成年人免费观看| 日本韩国亚洲综合日韩欧美国产 | 免费国产性生活视频| 免费在线播放a级片| 亚洲av第国产精品| 夫妻在线观看视频91| 久久久精品精品视频视频| 精品久久久久久久久久中文蒉| 日韩成人综艺在线播放| 人妻少妇亚洲一区二区| 一级a看免费观看网站| 成年人该看的视频黄免费| 熟妇一区二区三区高清版| 51国产偷自视频在线播放| 熟女妇女老妇一二三区| 国产又粗又猛又爽又黄的视频美国| 成年人的在线免费视频| 国产日本精品久久久久久久| 黄色视频成年人免费观看| 直接观看免费黄网站| 天天操,天天干,天天射| 又大又湿又爽又紧A视频| 亚洲在线免费h观看网站| 免费岛国喷水视频在线观看| 日韩中文字幕精品淫| 狠狠嗨日韩综合久久| 熟女视频一区,二区,三区| 日日夜夜大香蕉伊人| 99精品一区二区三区的区| 精品亚洲在线免费观看| 欧美亚洲牲夜夜综合久久| 国产又粗又硬又大视频| 99精品免费观看视频| 黄网十四区丁香社区激情五月天| 午夜免费观看精品视频| 成熟熟女国产精品一区| 天天做天天干天天舔| 国产精品探花熟女在线观看| 国产精品熟女久久久久浪潮| 888欧美视频在线| asmr福利视频在线观看| 中文字幕成人日韩欧美| 欧美交性又色又爽又黄麻豆| 欧洲国产成人精品91铁牛tv| 香蕉91一区二区三区| 美女被肏内射视频网站| 激情国产小视频在线| 五十路av熟女松本翔子| 久久久久久久精品成人热| 久久h视频在线观看| 好太好爽好想要免费| 成人精品在线观看视频| 在线免费观看亚洲精品电影| 美女吃鸡巴操逼高潮视频| 亚洲高清国产拍青青草原| 馒头大胆亚洲一区二区| 午夜在线观看一区视频| 老有所依在线观看完整版| 91亚洲精品干熟女蜜桃频道 | 午夜的视频在线观看| 91av精品视频在线| 日日操综合成人av| 五月天中文字幕内射| 99亚洲美女一区二区三区| 四虎永久在线精品免费区二区| 大鸡八强奸视频在线观看| 国产刺激激情美女网站| 欧美视频综合第一页| av一本二本在线观看| 日本脱亚入欧是指什么| 久久www免费人成一看片| 91人妻精品一区二区在线看| 天堂av在线官网中文| 亚洲av男人的天堂你懂的| 亚洲日产av一区二区在线| 欧美熟妇一区二区三区仙踪林| 久久www免费人成一看片| 97年大学生大白天操逼| huangse网站在线观看| 国产真实乱子伦a视频| 红杏久久av人妻一区| 天天操天天弄天天射| 亚洲精品ww久久久久久| 亚洲1区2区3区精华液| 75国产综合在线视频| 五十路息与子猛烈交尾视频 | 国产麻豆精品人妻av| 亚洲国产成人无码麻豆艾秋| 日韩av有码中文字幕| 日韩av有码一区二区三区4 | 超级福利视频在线观看| 亚洲Av无码国产综合色区| 涩涩的视频在线观看视频| 加勒比视频在线免费观看| 一本一本久久a久久精品综合不卡| 精品一区二区三区在线观看| 国产使劲操在线播放| 日本中文字幕一二区视频| 把腿张开让我插进去视频| 少妇人妻久久久久视频黄片| 99精品国产aⅴ在线观看| 欧美精品黑人性xxxx| 亚洲欧美清纯唯美另类 | 888亚洲欧美国产va在线播放| 人妻最新视频在线免费观看| 亚洲在线免费h观看网站| 岛国一区二区三区视频在线| 国产精品sm调教视频| 91 亚洲视频在线观看| 女同久久精品秋霞网| 亚洲av无码成人精品区辽| 成人av亚洲一区二区| av手机在线观播放网站| 性感美女诱惑福利视频| 日韩欧美亚洲熟女人妻| 久久这里只有精品热视频 | huangse网站在线观看| 黄色大片免费观看网站| 青青草亚洲国产精品视频| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 国产一区二区火爆视频| 人人妻人人爽人人添夜| 91小伙伴中女熟女高潮| 污污小视频91在线观看| 欧美国产亚洲中英文字幕| 狠狠嗨日韩综合久久| 阿v天堂2014 一区亚洲| 蜜臀av久久久久蜜臀av麻豆| 伊人综合aⅴ在线网| 在线免费观看靠比视频的网站| 国产精品精品精品999| 在线观看免费视频网| 欧美日韩亚洲国产无线码| 色综合色综合色综合色| 五十路息与子猛烈交尾视频| 天天爽夜夜爽人人爽QC| 久久久久久性虐视频| 亚洲成人国产综合一区| 成人福利视频免费在线| 亚洲男人的天堂a在线| 日本午夜爽爽爽爽爽视频在线观看| 激情伦理欧美日韩中文字幕| jiuse91九色视频| 日本后入视频在线观看 | 中文字幕免费福利视频6| 国产清纯美女al在线| 亚洲特黄aaaa片| 欧美美女人体视频一区| 成人性爱在线看四区| 国产成人小视频在线观看无遮挡| 国产精品三级三级三级| 大骚逼91抽插出水视频| 欧美va亚洲va天堂va| weyvv5国产成人精品的视频| 天天色天天爱天天爽| 黄页网视频在线免费观看| 国产美女午夜福利久久| 伊人精品福利综合导航| 蜜臀av久久久久蜜臀av麻豆| 青娱乐极品视频青青草| 亚洲日产av一区二区在线| 福利视频一区二区三区筱慧| 一区二区三区四区中文| 亚洲偷自拍高清视频| 粉嫩av蜜乳av蜜臀| 亚洲成人av一区在线| 青青青青青手机视频| 视频一区二区综合精品| 日韩欧美一级aa大片| 欧美日韩情色在线观看| 鸡巴操逼一级黄色气| 黑人进入丰满少妇视频| 专门看国产熟妇的网站| 人妻丝袜精品中文字幕| 神马午夜在线观看视频| 一级黄色片夫妻性生活| 骚货自慰被发现爆操| 18禁免费av网站| 全国亚洲男人的天堂| lutube在线成人免费看| 欧美一区二区三区乱码在线播放| 在线播放一区二区三区Av无码| 视频久久久久久久人妻| 动色av一区二区三区| 9国产精品久久久久老师| 在线免费观看黄页视频| 国产亚洲欧美视频网站| 亚洲免费视频欧洲免费视频| 国产黄色片在线收看| 91亚洲手机在线视频播放| 1000部国产精品成人观看视频| 女警官打开双腿沦为性奴| 欧美亚洲偷拍自拍色图| 天天摸天天干天天操科普| 国产刺激激情美女网站| 在线新三级黄伊人网| 88成人免费av网站| 超pen在线观看视频公开97| 国产精品黄色的av| 好太好爽好想要免费| sspd152中文字幕在线| 91天堂天天日天天操| 日本中文字幕一二区视频| 亚洲福利天堂久久久久久| 色综合天天综合网国产成人| 男人靠女人的逼视频| 中文乱理伦片在线观看| 国产欧美日韩第三页| 中文字幕一区二区自拍| 91人妻精品一区二区在线看| 国产av福利网址大全| 午夜毛片不卡免费观看视频| 中文字幕综合一区二区| 亚洲另类图片蜜臀av| 天天操天天干天天插| 天干天天天色天天日天天射| 国产成人综合一区2区| 抽查舔水白紧大视频| 38av一区二区三区| 天天日天天日天天擦| 成人av亚洲一区二区| 亚洲综合在线视频可播放| 极品性荡少妇一区二区色欲| 啪啪啪啪啪啪啪啪av| 成人av免费不卡在线观看| 男人插女人视频网站| 97少妇精品在线观看| 综合精品久久久久97| 亚洲青青操骚货在线视频| 看一级特黄a大片日本片黑人| 天天日天天天天天天天天天天 | 91精品国产黑色丝袜| 国产美女一区在线观看| 在线观看视频 你懂的| 一区二区麻豆传媒黄片| 91人妻人人做人人爽在线| 久久一区二区三区人妻欧美| 日日夜夜大香蕉伊人| 亚洲国产欧美一区二区三区久久| 亚洲一级av无码一级久久精品| 91高清成人在线视频| 亚洲av无硬久久精品蜜桃| 九一传媒制片厂视频在线免费观看| 亚洲精品一线二线在线观看 | 色噜噜噜噜18禁止观看| 中文字幕亚洲中文字幕| 天天操天天干天天日狠狠插 | 国产超码片内射在线| 人妻凌辱欧美丰满熟妇| 欧美日韩人妻久久精品高清国产| 最新中文字幕免费视频| 东京干手机福利视频| 人妻熟女在线一区二区| 毛片一级完整版免费| 国产av一区2区3区| 又粗又长 明星操逼小视频| 鸡巴操逼一级黄色气| 888亚洲欧美国产va在线播放| 漂亮 人妻被中出中文| 欧美日韩中文字幕欧美| 人妻另类专区欧美制服| 国产福利小视频二区| 国产综合精品久久久久蜜臀| 激情人妻校园春色亚洲欧美| 国产 在线 免费 精品| 美女张开两腿让男人桶av| 国产福利小视频大全| 中国视频一区二区三区| 亚洲成人午夜电影在线观看| 亚洲无码一区在线影院| 一区二区三区四区五区性感视频| 国产成人精品av网站| 欧美一区二区三区啪啪同性| 欧美精品激情在线最新观看视频| 老熟妇凹凸淫老妇女av在线观看| 天天操,天天干,天天射| 大尺度激情四射网站| 亚洲色偷偷综合亚洲AV伊人| 在线观看视频网站麻豆| 精品人妻每日一部精品| 精品suv一区二区69| 在线观看免费视频网| 九色视频在线观看免费| 色综合久久五月色婷婷综合| 九九热99视频在线观看97| 欧美女同性恋免费a| 国产无遮挡裸体免费直播视频| 国产成人精品午夜福利训2021| 天堂va蜜桃一区入口| 一色桃子久久精品亚洲| 偷拍美女一区二区三区| 亚洲天堂成人在线观看视频网站| 亚洲精品一区二区三区老狼| 清纯美女在线观看国产| 中文字幕av熟女人妻| 在线观看日韩激情视频| 日韩成人性色生活片| 狠狠的往里顶撞h百合| 免费在线观看视频啪啪| 亚洲中文字幕校园春色| 久久精品国产23696| 亚洲欧美成人综合在线观看| 成年人啪啪视频在线观看| 热思思国产99re| 男人的天堂av日韩亚洲| 熟女视频一区,二区,三区| 精品人人人妻人人玩日产欧| 日本在线一区二区不卡视频| 午夜青青草原网在线观看| 免费看国产又粗又猛又爽又黄视频| 亚洲国际青青操综合网站| 青青草原网站在线观看| 亚洲激情,偷拍视频| 国产丰满熟女成人视频| 欧美怡红院视频在线观看| 国产在线自在拍91国语自产精品 | 久久丁香花五月天色婷婷| 久久久91蜜桃精品ad| 亚洲国产欧美一区二区三区久久| 在线观看av观看av| 91大神福利视频网| 人人妻人人澡欧美91精品| 天天射,天天操,天天说| 美女福利视频网址导航| 亚洲熟妇久久无码精品| 新97超碰在线观看| 操日韩美女视频在线免费看| 宅男噜噜噜666免费观看| 大陆av手机在线观看| 日本后入视频在线观看| 91成人在线观看免费视频| 大骚逼91抽插出水视频| 又粗又硬又猛又黄免费30| 欧美日韩亚洲国产无线码| 国产精彩福利精品视频| 绝顶痉挛大潮喷高潮无码| 57pao国产一区二区| 日本裸体熟妇区二区欧美| 亚洲av无乱一区二区三区性色| 97青青青手机在线视频| 久草视频在线一区二区三区资源站 | 又粗又长 明星操逼小视频 | 免费人成黄页网站在线观看国产| 欧美 亚洲 另类综合| 超级碰碰在线视频免费观看| 日本性感美女写真视频| 啪啪啪啪啪啪啪啪av| 懂色av之国产精品| 亚洲熟女久久久36d| 亚洲视频在线观看高清| 久久热这里这里只有精品| 日本av在线一区二区三区| 青青青青青操视频在线观看| 国产女人露脸高潮对白视频| 91色网站免费在线观看| 自拍偷拍日韩欧美亚洲| 午夜美女少妇福利视频| 端庄人妻堕落挣扎沉沦| 午夜精品九一唐人麻豆嫩草成人| 国产一区av澳门在线观看| 97超碰免费在线视频| 中文乱理伦片在线观看| 午夜精品一区二区三区4| 日韩无码国产精品强奸乱伦| 老司机免费福利视频网| 午夜青青草原网在线观看| 欧美一区二区三区在线资源 | 日韩国产乱码中文字幕| 国产大学生援交正在播放| 深夜男人福利在线观看| av在线shipin| 激情图片日韩欧美人妻| 青青社区2国产视频| 涩涩的视频在线观看视频| 色哟哟国产精品入口| 成人福利视频免费在线| 日本熟女精品一区二区三区| 国产成人精品午夜福利训2021| 国产刺激激情美女网站| av在线免费观看亚洲天堂| 国产精品女邻居小骚货| 岛国青草视频在线观看| 无码国产精品一区二区高潮久久4| 人妻av无码专区久久绿巨人| 91国内视频在线观看| 99精品国自产在线人| 亚洲最大免费在线观看| 亚洲综合一区二区精品久久| 人妻少妇亚洲一区二区| 黄色男人的天堂视频| 美女日逼视频免费观看| 激情内射在线免费观看| 啪啪啪操人视频在线播放| 国产高清精品极品美女| 又粗又长 明星操逼小视频| 丰满的继坶3中文在线观看| 热思思国产99re| 国产亚洲成人免费在线观看| 国产一线二线三线的区别在哪| 色综合色综合色综合色| 亚洲成人午夜电影在线观看| 精品少妇一二三视频在线| 午夜精品一区二区三区城中村| 动色av一区二区三区| 日韩近亲视频在线观看| 色av色婷婷人妻久久久精品高清| 国产美女午夜福利久久| 国产aⅴ一线在线观看| 亚洲一区自拍高清免费视频| 熟女视频一区,二区,三区| 超碰公开大香蕉97| 成年人免费看在线视频| 免费看国产av网站| 国产高清97在线观看视频| 欲乱人妻少妇在线视频裸| 超碰公开大香蕉97| 免费观看理论片完整版| www久久久久久久久久久| 成人国产影院在线观看| 四川乱子伦视频国产vip| 青娱乐蜜桃臀av色| 国产精品精品精品999| 人人爽亚洲av人人爽av| caoporm超碰国产| 99一区二区在线观看| 性感美女诱惑福利视频| 色秀欧美视频第一页| 国产片免费观看在线观看| 午夜福利资源综合激情午夜福利资| av成人在线观看一区| 啊啊好慢点插舔我逼啊啊啊视频| 综合色区亚洲熟妇shxstz| 日本av熟女在线视频| 四虎永久在线精品免费区二区| 天天爽夜夜爽人人爽QC| 中文字幕 码 在线视频| 亚洲精品精品国产综合| 亚洲中文字幕乱码区| 欧美日韩中文字幕欧美| 一级黄色片夫妻性生活| 日本黄在免费看视频| 中文字幕乱码人妻电影| 欧美特色aaa大片| 久久精品美女免费视频| 天天艹天天干天天操| 最新的中文字幕 亚洲| 欧美亚洲少妇福利视频| 色秀欧美视频第一页| 成人网18免费视频版国产| 日韩影片一区二区三区不卡免费| gogo国模私拍视频| 美女骚逼日出水来了| 亚洲一区二区三区久久受| 亚洲成人av一区在线| 中文字幕在线免费第一页| 欧美成人一二三在线网| 99精品国产自在现线观看| 国产janese在线播放| 国产综合高清在线观看| 中文字幕在线一区精品| 天天日天天干天天插舔舔| 欧美成人精品在线观看| 国产黄色高清资源在线免费观看| 88成人免费av网站| 91老熟女连续高潮对白| 国产亚洲四十路五十路| 2021久久免费视频| 亚洲午夜伦理视频在线| 黄色黄色黄片78在线| 9色在线视频免费观看| 在线免费观看黄页视频| 亚洲特黄aaaa片| 一区二区三区久久久91| 伊人成人综合开心网| 免费国产性生活视频| 日韩精品激情在线观看| 2021国产一区二区| 国产精品欧美日韩区二区 | 91九色porny蝌蚪国产成人| 国产中文精品在线观看| 插逼视频双插洞国产操逼插洞| 极品粉嫩小泬白浆20p主播| 黄网十四区丁香社区激情五月天 | 2o22av在线视频| 在线播放 日韩 av| 久久精品视频一区二区三区四区 | 精品美女在线观看视频在线观看| 亚洲欧美清纯唯美另类| 沈阳熟妇28厘米大战黑人| 午夜毛片不卡免费观看视频| 丝袜亚洲另类欧美变态| 性生活第二下硬不起来| 亚洲精品高清自拍av| 黄色中文字幕在线播放| 午夜精品一区二区三区更新| 国产精品自拍在线视频| 亚洲欧美国产综合777| 国产自拍在线观看成人| av中文字幕在线观看第三页 | 日韩精品电影亚洲一区| 久久久精品欧洲亚洲av| 超碰97人人澡人人| 韩国三级aaaaa高清视频| 在线免费观看日本伦理| 精品高跟鞋丝袜一区二区| 久久精品美女免费视频| 沈阳熟妇28厘米大战黑人| www天堂在线久久| 免费黄页网站4188| 硬鸡巴动态操女人逼视频| 国产精彩对白一区二区三区| 一二三中文乱码亚洲乱码one | 欧美麻豆av在线播放| 国产亚洲视频在线观看| 亚洲国产精品久久久久蜜桃| 亚洲高清国产一区二区三区| 亚洲欧美成人综合视频| 国产免费av一区二区凹凸四季| 久青青草视频手机在线免费观看| 国产精品视频欧美一区二区| 免费高清自慰一区二区三区网站| 五十路熟女人妻一区二| 日噜噜噜夜夜噜噜噜天天噜噜噜| 免费黄色成人午夜在线网站| 丝袜肉丝一区二区三区四区在线看| 精品视频国产在线观看| 欧美黑人与人妻精品| 精品高跟鞋丝袜一区二区| 亚洲中文字幕综合小综合| 欧美成一区二区三区四区| 少妇人妻久久久久视频黄片| 亚洲码av无色中文| 国产精品欧美日韩区二区| 绯色av蜜臀vs少妇| 自拍偷拍 国产资源| 爆乳骚货内射骚货内射在线| 亚洲1卡2卡三卡4卡在线观看 | 天天色天天操天天舔| 91破解版永久免费| 男人和女人激情视频| 欧美日韩一区二区电影在线观看| 中文字幕日韩精品日本| 黄片色呦呦视频免费看| 99精品国自产在线人| 99精品视频在线观看免费播放| 天天干天天操天天玩天天射| 一区二区三区蜜臀在线| 91麻豆精品秘密入口在线观看| 精品国产污污免费网站入口自| 少妇被强干到高潮视频在线观看 | 日本丰满熟妇BBXBBXHD| 亚洲一级av大片免费观看| 久久这里只有精彩视频免费| 午夜精品一区二区三区福利视频| 自拍偷拍,中文字幕| h国产小视频福利在线观看| 亚洲卡1卡2卡三卡四老狼| 成人av电影免费版| 99的爱精品免费视频| 污污小视频91在线观看| 欧美激情电影免费在线| 护士特殊服务久久久久久久| 免费福利av在线一区二区三区| 夜夜嗨av蜜臀av| 亚洲少妇高潮免费观看| 在线观看操大逼视频| 色爱av一区二区三区| 青青青青青青青青青青草青青| 成人在线欧美日韩国产| 亚洲偷自拍高清视频| 久久久人妻一区二区| 亚洲av色图18p| 久草福利电影在线观看| 精品国产在线手机在线| 国产精品久久久久久久久福交| 亚洲欧美成人综合视频| 黄色录像鸡巴插进去| 久久久久久九九99精品| 国产精品探花熟女在线观看| 亚洲国产美女一区二区三区软件| 亚洲精品三级av在线免费观看| 91免费观看在线网站 | 91‖亚洲‖国产熟女| 国产三级片久久久久久久| 天天艹天天干天天操| 福利在线视频网址导航| 一区二区三区欧美日韩高清播放| 免费手机黄页网址大全| 91九色国产熟女一区二区| www久久久久久久久久久| 婷婷久久久综合中文字幕| 欧美一区二区三区乱码在线播放| 人妻久久久精品69系列| 亚洲成a人片777777| 91国产在线免费播放| 3337p日本欧洲大胆色噜噜| 天天通天天透天天插| 欧美少妇性一区二区三区| 换爱交换乱高清大片| 久久久久久9999久久久久| 日本熟女精品一区二区三区| 亚洲欧美国产综合777| 极品粉嫩小泬白浆20p主播| 四虎永久在线精品免费区二区| 亚洲高清国产一区二区三区| 日本啪啪啪啪啪啪啪| 初美沙希中文字幕在线| 人妻丝袜诱惑我操她视频| 亚洲国产成人av在线一区| 日韩中文字幕精品淫| 亚洲精品无码久久久久不卡| 精品高跟鞋丝袜一区二区| 亚洲第17页国产精品| 午夜精品九一唐人麻豆嫩草成人| 免费黄色成人午夜在线网站| 国产午夜福利av导航| 亚洲国产香蕉视频在线播放| 亚洲1069综合男同| 久精品人妻一区二区三区| 国产日韩一区二区在线看| 日韩精品中文字幕福利| 日日夜夜精品一二三| 最新欧美一二三视频| 久久久超爽一二三av| 丰满熟女午夜福利视频| 色呦呦视频在线观看视频| 91九色国产熟女一区二区| 天天操天天射天天操天天天| 熟女视频一区,二区,三区| 精品美女福利在线观看| 国产真实乱子伦a视频 | 成人高潮aa毛片免费| 男人靠女人的逼视频| 美女 午夜 在线视频| 国产久久久精品毛片| 国产欧美日韩在线观看不卡| 欧美视频不卡一区四区| 老熟妇凹凸淫老妇女av在线观看| 日本性感美女视频网站| 国产精品一区二区三区蜜臀av| 极品粉嫩小泬白浆20p主播| 93精品视频在线观看| 一级黄色片夫妻性生活| 国内资源最丰富的网站| 国产在线观看黄色视频| 99热99re在线播放| 懂色av之国产精品| 在线免费91激情四射 | 人人妻人人爽人人添夜| 亚洲国际青青操综合网站| 国产av国片精品一区二区| 女同久久精品秋霞网| 亚洲一区二区三区五区| 真实国产乱子伦一区二区| 精品老妇女久久9g国产| 日本a级视频老女人| 激情啪啪啪啪一区二区三区| 一区二区三区四区五区性感视频| 97青青青手机在线视频| 女蜜桃臀紧身瑜伽裤| 日本午夜久久女同精女女| 亚洲日本一区二区久久久精品| 亚洲国产香蕉视频在线播放| 欧美亚洲牲夜夜综合久久| 5528327男人天堂| 91精品啪在线免费| 中文字幕在线乱码一区二区| 97超碰人人搞人人| 亚洲成a人片777777| 男人插女人视频网站| 国产精品一二三不卡带免费视频 | 男女之间激情网午夜在线| 中文字幕人妻熟女在线电影| 五十路熟女人妻一区二区9933| 欧美日韩v中文在线| 直接观看免费黄网站| 9色在线视频免费观看| 精品av国产一区二区三区四区| 97少妇精品在线观看| 中文字幕一区二区三区蜜月 | 天天干天天日天天干天天操| 久草极品美女视频在线观看| 国产精品中文av在线播放| 9色在线视频免费观看| AV天堂一区二区免费试看| 国产午夜无码福利在线看| 骚货自慰被发现爆操| 黄色三级网站免费下载| 亚洲日本一区二区三区| 中文字幕欧美日韩射射一| 一级黄片大鸡巴插入美女 | 日韩美av高清在线| 欧美视频一区免费在线| 鸡巴操逼一级黄色气| 老司机福利精品免费视频一区二区| 美女大bxxxx内射| 精品久久久久久久久久久99| 亚洲蜜臀av一区二区三区九色 | 91‖亚洲‖国产熟女| 蜜桃视频在线欧美一区| 中文字幕一区二区三区人妻大片| 免费观看污视频网站| 日韩精品电影亚洲一区| 在线免费视频 自拍| 宅男噜噜噜666国产| 操操网操操伊剧情片中文字幕网| 家庭女教师中文字幕在线播放| 又粗又长 明星操逼小视频| 无忧传媒在线观看视频| 日本少妇高清视频xxxxx| 好了av中文字幕在线| 99久久久无码国产精品性出奶水| 黄片大全在线观看观看| 色婷婷六月亚洲综合香蕉| 粉嫩av蜜乳av蜜臀| 国内自拍第一页在线观看| 欧美精品中文字幕久久二区| 国产黄色a级三级三级三级| 激情图片日韩欧美人妻| 国产精品国色综合久久| 999九九久久久精品| 家庭女教师中文字幕在线播放| 久久久久久久一区二区三 | 欧美日韩激情啪啪啪| 无码中文字幕波多野不卡| 粉嫩小穴流水视频在线观看| 五月天久久激情视频| 亚洲1卡2卡三卡4卡在线观看| 蜜桃久久久久久久人妻| 日本中文字幕一二区视频| 一区二区三区综合视频| 成人av久久精品一区二区| 亚洲天堂有码中文字幕视频| av日韩在线观看大全| 日韩av有码中文字幕| 精品一区二区三区午夜| 狠狠操操操操操操操操操| 红杏久久av人妻一区| 天天日天天添天天爽| 欧美亚洲少妇福利视频| 久久久精品国产亚洲AV一| 日本乱人一区二区三区| 亚洲国产欧美一区二区三区久久| 18禁无翼鸟成人在线 | www天堂在线久久| 亚洲va欧美va人人爽3p| 亚洲的电影一区二区三区| 一区二区三区国产精选在线播放 | 国产91久久精品一区二区字幕| 999热精品视频在线| 欧美性感尤物人妻在线免费看| 精品国产成人亚洲午夜| 都市激情校园春色狠狠| 天堂av在线最新版在线| 精品久久久久久久久久久99| 日本少妇在线视频大香蕉在线观看| 青青热久免费精品视频在线观看 | 日日夜夜精品一二三| 最新国产精品网址在线观看| 91超碰青青中文字幕| 精品乱子伦一区二区三区免费播| 狍和女人的王色毛片| 大肉大捧一进一出好爽在线视频 | 97人妻无码AV碰碰视频| 久久久超爽一二三av| 阴茎插到阴道里面的视频| 中出中文字幕在线观看| 欧美日韩不卡一区不区二区| 干逼又爽又黄又免费的视频| 国产精品系列在线观看一区二区| 亚洲人妻30pwc| 97资源人妻免费在线视频| 99久久超碰人妻国产| 日本五十路熟新垣里子| 成人国产激情自拍三区| 天天躁日日躁狠狠躁av麻豆| 中文字幕AV在线免费看 | 亚洲高清国产自产av| 亚洲av无硬久久精品蜜桃| 韩国亚洲欧美超一级在线播放视频| 青青草亚洲国产精品视频| 亚洲1069综合男同| 91精品国产麻豆国产| 黑人变态深video特大巨大| 在线国产中文字幕视频| 成人免费公开视频无毒 | 婷婷综合蜜桃av在线| 成人资源在线观看免费官网| 特大黑人巨大xxxx| 韩国爱爱视频中文字幕| 大鸡吧插入女阴道黄色片| 成人蜜臀午夜久久一区| 久久这里只有精彩视频免费| 天美传媒mv视频在线观看| 夜女神免费福利视频| 99re国产在线精品| 美女 午夜 在线视频| 特大黑人巨大xxxx| 蜜臀成人av在线播放| 大鸡巴操b视频在线| 日韩伦理短片在线观看| 日韩熟女av天堂系列| 中文字幕无码一区二区免费| 2021年国产精品自拍| 免费黄色成人午夜在线网站| av完全免费在线观看av| 色呦呦视频在线观看视频| 精品国产乱码一区二区三区乱| 一区二区三区毛片国产一区| 日韩特级黄片高清在线看| 免费在线播放a级片| 91人妻人人做人人爽在线| 亚洲精品午夜久久久久| 青青青青草手机在线视频免费看 | 亚洲中文字幕国产日韩| 99热久久这里只有精品| 99精品国自产在线人| 亚洲综合一区成人在线| 国产精品日韩欧美一区二区| 日本人妻欲求不满中文字幕| 免费在线黄色观看网站| 绝顶痉挛大潮喷高潮无码| 四虎永久在线精品免费区二区| 男人操女人的逼免费视频| 揄拍成人国产精品免费看视频| 777奇米久久精品一区| gogo国模私拍视频| 亚洲午夜电影在线观看| 国产1区,2区,3区| 日韩在线视频观看有码在线| 4个黑人操素人视频网站精品91| 日韩熟女系列一区二区三区| 国产成人自拍视频播放| 18禁网站一区二区三区四区| 51精品视频免费在线观看| 粉嫩欧美美人妻小视频| 一区二区在线观看少妇| 青青草精品在线视频观看| 亚洲熟色妇av日韩熟色妇在线| 人妻少妇精品久久久久久| 91she九色精品国产| 婷婷色国产黑丝少妇勾搭AV | 欧美特级特黄a大片免费| 亚洲av第国产精品| 久久香蕉国产免费天天| 瑟瑟视频在线观看免费视频| 国产精品视频资源在线播放| 亚洲丝袜老师诱惑在线观看| 秋霞午夜av福利经典影视| 一区二区麻豆传媒黄片 | 1区2区3区4区视频在线观看| 久久人人做人人妻人人玩精品vr| 亚洲一区av中文字幕在线观看| 亚洲女人的天堂av| 国产综合视频在线看片| 国内自拍第一页在线观看| 国产激情av网站在线观看| 精品成人午夜免费看| 亚洲欧美精品综合图片小说| 美女福利视频网址导航| 水蜜桃一区二区三区在线观看视频 | 把腿张开让我插进去视频| 亚洲自拍偷拍精品网| 国产熟妇人妻ⅹxxxx麻豆| 亚洲免费视频欧洲免费视频| 1区2区3区4区视频在线观看| 特黄老太婆aa毛毛片| 国产女人叫床高潮大片视频| 精品人妻每日一部精品| 天天操,天天干,天天射| 欧亚乱色一区二区三区| a v欧美一区=区三区| 国产亚洲欧美视频网站| 桃色视频在线观看一区二区| 成人免费做爰高潮视频| 丰满的继坶3中文在线观看| 老司机在线精品福利视频| 91九色porny国产蝌蚪视频| 中文字幕av一区在线观看| 中文字幕高清免费在线人妻| 亚洲av日韩av第一区二区三区| 同居了嫂子在线播高清中文| 93人妻人人揉人人澡人人| 黄色男人的天堂视频| 强行扒开双腿猛烈进入免费版| 女同性ⅹxx女同hd| 五月婷婷在线观看视频免费| 天天躁夜夜躁日日躁a麻豆| 久久久精品999精品日本| 九色视频在线观看免费| 久久久人妻一区二区| 精品少妇一二三视频在线| 久久这里只有精品热视频| 日本女人一级免费片| 熟女视频一区,二区,三区| 中文字幕av第1页中文字幕| 韩国爱爱视频中文字幕| 丝袜美腿欧美另类 中文字幕| 人妻激情图片视频小说| 青青社区2国产视频| 国产高清在线在线视频| 人妻少妇性色欲欧美日韩| 沈阳熟妇28厘米大战黑人| 亚洲成人av一区在线| 91九色porny蝌蚪国产成人| 伊人网中文字幕在线视频| 国产露脸对白在线观看| 巨乳人妻日下部加奈被邻居中出 | 熟妇一区二区三区高清版| 视频一区二区在线免费播放| 插逼视频双插洞国产操逼插洞| 人妻久久久精品69系列| 亚洲一级 片内射视正片| chinese国产盗摄一区二区| 成人H精品动漫在线无码播放| 97精品综合久久在线| 中文字幕免费在线免费| 香港一级特黄大片在线播放| 丰满的继坶3中文在线观看| 天天干夜夜操啊啊啊| 黄网十四区丁香社区激情五月天 | 粉嫩欧美美人妻小视频| 少妇一区二区三区久久久| 日韩a级精品一区二区| 热久久只有这里有精品| 亚洲黄色av网站免费播放| 中国熟女一区二区性xx| 国产精品3p和黑人大战| 操的小逼流水的文章| 人妻少妇亚洲精品中文字幕| 啪啪啪啪啪啪啪免费视频| 国产日本欧美亚洲精品视| 爱有来生高清在线中文字幕| 免费费一级特黄真人片| 国产精品久久久黄网站| 青青青aaaa免费| 成人av亚洲一区二区| 亚洲av日韩av网站| 国产性色生活片毛片春晓精品 | 欧美黑人性暴力猛交喷水| 国产精品视频欧美一区二区| 美女小视频网站在线| 精品国产成人亚洲午夜| 国产一区二区火爆视频| 日本18禁久久久久久| 97青青青手机在线视频| 伊人精品福利综合导航| 一区二区熟女人妻视频| av天堂资源最新版在线看| 天天日天天操天天摸天天舔| 欧美偷拍自拍色图片| 老司机福利精品免费视频一区二区| 青草青永久在线视频18| 日曰摸日日碰夜夜爽歪歪| 日本韩国亚洲综合日韩欧美国产| 国产麻豆剧果冻传媒app| 岛国一区二区三区视频在线| 国产又色又刺激在线视频| 国产视频在线视频播放| 亚洲日本一区二区久久久精品| 97资源人妻免费在线视频| 久久综合老鸭窝色综合久久| 韩国AV无码不卡在线播放| 欧美日韩v中文在线| 国产亚洲视频在线二区| 欧美成人综合视频一区二区| 老鸭窝在线观看一区| 国产白袜脚足J棉袜在线观看| 亚洲最大免费在线观看| 5528327男人天堂| 3337p日本欧洲大胆色噜噜| 日韩美女福利视频网| 久碰精品少妇中文字幕av| 中文字幕在线观看国产片| 中文 成人 在线 视频| 成人精品在线观看视频| lutube在线成人免费看| 91九色国产熟女一区二区| 天天摸天天干天天操科普| 欧美成人黄片一区二区三区| 欧美视频中文一区二区三区| 揄拍成人国产精品免费看视频| 亚欧在线视频你懂的| 国产精品视频欧美一区二区| 最新欧美一二三视频| 日本精品视频不卡一二三| 亚洲一区制服丝袜美腿| 国产亚洲国产av网站在线| 欧美一区二区三区乱码在线播放| 天天色天天操天天舔| 久久免看30视频口爆视频| av森泽佳奈在线观看| 亚洲超碰97人人做人人爱| 亚洲色偷偷综合亚洲AV伊人| 农村胖女人操逼视频| 91香蕉成人app下载| 中文字母永久播放1区2区3区| 中文字幕 人妻精品| 欧美精品国产综合久久| 日韩av有码中文字幕| 国产一区二区三免费视频| 偷拍3456eee| 性感美女高潮视频久久久 | 国产成人一区二区三区电影网站| 操操网操操伊剧情片中文字幕网| 中文字幕无码一区二区免费| 污污小视频91在线观看| aⅴ五十路av熟女中出| 动色av一区二区三区| 久久精品国产亚洲精品166m| 玩弄人妻熟妇性色av少妇| 91免费黄片可看视频| 亚洲av黄色在线网站| 18禁免费av网站| 熟女人妻一区二区精品视频| 亚洲av男人天堂久久| 激情小视频国产在线| 在线观看视频一区麻豆| 日韩人妻丝袜中文字幕| 亚洲人人妻一区二区三区| 日韩人妻在线视频免费| 国产黄色高清资源在线免费观看| 小泽玛利亚视频在线观看| 91人妻人人做人人爽在线| 久久免费看少妇高潮完整版| 国产精品污污污久久| 亚洲av自拍天堂网| 大香蕉大香蕉在线看| 日韩视频一区二区免费观看| 五十路熟女人妻一区二区9933| 亚洲熟女综合色一区二区三区四区| sejizz在线视频| 欧美黑人与人妻精品| 四川乱子伦视频国产vip| 在线免费91激情四射 | 国产午夜激情福利小视频在线| 97国产在线av精品| 国产一级精品综合av| 黑人性生活视频免费看| 国产精品自拍偷拍a| 一区二区三区四区视频在线播放| 亚洲精品在线资源站| 亚洲av人人澡人人爽人人爱| 亚洲成av人无码不卡影片一| 久久久久久97三级| 人人妻人人爽人人添夜| 亚洲1区2区3区精华液| 美女操逼免费短视频下载链接| 午夜在线精品偷拍一区二| 精品美女久久久久久| 欧美成人猛片aaaaaaa| 新97超碰在线观看| 亚洲狠狠婷婷综合久久app| 久草福利电影在线观看| 亚洲综合在线观看免费| 欧美色婷婷综合在线| 久久综合老鸭窝色综合久久| 视频久久久久久久人妻| 韩国女主播精品视频网站| 国产欧美精品不卡在线| 狠狠的往里顶撞h百合| 一区二区三区的久久的蜜桃的视频| 亚洲福利精品福利精品福利| 后入美女人妻高清在线| 亚洲国产精品久久久久蜜桃| 欧美亚洲少妇福利视频| 白白操白白色在线免费视频 | 久久精品美女免费视频| 日韩精品中文字幕在线| 换爱交换乱高清大片| 亚洲高清免费在线观看视频| 操人妻嗷嗷叫视频一区二区| 农村胖女人操逼视频| 视频久久久久久久人妻| 亚洲区美熟妇久久久久| 日韩激情文学在线视频| 亚洲最大免费在线观看| 青青青青青手机视频| 丰满少妇翘臀后进式| 成人网18免费视频版国产| 搡老熟女一区二区在线观看| sw137 中文字幕 在线| 大鸡吧插逼逼视频免费看| 青青青艹视频在线观看| 91精品高清一区二区三区| 欧美精品中文字幕久久二区| 天天日夜夜操天天摸| 天天想要天天操天天干| 伊人综合aⅴ在线网| 狠狠鲁狠狠操天天晚上干干| 欧美第一页在线免费观看视频| 视频在线免费观看你懂得| 偷拍自拍国产在线视频| 中文字幕人妻熟女在线电影| 亚洲男人在线天堂网| 青青草在观免费国产精品| 深夜男人福利在线观看| 欧美爆乳肉感大码在线观看| 5528327男人天堂| 亚洲一级特黄特黄黄色录像片| 午夜蜜桃一区二区三区| 亚洲免费va在线播放| 中文字幕免费在线免费| ka0ri在线视频| 精品人人人妻人人玩日产欧| 亚洲成高清a人片在线观看| 亚洲av日韩精品久久久久久hd| 一区二区三区久久中文字幕| 国产剧情演绎系列丝袜高跟| av无限看熟女人妻另类av| 亚洲专区激情在线观看视频| 日本高清撒尿pissing| 日本在线不卡免费视频| 亚洲va国产va欧美va在线| 亚洲专区激情在线观看视频| 99久久中文字幕一本人| 91精品国产麻豆国产| 97人人模人人爽人人喊| 亚洲精品无码色午夜福利理论片| 亚洲精品无码久久久久不卡| 国产三级影院在线观看| av高潮迭起在线观看| 白白操白白色在线免费视频| 亚洲精品国产综合久久久久久久久| 国产无遮挡裸体免费直播视频| 天堂v男人视频在线观看| 亚洲一区二区三区精品乱码| 在线免费观看靠比视频的网站| 日韩午夜福利精品试看| 久久这里只有精彩视频免费| 91在线免费观看成人| 人妻最新视频在线免费观看| 97色视频在线观看| 97人人模人人爽人人喊| 黄色三级网站免费下载| 国产一级麻豆精品免费| 国产精品欧美日韩区二区| 性感美女诱惑福利视频| 视频一区 视频二区 视频| 成年人免费看在线视频| 亚洲青青操骚货在线视频| 国产精品久久久久久久久福交| 不卡一不卡二不卡三| 午夜精品一区二区三区4| 二区中出在线观看老师 | 中文字幕AV在线免费看 | 全国亚洲男人的天堂| 人人爱人人妻人人澡39| 欧美视频一区免费在线| 涩涩的视频在线观看视频| 成人性黑人一级av| 国产janese在线播放| 国产日韩欧美视频在线导航| 狠狠操狠狠操免费视频| 人妻丝袜av在线播放网址| 少妇人妻二三区视频| 亚洲一区二区三区偷拍女厕91| 日日夜夜大香蕉伊人| 亚洲av极品精品在线观看| 国产欧美精品一区二区高清 | 国产综合视频在线看片| 美女吃鸡巴操逼高潮视频| 日韩成人性色生活片| 欧美3p在线观看一区二区三区| 国产清纯美女al在线| 亚洲午夜伦理视频在线| 亚洲一级 片内射视正片| 黄色视频成年人免费观看| 天天日天天日天天擦| 成人福利视频免费在线| 黑人巨大的吊bdsm| 东游记中文字幕版哪里可以看到| 国产精品国产三级国产精东| 1区2区3区4区视频在线观看| 欧美日韩国产一区二区三区三州| 天天色天天操天天透| 93精品视频在线观看| 中文乱理伦片在线观看| 精品少妇一二三视频在线| 狠狠操操操操操操操操操| 高清成人av一区三区| 一级A一级a爰片免费免会员| 红桃av成人在线观看| 亚洲欧美激情人妻偷拍| 天堂va蜜桃一区入口| 亚洲综合一区成人在线| 成人乱码一区二区三区av| 人人妻人人澡欧美91精品| 亚洲卡1卡2卡三卡四老狼| 超级av免费观看一区二区三区| 久久久超爽一二三av| 国产精品欧美日韩区二区 | 曰本无码人妻丰满熟妇啪啪| 日韩少妇人妻精品无码专区| 大鸡巴后入爆操大屁股美女| 色av色婷婷人妻久久久精品高清| 亚洲成av人无码不卡影片一| 亚洲精品一线二线在线观看| 97人人妻人人澡人人爽人人精品| 青青青激情在线观看视频| 99精品国自产在线人| 国产日本欧美亚洲精品视| 沈阳熟妇28厘米大战黑人| 3D动漫精品啪啪一区二区下载| 日韩中文字幕在线播放第二页| 播放日本一区二区三区电影| 91国内精品久久久久精品一| 漂亮 人妻被中出中文| 五月色婷婷综合开心网4438| 人妻爱爱 中文字幕| 日本最新一二三区不卡在线 | av一本二本在线观看| 大胆亚洲av日韩av| 亚洲精品午夜aaa久久| 美女日逼视频免费观看| 一区二区三区久久久91| 午夜激情高清在线观看| 最新中文字幕乱码在线| 国产欧美日韩在线观看不卡| 曰本无码人妻丰满熟妇啪啪| 中文字幕一区二 区二三区四区| 在线免费观看av日韩| 亚洲日本一区二区三区 | 亚洲特黄aaaa片| 三级等保密码要求条款| 欧美地区一二三专区| 免费观看理论片完整版| 亚洲一区二区三区五区| 亚洲在线一区二区欧美| 曰本无码人妻丰满熟妇啪啪| 国产又粗又硬又大视频| 日日夜夜大香蕉伊人| 国产自拍在线观看成人| 97精品成人一区二区三区| 国产精品精品精品999| 水蜜桃一区二区三区在线观看视频| 青青青视频自偷自拍38碰| 国产露脸对白在线观看| 在线免费观看视频一二区| 日韩成人免费电影二区| 538精品在线观看视频| 免费无码人妻日韩精品一区二区| av中文字幕网址在线| 91免费放福利在线观看| 午夜成午夜成年片在线观看| 激情伦理欧美日韩中文字幕| 日本一本午夜在线播放| 操人妻嗷嗷叫视频一区二区| 人妻少妇亚洲一区二区| 中文字幕熟女人妻久久久| 综合精品久久久久97| 天天日天天干天天插舔舔| 亚洲图库另类图片区| 晚上一个人看操B片| 青青草亚洲国产精品视频| 国产午夜亚洲精品不卡在线观看| 91精品激情五月婷婷在线| 亚洲va欧美va人人爽3p| 黑人3p华裔熟女普通话| 亚洲精品久久综合久| 久久久人妻一区二区| 一区二区三区视频,福利一区二区| 午夜精品一区二区三区更新| 春色激情网欧美成人| 亚国产成人精品久久久| 黄色视频在线观看高清无码| 日噜噜噜夜夜噜噜噜天天噜噜噜| 亚洲成人国产综合一区| 中文字幕一区二区三区蜜月| 只有精品亚洲视频在线观看| 亚洲av日韩高清hd| 日本三极片视频网站观看| 不卡一区一区三区在线| 51国产偷自视频在线播放| 在线观看国产免费麻豆| 亚洲成人熟妇一区二区三区| 精品区一区二区三区四区人妻| 亚洲中文精品字幕在线观看| 天天射夜夜操综合网| av天堂资源最新版在线看| 动漫美女的小穴视频| 欧美特色aaa大片| www日韩a级s片av| 国产精品精品精品999| 国产精品精品精品999| 亚洲人妻视频在线网| 日本美女性生活一级片| 成人免费毛片aaaa| 青青擦在线视频国产在线| 亚洲av香蕉一区区二区三区犇| 91中文字幕最新合集| 一区二区三区欧美日韩高清播放| av天堂加勒比在线| 啪啪啪啪啪啪啪啪啪啪黄色| 日本女大学生的黄色小视频| 98视频精品在线观看| 亚洲午夜伦理视频在线| 5528327男人天堂| 在线 中文字幕 一区| yy6080国产在线视频| 亚洲精品中文字幕下载| 在线观看操大逼视频| 久久h视频在线观看| 午夜毛片不卡在线看| 91高清成人在线视频| 欧洲黄页网免费观看| 99国产精品窥熟女精品| 亚洲熟妇无码一区二区三区| 人妻少妇av在线观看| 国产成人无码精品久久久电影| 男生舔女生逼逼视频| 精品人妻一二三区久久| 国产精选一区在线播放| 国产精品免费不卡av| 天天通天天透天天插| 超级av免费观看一区二区三区| 九色视频在线观看免费| 91麻豆精品久久久久| 成人av中文字幕一区| 日本性感美女三级视频| 99热久久极品热亚洲| 动漫精品视频在线观看| 在线观看911精品国产| 久久久久五月天丁香社区| 成人性黑人一级av| 国产精选一区在线播放| 亚洲一区二区久久久人妻| 人妻少妇亚洲精品中文字幕| 国产午夜男女爽爽爽爽爽视频| 大肉大捧一进一出好爽在线视频 | 中文字幕日韩91人妻在线| 欧洲黄页网免费观看| 2021最新热播中文字幕| 亚洲av色香蕉一区二区三区 | 啪啪啪啪啪啪啪啪av| 日韩熟女av天堂系列| 国产福利小视频免费观看| 一区二区久久成人网| av中文字幕电影在线看| 中文字幕乱码人妻电影| 9l人妻人人爽人人爽| 天天爽夜夜爽人人爽QC| 天天操天天弄天天射| 成人区人妻精品一区二视频| 国产视频精品资源网站| 在线免费观看av日韩| 久久人人做人人妻人人玩精品vr| 亚洲欧美国产综合777| 亚洲av极品精品在线观看| 久久久91蜜桃精品ad| 色天天天天射天天舔| 边摸边做超爽毛片18禁色戒| 97色视频在线观看| 亚洲一区二区三区av网站| 麻豆精品成人免费视频| 国产成人自拍视频在线免费观看| 2021天天色天天干| 中文字幕在线乱码一区二区 | 97人妻色免费视频| 亚洲av无硬久久精品蜜桃| 91九色porny蝌蚪国产成人| 激情综合治理六月婷婷| v888av在线观看视频| 人妻在线精品录音叫床| 熟女国产一区亚洲中文字幕| 综合页自拍视频在线播放| 中文字幕 亚洲av| 国产在线自在拍91国语自产精品| 91色网站免费在线观看| 绝顶痉挛大潮喷高潮无码| 午夜久久久久久久精品熟女| 啪啪啪啪啪啪啪啪av| 激情啪啪啪啪一区二区三区| 亚洲 清纯 国产com| 宅男噜噜噜666免费观看| 国产成人小视频在线观看无遮挡| 黄色录像鸡巴插进去| 一二三中文乱码亚洲乱码one| 亚洲国产在线精品国偷产拍| 在线观看欧美黄片一区二区三区| 日本乱人一区二区三区| 香蕉av影视在线观看| 人妻激情图片视频小说| 国产在线一区二区三区麻酥酥| 内射久久久久综合网| 无码精品一区二区三区人| 婷婷色中文亚洲网68| 久久久久久9999久久久久| 天天做天天爽夜夜做少妇| 黄色资源视频网站日韩| 玖玖一区二区在线观看| 色天天天天射天天舔| 色婷婷久久久久swag精品| 含骚鸡巴玩逼逼视频| 99av国产精品欲麻豆| 国产在线免费观看成人| 插小穴高清无码中文字幕| 国产精品黄色的av| 六月婷婷激情一区二区三区| 亚洲欧美综合另类13p| 成年人的在线免费视频| 老司机你懂得福利视频| 99一区二区在线观看| 人妻最新视频在线免费观看| 黄色成年网站午夜在线观看| 亚洲综合一区二区精品久久| 国产午夜亚洲精品不卡在线观看| 97超碰国语国产97超碰| 欧美日韩情色在线观看| 亚洲人成精品久久久久久久| 国产精品一区二区av国| 男人靠女人的逼视频| 国产精品欧美日韩区二区| 日本最新一二三区不卡在线| 超碰97人人做人人爱| 93人妻人人揉人人澡人人| 在线国产日韩欧美视频| 福利午夜视频在线观看| 丰满的子国产在线观看| 天天色天天舔天天射天天爽 | 97色视频在线观看| 极品性荡少妇一区二区色欲| 中文字幕在线观看国产片| 青青在线视频性感少妇和隔壁黑丝 | 又色又爽又黄又刺激av网站| 五十路丰满人妻熟妇| 亚洲天堂精品福利成人av| av一本二本在线观看| 天天干天天日天天干天天操| 自拍偷拍vs一区二区三区| 社区自拍揄拍尻屁你懂的| 又粗又长 明星操逼小视频 | 精品一线二线三线日本| 91精品视频在线观看免费| 3344免费偷拍视频| 91免费黄片可看视频| 91精品国产综合久久久蜜| 久久www免费人成一看片| 久久久精品国产亚洲AV一| 老司机免费视频网站在线看| 天堂av在线播放免费| 国产91嫩草久久成人在线视频| 中文字幕在线观看极品视频| 亚洲高清一区二区三区视频在线| 91大神福利视频网| 女同互舔一区二区三区| 熟女少妇激情五十路| 天天日天天天天天天天天天天 | 日本熟妇色熟妇在线观看| 亚洲乱码中文字幕在线| 国产高潮无码喷水AV片在线观看| 熟女人妻三十路四十路人妻斩| 欲乱人妻少妇在线视频裸| 久久久久久久久久性潮| av久久精品北条麻妃av观看| 黑人大几巴狂插日本少妇| 亚洲av日韩av网站| 天天操天天弄天天射| 日韩少妇人妻精品无码专区| 91啪国自产中文字幕在线| 国产大鸡巴大鸡巴操小骚逼小骚逼| 日本美女性生活一级片| 亚洲图片欧美校园春色| 青娱乐蜜桃臀av色| 久精品人妻一区二区三区| 绯色av蜜臀vs少妇| 天堂女人av一区二区| 欧美一级视频一区二区| 亚洲人妻国产精品综合| 黄片大全在线观看观看| 搞黄色在线免费观看| 日本乱人一区二区三区| 骚逼被大屌狂草视频免费看| 99精品国产aⅴ在线观看| 日本熟女精品一区二区三区| 日比视频老公慢点好舒服啊| 国产janese在线播放| 91中文字幕最新合集| 51国产成人精品视频| 人妻丝袜av在线播放网址| 岛国一区二区三区视频在线| 色狠狠av线不卡香蕉一区二区| 日韩剧情片电影在线收看| 97超碰最新免费在线观看| 污污小视频91在线观看| 亚洲天堂第一页中文字幕| 亚洲男人在线天堂网| 欧美精品国产综合久久| 91在线免费观看成人| 日本丰满熟妇BBXBBXHD| 久久精品国产999| 性感美女福利视频网站| 日韩欧美一级aa大片| 白白操白白色在线免费视频| 色综合久久无码中文字幕波多| 免费岛国喷水视频在线观看| 宅男噜噜噜666国产| 国产视频一区二区午夜| 瑟瑟视频在线观看免费视频| 我想看操逼黄色大片| 国产精品大陆在线2019不卡| 91成人在线观看免费视频| 日韩影片一区二区三区不卡免费| 绝顶痉挛大潮喷高潮无码 | 久久精品国产23696| 欧美专区第八页一区在线播放 | 久久久超爽一二三av| 9国产精品久久久久老师| 亚洲av日韩精品久久久久久hd| 亚洲av色图18p| 黑人性生活视频免费看| 午夜精品福利一区二区三区p | 777奇米久久精品一区| 少妇高潮无套内谢麻豆| 日本精品一区二区三区在线视频。| 成年人啪啪视频在线观看| 中国视频一区二区三区| 中文字幕在线视频一区二区三区 | 精品久久久久久久久久久久人妻| 一区二区三区蜜臀在线| 久久国产精品精品美女| 57pao国产一区二区| 性感美女高潮视频久久久 | 1区2区3区4区视频在线观看| 888欧美视频在线| 日本免费视频午夜福利视频| 日本女人一级免费片| 北条麻妃av在线免费观看| 日本www中文字幕| 欧美久久一区二区伊人| caoporm超碰国产| 欧美80老妇人性视频| 亚洲成人情色电影在线观看| 老司机深夜免费福利视频在线观看| av网址在线播放大全| 黑人巨大精品欧美视频| 丰满的继坶3中文在线观看| 美女吃鸡巴操逼高潮视频| 又大又湿又爽又紧A视频| 欧洲日韩亚洲一区二区三区| 国产极品精品免费视频| 欧美一区二区三区啪啪同性| 中文字幕一区二区亚洲一区| av中文字幕网址在线| 久久人人做人人妻人人玩精品vr| 国产性色生活片毛片春晓精品| 91九色国产熟女一区二区| 在线国产中文字幕视频| 午夜激情久久不卡一区二区| 唐人色亚洲av嫩草| huangse网站在线观看| 亚洲欧美综合另类13p| 亚洲国际青青操综合网站| 久久久久久久精品成人热| 哥哥姐姐综合激情小说| 午夜激情久久不卡一区二区| 午夜精品一区二区三区城中村| 超级av免费观看一区二区三区| huangse网站在线观看| 男人靠女人的逼视频| 日韩欧美在线观看不卡一区二区| 国产日本欧美亚洲精品视| 成人动漫大肉棒插进去视频| 三上悠亚和黑人665番号| 亚洲av天堂在线播放| 色爱av一区二区三区| 色噜噜噜噜18禁止观看| 在线观看国产网站资源| 国产在线免费观看成人| av天堂中文字幕最新| 亚洲免费va在线播放| 宅男噜噜噜666国产| mm131美女午夜爽爽爽| 天天干天天爱天天色| 五月婷婷在线观看视频免费 | 91九色国产熟女一区二区| 亚洲 色图 偷拍 欧美| 美女福利视频网址导航| 2021久久免费视频| 日本熟妇一区二区x x| 熟女91pooyn熟女| 任我爽精品视频在线播放| 国产黄网站在线观看播放| 青青青青青免费视频| 宅男噜噜噜666国产| 超碰在线观看免费在线观看| 亚洲精品一区二区三区老狼| 亚洲综合一区二区精品久久| 姐姐的朋友2在线观看中文字幕 | 在线免费观看视频一二区| 丰满少妇人妻xxxxx| 国产免费av一区二区凹凸四季| 亚洲av无硬久久精品蜜桃| 九一传媒制片厂视频在线免费观看 | 国产一区av澳门在线观看| 好吊视频—区二区三区| av中文字幕在线导航| 日本av在线一区二区三区| 亚洲女人的天堂av| 亚洲国产成人在线一区| 91九色porny蝌蚪国产成人| 香蕉aⅴ一区二区三区| 动色av一区二区三区| 毛茸茸的大外阴中国视频| 黑人大几巴狂插日本少妇| 亚洲人妻30pwc| 欧美久久久久久三级网| 新97超碰在线观看| 高潮视频在线快速观看国家快速| 精品视频一区二区三区四区五区| 亚洲变态另类色图天堂网| 欧美久久一区二区伊人| 天天射,天天操,天天说| 91免费黄片可看视频| 播放日本一区二区三区电影| 任我爽精品视频在线播放| 久久久精品欧洲亚洲av| 欧美亚洲自偷自拍 在线| 亚洲综合自拍视频一区| 久久这里只有精品热视频 | 直接观看免费黄网站| free性日本少妇| 国产91嫩草久久成人在线视频| 青青青激情在线观看视频| 日本乱人一区二区三区| 欧美日韩精品永久免费网址| 十八禁在线观看地址免费| www天堂在线久久| 91精品国产91青青碰| 91免费观看在线网站 | 亚洲一级美女啪啪啪| 亚洲国产中文字幕啊啊啊不行了| 成人蜜臀午夜久久一区| 高潮视频在线快速观看国家快速 | 午夜福利资源综合激情午夜福利资 | av手机在线免费观看日韩av| 国产午夜福利av导航| 2022国产精品视频| 亚洲一区二区久久久人妻| 黑人乱偷人妻中文字幕| 78色精品一区二区三区|