作为一名Python开发者,我经常看到初学者在条件判断和用户输入处理上遇到各种问题。今天,我将用最接地气的方式,带你彻底掌握这些核心概念。
想象你正在开发一个智能门禁系统。它需要判断:
这些"如果...就..."的逻辑,正是编程中条件判断的用武之地。没有条件判断的程序就像没有红绿灯的十字路口——迟早会出问题。
计算机最基本的判断只有两种结果:
python复制is_authenticated = True # 已认证
has_permission = False # 无权限
实际应用场景:
python复制# 用户登录状态检查
if is_authenticated and has_permission:
print("欢迎进入系统")
else:
print("请先登录或申请权限")
六大比较运算符是构建条件的基础:
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
| == | 等于 | 5 == 5 | True |
| != | 不等于 | 5 != 3 | True |
| > | 大于 | 10 > 5 | True |
| < | 小于 | 3 < 1 | False |
| >= | 大于等于 | 5 >= 5 | True |
| <= | 小于等于 | 4 <= 7 | True |
常见陷阱:
python复制# 错误:混淆赋值(=)和比较(==)
if user_age = 18: # 会报错
print("成年")
# 正确:
if user_age == 18:
print("成年")
python复制# 周末且天气好才去公园
is_weekend = True
is_sunny = True
go_to_park = is_weekend and is_sunny # True
python复制# 下雨或刮风就不出门
is_raining = False
is_windy = True
stay_home = is_raining or is_windy # True
python复制# 不是工作日就睡懒觉
is_weekday = False
can_sleep_in = not is_weekday # True
运算符优先级:
python复制# 清晰的括号使用
valid = (age >= 18) and (has_id or is_vip)
python复制username = input("请输入您的用户名:")
print(f"欢迎,{username}!")
重要特性:
常见转换函数:
| 函数 | 作用 | 示例 |
|---|---|---|
| int() | 字符串 → 整数 | int("25") → 25 |
| float() | 字符串 → 浮点数 | float("3.14") → 3.14 |
| str() | 任何类型 → 字符串 | str(100) → "100" |
实际案例:
python复制# 计算器应用
num1 = float(input("请输入第一个数字:"))
num2 = float(input("请输入第二个数字:"))
print(f"相加结果:{num1 + num2}")
python复制while True:
try:
age = int(input("请输入您的年龄:"))
if age > 0:
break
print("年龄必须大于0")
except ValueError:
print("请输入有效的数字!")
python复制temperature = 28
if temperature > 30:
print("天气炎热,注意防暑")
python复制age = 17
if age >= 18:
print("可以观看成人内容")
else:
print("内容受限,请家长陪同")
python复制score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
python复制is_member = True
purchase_amount = 1200
if is_member:
if purchase_amount > 1000:
discount = 0.2
elif purchase_amount > 500:
discount = 0.1
else:
discount = 0.05
else:
discount = 0
python复制def calculate_bmi():
try:
height = float(input("请输入身高(米):"))
weight = float(input("请输入体重(公斤):"))
bmi = weight / (height ** 2)
print(f"您的BMI指数:{bmi:.1f}")
if bmi < 18.5:
status = "偏瘦"
elif bmi < 24:
status = "正常"
elif bmi < 28:
status = "超重"
else:
status = "肥胖"
print(f"健康状态:{status}")
except ValueError:
print("请输入有效的数字!")
except ZeroDivisionError:
print("身高不能为0!")
python复制def is_leap_year():
year = int(input("请输入年份:"))
if (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0):
print(f"{year}年是闰年")
else:
print(f"{year}年不是闰年")
错误示例:
python复制if condition:
print("Hello") # 缺少缩进
解决方法:
常见错误:
python复制if 18 < age < 25: # 正确但可能不直观
pass
if age > 18 and age < 25: # 更清晰
pass
python复制def get_positive_number(prompt):
while True:
try:
value = float(input(prompt))
if value > 0:
return value
print("请输入正数!")
except ValueError:
print("请输入有效的数字!")
低效写法:
python复制if x > 0:
pass
if x > 10: # 已经隐含x>0
pass
高效写法:
python复制if x > 10:
pass
elif x > 0:
pass
python复制# 传统写法
if status == "active":
handle_active()
elif status == "pending":
handle_pending()
elif status == "expired":
handle_expired()
# 更优雅的写法
handlers = {
"active": handle_active,
"pending": handle_pending,
"expired": handle_expired
}
handlers.get(status, default_handler)()
python复制# 不推荐
def check_access(user):
if user.is_authenticated:
if user.has_permission:
if not user.is_banned:
return True
return False
# 推荐
def check_access(user):
if not user.is_authenticated:
return False
if not user.has_permission:
return False
if user.is_banned:
return False
return True
python复制def main_menu():
print("1. 开始游戏")
print("2. 设置")
print("3. 退出")
while True:
choice = input("请选择(1-3): ")
if choice == "1":
start_game()
break
elif choice == "2":
show_settings()
break
elif choice == "3":
exit_program()
break
else:
print("无效输入,请重新选择")
python复制def validate_form(data):
errors = {}
# 用户名验证
if not data.get("username"):
errors["username"] = "用户名不能为空"
elif len(data["username"]) < 4:
errors["username"] = "用户名至少4个字符"
# 密码验证
if not data.get("password"):
errors["password"] = "密码不能为空"
elif len(data["password"]) < 8:
errors["password"] = "密码至少8个字符"
return errors if errors else None
python复制def update_player_state(player):
if player.health <= 0:
player.state = "dead"
elif player.stamina < 10:
player.state = "exhausted"
elif player.is_attacking:
player.state = "attacking"
elif player.is_moving:
player.state = "moving"
else:
player.state = "idle"
python复制age = int(input("年龄:"))
print(f"[DEBUG] 用户输入年龄:{age}") # 调试输出
if age >= 18:
print("成年")
python复制def calculate_discount(age, is_member):
assert age >= 0, "年龄不能为负数"
assert isinstance(is_member, bool), "会员状态必须是布尔值"
if age >= 65 or is_member:
return 0.1
return 0
python复制import unittest
class TestAgeCheck(unittest.TestCase):
def test_adult(self):
self.assertTrue(is_adult(18))
self.assertTrue(is_adult(25))
def test_minor(self):
self.assertFalse(is_adult(17))
self.assertFalse(is_adult(0))
def test_invalid(self):
with self.assertRaises(ValueError):
is_adult(-5)
def is_adult(age):
if age < 0:
raise ValueError("年龄不能为负数")
return age >= 18
python复制# 传统写法
if age >= 18:
status = "成年"
else:
status = "未成年"
# 三元运算符写法
status = "成年" if age >= 18 else "未成年"
python复制# 当第一个条件为False时,and不会评估第二个条件
result = (x > 0) and (y/x > 2) # 安全,避免除零错误
# 当第一个条件为True时,or不会评估第二个条件
default = user_input or "默认值" # 用户输入为空时使用默认值
python复制# 检查列表中是否有正数
numbers = [-1, 0, 5, -3]
has_positive = any(n > 0 for n in numbers)
# 检查所有分数是否及格
scores = [75, 82, 90, 65]
all_passed = all(s >= 60 for s in scores)
掌握条件判断和用户输入处理是成为Python开发者的重要一步。这些概念看似简单,但在实际项目中会以各种复杂形式出现。建议多练习实际案例,逐步培养解决问题的思维模式。