Python编程练习:7个经典题目详解
分享7个Python编程练习题,涵盖循环、条件判断、算法等多个方面,适合初学者巩固Python基础。
一、数字密码锁模拟程序
题目描述
模拟一个数字密码锁的工作过程,规则如下:
1. 初始密码为四位数:1234
2. 用户有3次输入密码的机会
3. 每次输入后:
若密码正确,提示"密码正确,锁已打开"并结束程序
若密码错误,提示"密码错误,剩余X次机会"
若输入的不是四位数,提示"请输入四位数密码",不消耗尝试次数
4. 额外功能:
连续输错3次后,提示"密码错误次数过多,锁已锁定"
锁定后询问是否重置(y/n),输入y则重新获得3次机会,输入n则退出程序
Python源代码
# 初始设置
correct_password = "1234"
attempts_left = 3
is_locked = False
print("=== 数字密码锁模拟程序 ===")
print("初始密码为四位数,您有3次尝试机会")
while True:
# 检查是否已锁定
if is_locked:
reset_choice = input("密码错误次数过多,锁已锁定。是否重置?(y/n): ")
if reset_choice.lower() == 'y':
attempts_left = 3
is_locked = False
print("锁已重置,您有3次新的尝试机会")
continue
else:
print("程序退出")
break
# 获取用户输入
user_input = input(f"请输入四位数密码(剩余{attempts_left}次机会): ")
# 检查输入是否为四位数
if len(user_input) != 4 or not user_input.isdigit():
print("请输入四位数密码")
continue # 不消耗尝试次数,重新输入
# 验证密码
if user_input == correct_password:
print("密码正确,锁已打开")
break # 密码正确,退出程序
else:
attempts_left -= 1 # 减少尝试次数
if attempts_left > 0:
print(f"密码错误,剩余{attempts_left}次机会")
else:
is_locked = True # 锁定密码锁
关键知识点:
while循环、输入验证、字符串处理、continue语句
二、猜数字游戏
题目要求
程序随机生成 1-20 的整数作为答案,玩家有 5 次猜测机会,规则如下:
用 for 循环控制 5 次猜测机会,每次输入猜测的数;
若猜对,打印 “恭喜!第 X 次猜对了” 并提前结束游戏;
若猜错,提示 “猜大了” 或 “猜小了”,并显示剩余次数;
5 次都猜错,打印 “游戏结束,正确答案是 XX”。
Python源代码
import random
# 随机生成答案(1-20的整数)
answer = random.randint(1, 20)
print("=== 猜数字游戏 ===")
print("我已经想了一个1-20之间的整数,你有5次机会来猜!")
# 使用for循环控制5次猜测机会
for attempt in range(1, 6):
# 获取玩家猜测
while True:
try:
guess = int(input(f"第{attempt}次猜测,请输入1-20之间的整数: "))
if 1 <= guess <= 20:
break # 输入有效,退出内层循环
else:
print("请输入1-20之间的整数!")
except ValueError:
print("请输入有效的整数!")
# 判断猜测结果
if guess == answer:
print(f"🎉 恭喜!第{attempt}次猜对了!")
break # 猜对了,提前结束游戏
elif guess < answer:
print(f"猜小了!剩余次数: {5 - attempt}")
else:
print(f"猜大了!剩余次数: {5 - attempt}")
# 如果是最后一次猜测且猜错了
if attempt == 5 and guess != answer:
print(f"💔 游戏结束,正确答案是 {answer}。")
关键知识点:
for循环、条件判断、random模块、break语句
三、ATM 机系统模拟程序
题目要求
模拟一个简易 ATM 机操作,功能包括:
登录验证:预设账号("123456")和密码("654321"),允许最多 3 次输入错误,超过则锁定(退出程序);
主菜单:登录后显示 “查询余额、存款、取款、转账、退出” 选项;
核心功能:
存款:输入金额(正整数),余额增加;
取款:输入金额(正整数),需判断是否≤余额,否则提示 “余额不足”;
转账:输入目标账号(非空)和金额(正整数),需判断金额≤余额,转账后余额减少;
查询余额:显示当前余额;
用 while 循环控制主菜单持续运行,输入 “退出” 则结束程序。
解题思路
登录阶段:用 while 循环控制登录次数(最多 3 次),for 循环可辅助计数,if 判断账号密码是否正确,错误次数达 3 次则退出;
初始化账户信息:余额(如 1000 元)、当前账号;
主菜单阶段:用 while True 循环持续显示选项,用户输入选项后,用 if/elif 分支执行对应功能;
各功能逻辑:
存款 / 取款 / 转账:用 if 判断输入金额是否为正整数(简化处理,假设输入合法),取款 / 转账需额外判断金额≤余额;
转账需验证目标账号非空(if target_account.strip() == "");
输入 “退出” 时,用 break 退出主循环,程序结束。
Python源代码
# 预设账户信息
correct_account = "123456"
correct_password = "654321"
balance = 1000 # 初始余额
transaction_history = [] # 交易记录
# 登录验证
print("=== ATM 机系统 ===")
login_attempts = 3
while login_attempts > 0:
account = input("请输入账号: ").strip()
password = input("请输入密码: ").strip()
if account == correct_account and password == correct_password:
print("登录成功!")
break
else:
login_attempts -= 1
if login_attempts > 0:
print(f"账号或密码错误,剩余{login_attempts}次尝试机会")
else:
print("错误次数过多,系统已锁定!")
exit()
# 主菜单
while True:
print("\n" + "="*20)
print(" 主菜单")
print("="*20)
print("1. 查询余额")
print("2. 存款")
print("3. 取款")
print("4. 转账")
print("5. 交易记录")
print("6. 退出")
choice = input("请选择操作 (1-6): ").strip()
if choice == "1": # 查询余额
print(f"当前余额: {balance}元")
elif choice == "2": # 存款
try:
amount = int(input("请输入存款金额: "))
if amount <= 0:
print("存款金额必须为正整数")
else:
balance += amount
transaction_history.append(f"存款: +{amount}元")
print(f"存款成功!当前余额: {balance}元")
except ValueError:
print("请输入有效的金额!")
elif choice == "3": # 取款
try:
amount = int(input("请输入取款金额: "))
if amount <= 0:
print("取款金额必须为正整数")
elif amount > balance:
print("余额不足!")
else:
balance -= amount
transaction_history.append(f"取款: -{amount}元")
print(f"取款成功!当前余额: {balance}元")
except ValueError:
print("请输入有效的金额!")
elif choice == "4": # 转账
target_account = input("请输入目标账号: ").strip()
if target_account == "":
print("目标账号不能为空!")
elif target_account == correct_account:
print("不能向自己转账!")
else:
try:
amount = int(input("请输入转账金额: "))
if amount <= 0:
print("转账金额必须为正整数")
elif amount > balance:
print("余额不足!")
else:
# 确认转账
confirm = input(f"确认向账号 {target_account} 转账 {amount} 元? (y/n): ").strip().lower()
if confirm == 'y':
balance -= amount
transaction_history.append(f"转账至 {target_account}: -{amount}元")
print(f"转账成功!当前余额: {balance}元")
else:
print("转账已取消")
except ValueError:
print("请输入有效的金额!")
elif choice == "5": # 交易记录
if not transaction_history:
print("暂无交易记录")
else:
print("交易记录:")
for i, record in enumerate(transaction_history, 1):
print(f"{i}. {record}")
print(f"当前余额: {balance}元")
elif choice == "6": # 退出
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入!")
关键知识点:
嵌套循环、菜单设计、金额验证、程序流程控制
四、统计1到n之间既是偶数又能被4整除的数
题目:
输入一个正整数 n,使用 while 循环统计 1 到 n 之间(含 n)所有 “既是偶数又能被 4 整除” 的数,并打印:
这些数的总和;
这些数的个数。
示例:输入 n=10,符合条件的数为 4、8,总和 12,个数 2。
Python源代码
# 获取用户输入
n = int(input("请输入一个正整数 n: "))
# 初始化变量
current_num = 4 # 直接从4开始,因为4是最小的符合条件的数
total_sum = 0
count = 0
# 使用 while 循环,每次增加4
while current_num <= n:
total_sum += current_num
count += 1
print(f"找到符合条件的数: {current_num}")
current_num += 4 # 下一个能被4整除的数
# 输出结果
print(f"\n统计结果:")
print(f"符合条件的数有 {count} 个")
print(f"这些数的总和是 {total_sum}")
关键知识点:
while循环、条件判断、累加计算
五、打印对称数字图案
题目:
输入一个正整数 k(2≤k≤5),使用 嵌套 for 循环 打印对称数字图案,规则:
共 k 行,第 i 行(从 1 开始)打印 i 个数字,数字从 1 递增到 i;
每行数字之间用空格分隔。
示例:输入 k=3,输出:
Python源代码
# 获取用户输入
k = int(input("请输入一个正整数 k (2≤k≤5): "))
# 验证输入范围
if k < 2 or k > 5:
print("k 必须在 2 到 5 之间")
else:
# 使用嵌套 for 循环打印图案
for i in range(1, k+1): # 控制行数,从1到k
for j in range(1, i+1): # 控制每行打印的数字个数
print(j, end=" ") # 打印数字,用空格分隔
print() # 换行
关键知识点:
嵌套for循环、打印格式控制
六、打印星号菱形图案
题目:
输入一个正整数 k(k 为奇数,3≤k≤7),使用 嵌套 for 循环 打印由星号(*)组成的菱形,菱形的对角线长度为 k。示例:输入 k=5,输出:
Python源代码
# 获取用户输入
k = int(input("请输入一个奇数 k (3≤k≤7): "))
# 验证输入是否为奇数且在范围内
if k < 3 or k > 7 or k % 2 == 0:
print("k 必须是 3 到 7 之间的奇数")
else:
# 打印上半部分(包括中间行)
for i in range(1, k//2 + 2): # 上半部分行数
# 打印空格
for j in range(k//2 - i + 1):
print(" ", end="")
# 打印星号
for j in range(2*i - 1):
print("*", end="")
print() # 换行
# 打印下半部分
for i in range(k//2, 0, -1): # 下半部分行数
# 打印空格
for j in range(k//2 - i + 1):
print(" ", end="")
# 打印星号
for j in range(2*i - 1):
print("*", end="")
print() # 换行
关键知识点:
数学计算、对称图案打印、循环控制
七、找零钱计算(最少硬币数)
输入商品价格 price(整数,0 < price < 100)和支付金额 payment(整数,payment ≥ price),计算找零金额并使用 最少硬币数 组合(硬币面额:1 元、5 元、10 元、20 元)。示例:找零 36 元,最优组合为 20+10+5+1(共 4 枚)。
Python源代码
# 输入商品价格和支付金额
price = int(input("请输入商品价格 (0 < price < 100): "))
payment = int(input("请输入支付金额 (payment ≥ price): "))
# 计算找零金额
change = payment - price
print(f"找零金额: {change}元")
# 硬币面额(从大到小)
coins = [20, 10, 5, 1]
coin_count = [0, 0, 0, 0] # 对应每种硬币的数量
remaining = change
# 计算每种硬币的数量
for i, coin in enumerate(coins):
coin_count[i] = remaining // coin
remaining %= coin
# 输出结果
coin_names = ["20元", "10元", "5元", "1元"]
combination = []
print("最优硬币组合:")
total_coins = 0
for i in range(4):
if coin_count[i] > 0:
print(f"{coin_names[i]}硬币: {coin_count[i]}枚")
total_coins += coin_count[i]
# 添加硬币到组合
for _ in range(coin_count[i]):
combination.append(coins[i])
# 输出组合和总数
if combination:
combo_str = "+".join(map(str, combination))
print(f"组合方式: {combo_str}")
print(f"总共需要 {total_coins} 枚硬币")
else:
print("无需找零")
关键知识点:
贪心算法、列表操作、整除和取余运算
学习建议
从简单开始:先理解每个题目的基本逻辑,再尝试自己编写代码
多实践:对于每个题目,尝试用不同的方法实现
理解原理:不仅要会写代码,还要理解背后的算法和逻辑
举一反三:基于这些题目,尝试设计类似的练习题目
题目涵盖了Python编程的基础知识点,通过练习可以显著提升编程能力。希望对你学习Python有所帮助!