Python基礎指南之if條件判斷語句的三種基本結構詳解
一、開篇:程序為什么"聰明"
程序之所以能做出不同的反應,核心就在于條件判斷。用戶登錄了嗎?余額夠嗎?數據合法嗎?——每一個"如果…就…"的背后,都是if語句在工作。
條件判斷是編程中最基本也是最強大的控制結構。無論你的程序多么復雜,它本質上都是在做一系列的判斷和分支決策。今天這篇文章,我們就來學習Python中if條件判斷語句的三種基本結構,從語法基礎到最佳實踐,為后續(xù)的流程控制打下堅實的基礎。
# 程序就是無數個"如果...就..."
# 如果用戶已登錄 → 顯示主頁
# 如果余額足夠 → 完成支付
# 如果數據非法 → 返回錯誤提示
# Python中這一切都用 if 語句實現
if condition:
do_something()
學習if語句,本質上是在學習如何讓程序"思考"和"決策"。
二、if語句的第一種結構:單分支
2.1 基本語法
單分支if是最簡單的條件判斷結構——條件滿足就執(zhí)行,不滿足就跳過。
# 單分支 if 的基本語法
# if 條件:
# 代碼塊
age = 20
if age >= 18:
print("你已經成年了!") # 這行只在age>=18時執(zhí)行
print("可以獨立注冊賬號") # 這行同上
print("程序繼續(xù)執(zhí)行...") # 這行總是執(zhí)行
# 注意縮進!Python靠縮進來確定哪些代碼屬于if塊
# 上面兩個print縮進了,屬于if塊
# 最后一個print沒縮進,不屬于if塊
2.2 縮進規(guī)則詳解
Python使用縮進來定義代碼塊,這是Python最獨特的語法特征之一:
# 縮進規(guī)則
# 1. 用4個空格(或1個Tab,但推薦空格)
# 2. 同一代碼塊的所有語句縮進必須一致
# 3. if后面的冒號 : 不能省略
# ? 正確:統(tǒng)一用4個空格縮進
if True:
print("第一行")
print("第二行")
print("第三行")
# ? 也正確:冒號后面可以直接寫語句(不推薦)
if True: print("一行搞定")
# ? 錯誤:不一致的縮進
# if True:
# print("4個空格")
# print("6個空格") # IndentationError!
# ? 錯誤:忘記冒號
# if True # SyntaxError!
# print("xxx")
# ? 錯誤:需要縮進但沒縮進
# if True:
# print("xxx") # IndentationError!
2.3 if的"條件":真值測試
if后面的條件表達式會被隱式轉換為bool值:
# if后面的條件不需要顯式地寫 == True
# Python會自動對它做真值測試
# 下面兩種寫法等價:
if is_valid == True: # 不推薦的寫法
pass
if is_valid: # 推薦的寫法(簡潔)
pass
# 各種"真值"和"假值"在if中的表現
# 假值:False, None, 0, 0.0, "", [], (), {}, set()
# 真值:除假值外的所有對象
test_values = [
True, False, # 布爾值
None, # None
1, 0, -1, 0.0, 3.14, # 數字
"hello", "", " ", # 字符串
[1, 2], [], # 列表
(1,), (), # 元組
{"a": 1}, {}, # 字典
]
for v in test_values:
if v:
print(f"{v!r:15} → 真值 ?")
else:
print(f"{v!r:15} → 假值 ?")
2.4 if條件中的常見表達式
# 1. 比較表達式
score = 85
if score >= 60:
print("及格了")
# 2. 成員檢查
name = "張三"
if name in ["張三", "李四", "王五"]:
print("在名單中")
# 3. 身份檢查
result = None
if result is None:
print("沒有返回值")
# 4. 邏輯組合
age = 25
has_ticket = True
if age >= 18 and has_ticket:
print("允許入場")
# 5. 函數調用
def is_admin(user):
return user.get("role") == "admin"
user = {"name": "張三", "role": "admin"}
if is_admin(user):
print("歡迎,管理員!")
# 6. 字符串方法
email = "test@example.com"
if email.endswith(".com"):
print("商業(yè)郵箱")
# 7. 鏈式比較
x = 50
if 0 <= x <= 100:
print("x在合法范圍內")
# 8. 取反
is_banned = False
if not is_banned:
print("賬戶正常")
2.5 單分支的典型應用場景
# 場景1:輸入驗證
def process_age(age):
if age < 0 or age > 150:
print(f"?? 警告:年齡 {age} 無效,已調整為默認值")
age = 18
print(f"處理年齡: {age}")
return age
process_age(25) # 正常
process_age(-5) # 觸發(fā)警告
process_age(200) # 觸發(fā)警告
# 場景2:異常數據跳過
def clean_data(data):
"""清洗數據:跳過無效記錄"""
cleaned = []
for item in data:
if item is None or item == "":
continue # 跳過無效數據
cleaned.append(item)
return cleaned
# 場景3:日志記錄
def transfer_money(from_account, to_account, amount):
if amount > 10000:
print(f"?? 大額轉賬提醒: {amount}元") # 額外監(jiān)控
# 執(zhí)行轉賬...
print(f"轉賬 {amount} 元:{from_account} → {to_account}")
三、if語句的第二種結構:雙分支 if-else
3.1 基本語法
當條件滿足時做一件事,不滿足時做另一件事,用if-else:
# if-else 的基本語法
# if 條件:
# 條件為真時執(zhí)行的代碼塊
# else:
# 條件為假時執(zhí)行的代碼塊
age = 16
if age >= 18:
print("您可以進入網吧")
else:
print("未成年人不允許進入網吧")
# if 和 else 的縮進級別必須相同!
3.2 if-else 的經典應用
# 場景1:登錄驗證
def login(username, password):
correct_username = "admin"
correct_password = "123456"
if username == correct_username and password == correct_password:
print("? 登錄成功!歡迎回來")
return True
else:
print("? 用戶名或密碼錯誤")
return False
login("admin", "123456") # 成功
login("admin", "wrong") # 失敗
# 場景2:數據校驗
def validate_email(email):
if "@" in email and "." in email.split("@")[-1]:
print(f"? {email} 是有效的郵箱格式")
return True
else:
print(f"? {email} 格式不正確")
return False
validate_email("test@example.com") # ?
validate_email("invalid-email") # ?
# 場景3:奇偶判斷
def check_even_odd(n):
if n % 2 == 0:
print(f"{n} 是偶數")
return "even"
else:
print(f"{n} 是奇數")
return "odd"
# 場景4:文件存在性檢查
import os
def read_file_safe(filename):
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as f:
return f.read()
else:
print(f"?? 文件 {filename} 不存在")
return None
3.3 if-else 的嵌套
在if或else的代碼塊中,可以再包含if語句:
# if-else 嵌套結構
def check_number(n):
if n >= 0:
if n == 0:
print(f"{n} 是零")
else:
print(f"{n} 是正數")
else:
print(f"{n} 是負數")
check_number(10) # 正數
check_number(0) # 零
check_number(-5) # 負數
# 更復雜的嵌套
def classify_triangle(a, b, c):
"""三角形分類"""
# 先檢查是否為三角形
if a + b > c and a + c > b and b + c > a:
if a == b == c:
return "等邊三角形"
else:
if a == b or b == c or a == c:
return "等腰三角形"
else:
return "普通三角形"
else:
return "不是三角形"
print(classify_triangle(3, 3, 3)) # 等邊三角形
print(classify_triangle(3, 3, 4)) # 等腰三角形
print(classify_triangle(3, 4, 5)) # 普通三角形
print(classify_triangle(1, 2, 5)) # 不是三角形
注意:嵌套層級不宜過深。一般超過3層就應該考慮重構。
四、if語句的第三種結構:多分支 if-elif-else
4.1 基本語法
當有多個互斥的條件需要判斷時,使用if-elif-else:
# if-elif-else 的基本語法
# if 條件1:
# 條件1為真時執(zhí)行
# elif 條件2:
# 條件1為假且條件2為真時執(zhí)行
# elif 條件3:
# 條件1、2都為假且條件3為真時執(zhí)行
# ...
# else:
# 以上條件都為假時執(zhí)行
#
# elif 可以有任意多個
# else 是可選的
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"分數 {score} → 等級 {grade}")
4.2 執(zhí)行邏輯:從上到下,匹配即停
# if-elif-else 的核心執(zhí)行邏輯:
# 1. 從上到下逐個檢查條件
# 2. 第一個為True的條件對應的代碼塊被執(zhí)行
# 3. 后面的條件不會再檢查
# 用代碼證明
def demonstrate_elif_order(score):
"""演示elif的執(zhí)行順序"""
if score >= 90:
print(f"score={score} → 匹配了 >= 90")
elif score >= 80:
print(f"score={score} → 匹配了 >= 80")
elif score >= 60:
print(f"score={score} → 匹配了 >= 60")
else:
print(f"score={score} → 匹配了 else")
demonstrate_elif_order(95) # 只匹配第一個(>=90),不會輸出>=80
demonstrate_elif_order(85) # 只匹配>=80
demonstrate_elif_order(65) # 只匹配>=60
demonstrate_elif_order(55) # 匹配else
# ?? 條件順序非常重要!
# 如果把范圍最寬的條件放前面,后面的條件永遠不會被執(zhí)行
def bad_order(score):
"""錯誤的條件順序"""
if score >= 60: # 這個條件太寬!
print("及格")
elif score >= 90: # 永遠不會被執(zhí)行!因為>=90已經包含在>=60中
print("優(yōu)秀")
# ...
bad_order(95) # 輸出"及格"——預期應該是"優(yōu)秀"!
4.3 elif是else if的縮寫
# Python的 elif 等價于其他語言的 else if
# 但它更簡潔
# Python寫法
if a > 0:
sign = "正"
elif a < 0:
sign = "負"
else:
sign = "零"
# 等價于嵌套的 if-else(只是更冗長)
if a > 0:
sign = "正"
else:
if a < 0:
sign = "負"
else:
sign = "零"
# 顯然 elif 更清晰!
4.4 無需else的elif
有時你不需要兜底的else:
# 沒有else的if-elif
def get_discount(level):
"""根據會員等級返回折扣(非會員無折扣)"""
if level == "gold":
return 0.8 # 金卡8折
elif level == "silver":
return 0.9 # 銀卡9折
elif level == "bronze":
return 0.95 # 銅卡95折
# 沒有else——非會員返回None表示無折扣
return None
print(get_discount("gold")) # 0.8
print(get_discount("silver")) # 0.9
print(get_discount("normal")) # None
五、三種結構的選型指南
選型決策樹
問題:需要做條件判斷嗎?
├── 不需要 → 不用if
└── 需要
└── 有幾個分支?
├── 1個(條件滿足做,不滿足跳過)
│ → 用單分支 if
│ → 例:if error: log(error)
│
├── 2個(二選一)
│ → 用雙分支 if-else
│ → 例:if valid: process() else: reject()
│
└── 3個及以上(多選一)
→ 用多分支 if-elif-else
→ 例:評分等級、菜單選擇、權限級別
六、if語句的性能考量
6.1 條件的排列順序影響效率
# 把最可能命中的條件放前面
# 把計算量小的條件放前面
def classify_user_fast(user):
"""高效的條件排列"""
# 大多數用戶是普通用戶
if user.role == "normal": # 90%的用戶,放在第一
return "普通用戶"
elif user.role == "vip": # 8%的用戶
return "VIP用戶"
elif user.role == "admin": # 2%的用戶
return "管理員"
else:
return "未知"
# 利用短路求值優(yōu)化
def is_valid_user(user):
"""先檢查快的條件"""
# user存在是最快的檢查,放前面
if user is None or not user.get("active") or user.get("banned"):
return False
return True
6.2 字典映射替代長if-elif
當elif分支非常多且都是簡單的值映射時,考慮用字典:
# ? 長if-elif鏈
def get_status_text(code):
if code == 200:
return "成功"
elif code == 301:
return "永久重定向"
elif code == 302:
return "臨時重定向"
elif code == 400:
return "請求錯誤"
elif code == 401:
return "未授權"
elif code == 403:
return "禁止訪問"
elif code == 404:
return "未找到"
elif code == 500:
return "服務器內部錯誤"
else:
return "未知狀態(tài)碼"
# ? 字典映射(更簡潔、更快)
HTTP_STATUS = {
200: "成功",
301: "永久重定向",
302: "臨時重定向",
400: "請求錯誤",
401: "未授權",
403: "禁止訪問",
404: "未找到",
500: "服務器內部錯誤",
}
def get_status_text_v2(code):
return HTTP_STATUS.get(code, "未知狀態(tài)碼")
# 字典映射也支持函數
def handle_create():
return "創(chuàng)建操作"
def handle_delete():
return "刪除操作"
def handle_update():
return "更新操作"
OPERATIONS = {
"create": handle_create,
"delete": handle_delete,
"update": handle_update,
}
def execute(operation):
handler = OPERATIONS.get(operation)
if handler:
return handler()
else:
return "未知操作"
七、實戰(zhàn)案例
7.1 BMI計算器
def calculate_bmi(weight, height):
"""
計算BMI并給出健康建議
weight: 體重(公斤)
height: 身高(米)
"""
if height <= 0 or weight <= 0:
return "輸入數據無效"
bmi = weight / (height ** 2)
# 使用多分支if-elif-else評定等級
if bmi < 18.5:
category = "偏瘦"
advice = "建議增加營養(yǎng)攝入,適當增重"
elif bmi < 24:
category = "正常"
advice = "恭喜!您的體重在健康范圍內,請繼續(xù)保持"
elif bmi < 28:
category = "偏胖"
advice = "建議控制飲食,增加運動量"
elif bmi < 32:
category = "肥胖"
advice = "建議制定減重計劃,咨詢專業(yè)醫(yī)生"
else:
category = "重度肥胖"
advice = "?? 建議盡快就醫(yī),制定專業(yè)減重方案"
return {
"bmi": round(bmi, 1),
"category": category,
"advice": advice
}
# 測試
test_data = [
(45, 1.70), # 偏瘦
(65, 1.70), # 正常
(78, 1.70), # 偏胖
(90, 1.70), # 肥胖
(120, 1.70), # 重度肥胖
]
for weight, height in test_data:
result = calculate_bmi(weight, height)
print(f"體重={weight}kg 身高={height}m → "
f"BMI={result['bmi']}, {result['category']}")
print(f" 建議: {result['advice']}")
print()
7.2 簡易ATM取款機
class SimpleATM:
"""簡易ATM,演示if語句的三種結構"""
def __init__(self, balance=1000):
self.balance = balance
def withdraw(self, amount):
"""取款操作 —— 展示條件判斷的完整流程"""
# 單分支:檢查輸入有效性
if amount <= 0:
print("? 取款金額必須大于0")
return False
# 雙分支:檢查余額
if amount > self.balance:
print(f"? 余額不足!當前余額: {self.balance}元")
return False
else:
self.balance -= amount
print(f"? 取款成功!")
print(f" 取款: {amount}元")
print(f" 余額: {self.balance}元")
# 多分支:給額外的建議
if self.balance == 0:
print("?? 余額已為零,請及時充值")
elif self.balance < 100:
print("?? 余額不足100元,建議盡快充值")
elif self.balance > 5000:
print("?? 余額較多,注意資金安全")
return True
def deposit(self, amount):
"""存款操作"""
if amount <= 0:
print("? 存款金額必須大于0")
return False
else:
self.balance += amount
print(f"? 存款成功!存款: {amount}元, 余額: {self.balance}元")
return True
# 使用
atm = SimpleATM(1000)
atm.withdraw(300) # 正常取款
atm.withdraw(800) # 余額不足
atm.deposit(5000) # 存款
atm.withdraw(5800) # 大額取款
7.3 表單驗證器
class FormValidator:
"""表單驗證器 —— 多個if條件組合判斷"""
def __init__(self, data):
self.data = data
self.errors = []
def validate(self):
"""執(zhí)行驗證,收集所有錯誤"""
# 多個單分支if:不是互斥的,每個條件都檢查
if not self.data.get("username"):
self.errors.append("用戶名不能為空")
elif len(self.data.get("username", "")) < 3:
self.errors.append("用戶名至少3個字符")
if not self.data.get("password"):
self.errors.append("密碼不能為空")
elif len(self.data.get("password", "")) < 6:
self.errors.append("密碼至少6個字符")
if self.data.get("password") != self.data.get("confirm_password"):
self.errors.append("兩次輸入的密碼不一致")
email = self.data.get("email", "")
if email:
if "@" not in email:
self.errors.append("郵箱格式不正確")
elif "." not in email.split("@")[-1]:
self.errors.append("郵箱域名不完整")
else:
self.errors.append("郵箱不能為空")
# 返回驗證結果
if self.errors:
return False, self.errors
else:
return True, ["表單驗證通過"]
def is_valid(self):
"""快捷方法:是否驗證通過"""
# 單分支:利用 validate 的返回值
valid, _ = self.validate()
return valid
# 使用
form = FormValidator({
"username": "ab", # 太短
"password": "123", # 太短
"confirm_password": "1234", # 不一致
"email": "invalid", # 格式錯誤
})
valid, messages = form.validate()
if not valid:
print("? 表單驗證失?。?)
for msg in messages:
print(f" - {msg}")
else:
print("? 驗證通過")
八、常見錯誤與最佳實踐
8.1 常見錯誤
# 錯誤1:用 = 代替 ==
# if x = 10: # SyntaxError!
# print(x)
x = 10
if x == 10: # ? 正確
print(x)
# 錯誤2:忘記冒號
# if x > 0 # SyntaxError!
# print(x)
if x > 0: # ? 正確
print(x)
# 錯誤3:縮進不一致
# if x > 0:
# print("a")
# print("b") # IndentationError!
# 錯誤4:不必要的 == True/False
# ?
if is_valid == True:
pass
# ?
if is_valid:
pass
# ?
if is_valid == False:
pass
# ?
if not is_valid:
pass
# 錯誤5:條件順序不當
score = 95
# ? 永遠不會輸出"優(yōu)秀"
if score >= 60:
grade = "及格"
elif score >= 90:
grade = "優(yōu)秀"
# ...
# ? 從嚴格到寬松排列
if score >= 90:
grade = "優(yōu)秀"
elif score >= 60:
grade = "及格"
# ...
# 錯誤6:把字符串當作布爾
# ? if "active" or "pending": 總是True!
# 等價于 if "active":
status = "active"
if status == "active" or status == "pending": # ?
pass
# 或者
if status in ("active", "pending"): # ? 更好
pass
8.2 最佳實踐
# 實踐1:提前返回,減少嵌套
# ? 深層嵌套
def process_order_bad(order):
if order is not None:
if order.get("items"):
if order.get("user"):
if order["user"].get("verified"):
# 實際邏輯...
return "處理成功"
return "處理失敗"
# ? 提前返回(Guard Clauses)
def process_order_good(order):
if order is None:
return "訂單不存在"
if not order.get("items"):
return "訂單為空"
if not order.get("user"):
return "訂單無用戶信息"
if not order["user"].get("verified"):
return "用戶未驗證"
# 所有異常情況已處理,現在處理正常邏輯
return "處理成功"
# 實踐2:條件表達式扁平化
# ? 多重否定
if not (not is_banned):
pass
# ? 直接表達
if is_banned:
pass
# 實踐3:利用Python真值規(guī)則
# ? 顯式檢查長度
if len(items) > 0:
process(items)
# ? 直接利用真值測試
if items:
process(items)
# 實踐4:條件復雜時提取為函數
# ? 條件太長
if user.age >= 18 and user.is_verified and not user.is_banned and \
user.subscription_status == "active" and user.balance >= 100:
allow_access()
# ? 提取為函數
def can_access(user):
return (
user.age >= 18
and user.is_verified
and not user.is_banned
and user.subscription_status == "active"
and user.balance >= 100
)
if can_access(user):
allow_access()
九、本章小結
本文我們系統(tǒng)學習了Python if條件判斷語句的三種基本結構:
- 單分支 if:條件滿足時執(zhí)行,不滿足時跳過。適用于"需要時做額外處理"的場景,如日志記錄、異常數據過濾。
- 雙分支 if-else:二選一的分支結構。適用于"是A還是B"的二元決策,如驗證通過/失敗、登錄成功/失敗。
- 多分支 if-elif-else:多選一的分支結構。從上到下依次檢查條件,命中即停止。適用于等級評定、菜單選擇等多條件場景。
我們還學習了:
- Python的縮進規(guī)則及其重要性
- 真值測試的原理
- elif條件順序的影響
- 字典映射替代長if-elif鏈的優(yōu)化技巧
- 提前返回(Guard Clauses)減少嵌套的最佳實踐
if語句是編程中最基礎也最重要的控制結構。掌握好它,你就掌握了讓程序"思考"的能力。?? 下一篇文章,我們將深入學習if-elif-else多條件分支的高級用法和技巧!
到此這篇關于Python基礎指南之if條件判斷語句的三種基本結構詳解的文章就介紹到這了,更多相關Python if條件判斷語句內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
aws 通過boto3 python腳本打pach的實現方法
這篇文章主要介紹了aws 通過boto3 python腳本打pach的實現方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
使用Python開發(fā)你的第一個AI工具服務MCP Server
MCP(Model Context Protocol)是 Anthropic 推出的開放協(xié)議,讓 AI 模型能夠安全地連接外部數據源和工具,本文將帶你從零理解 MCP 協(xié)議,并用 Python 開發(fā)一個完整的 MCP Server,讓 Claude 等 AI 助手直接調用你編寫的工具,需要的朋友可以參考下2026-04-04
Flask使用Pyecharts在單個頁面展示多個圖表的方法
這篇文章主要介紹了Flask使用Pyecharts在單個頁面展示多個圖表的方法,在Flask頁面展示echarts,主要有兩種方法,文中給大家介紹的非常詳細,需要的朋友可以參考下2019-08-08
Django-simple-captcha驗證碼包使用方法詳解
這篇文章主要介紹了Django-simple-captcha驗證碼包使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11

