在线代码运行BanShow Run

Python 练习题

10 道 Python 练习题,难度从打印输出到分组统计逐步递进,每题都附参考答案,可以直接在浏览器里运行验证,不需要本地环境。

打开 Python 运行器 →

下面每道题都可以直接在上面的编辑器里运行验证。「参考」是给卡住时看的,建议自己先写一遍。

1. 计算平均分并评级

给一组成绩,输出平均分(保留一位小数)和评级:≥90 优秀,≥80 良好,≥60 及格,否则不及格。

python
scores = [88, 92, 76, 95, 61]

# 参考
avg = sum(scores) / len(scores)
level = "优秀" if avg >= 90 else "良好" if avg >= 80 else "及格" if avg >= 60 else "不及格"
print(f"平均分:{avg:.1f},评级:{level}")

要注意:scores 为空时 sum(scores) / len(scores) 会抛 ZeroDivisionError,加一句 if not scores: print("没有成绩") 更稳。

2. FizzBuzz

打印 1 到 30,能被 3 整除打印 Fizz,能被 5 整除打印 Buzz,同时能被 3 和 5 整除打印 FizzBuzz,否则打印数字本身。

python
# 参考
for i in range(1, 31):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

要注意:判断顺序很关键。先判 3 再判 15,就永远轮不到 FizzBuzz。也可以写成 ("Fizz" if i % 3 == 0 else "") + ("Buzz" if i % 5 == 0 else "") or i。

3. 反转字符串并判断回文

输入一个字符串,输出反转结果,以及它是不是回文(正着读反着读一样)。

python
s = "上海自来水来自海上"

# 参考
print(s[::-1])                       # 切片步长为 -1 就是反转
print(s == s[::-1])                  # True

t = "Hello Python"
print(t.lower().replace(" ", "") == t.lower().replace(" ", "")[::-1])   # 忽略大小写和空格

要注意:s.reverse() 不存在(字符串不可修改),会报 AttributeError。reversed(s) 返回的是迭代器,要 "".join(reversed(s))。

4. 统计词频并按次数排序

给一段英文文本,统计每个单词出现的次数,按次数从多到少输出前 5 个。

python
text = "the quick brown fox jumps over the lazy dog the fox runs"

# 参考
from collections import Counter

counts = Counter(text.lower().split())
for word, n in counts.most_common(5):
    print(f"{word}: {n}")

不用 Counter 的写法:

python
text = "the quick brown fox jumps over the lazy dog the fox runs"

counts = {}
for w in text.lower().split():
    counts[w] = counts.get(w, 0) + 1
top = sorted(counts.items(), key=lambda kv: kv[1], reverse=True)[:5]
print(top)

5. 从 stdin 读取并求和

「输入 (stdin)」面板里填 3 和 10 20 30,第一行是数字个数,第二行是用空格隔开的数。

python
# 参考
n = int(input())
nums = list(map(int, input().split()))
print("个数:", n, "实际读到:", len(nums))
print("和:", sum(nums), "最大:", max(nums), "最小:", min(nums))

要注意:input() 返回的永远是字符串,input().split() 得到的是字符串列表,必须 map(int, ...) 才能求和,否则 sum() 会报 TypeError。

6. 生成九九乘法表

输出标准的九九乘法表,每行从 1×n 到 n×n。

python
# 参考
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i * j}", end="\t")
    print()          # 空的 print() 用来换行

对齐版:

python
for i in range(1, 10):
    print("".join(f"{j}×{i}={i * j:<2} " for j in range(1, i + 1)))

7. 学生成绩管理

用一个列表装字典,实现:添加学生、按分数排序、找出及格的人、按分数段统计人数。

python
students = [
    {"name": "小明", "score": 88},
    {"name": "小红", "score": 92},
    {"name": "小刚", "score": 59},
    {"name": "小美", "score": 76},
]

# 参考
students.append({"name": "小强", "score": 95})
students.sort(key=lambda s: s["score"], reverse=True)
print("排名:", [s["name"] for s in students])
print("及格:", [s["name"] for s in students if s["score"] >= 60])

bands = {"90+": 0, "80-89": 0, "60-79": 0, "不及格": 0}
for s in students:
    if s["score"] >= 90:
        bands["90+"] += 1
    elif s["score"] >= 80:
        bands["80-89"] += 1
    elif s["score"] >= 60:
        bands["60-79"] += 1
    else:
        bands["不及格"] += 1
print(bands)

8. 判断质数并列出区间内所有质数

python
# 参考
def is_prime(n):
    if n < 2:
        return False
    i = 2
    while i * i <= n:          # 只需试到 √n,比 range(2, n) 快得多
        if n % i == 0:
            return False
        i += 1
    return True

print([n for n in range(2, 100) if is_prime(n)])
print(is_prime(97), is_prime(100))

要注意:for i in range(2, n) 也能得到正确答案,但 n 很大时会很慢。用 i * i <= n 避免开方运算。

9. 简易计算器(读 stdin)

stdin 填三行:3、5、+,分别表示两个操作数和运算符,支持 + - * /。

python
# 参考
a = float(input())
b = float(input())
op = input().strip()

if op == "+":
    result = a + b
elif op == "-":
    result = a - b
elif op == "*":
    result = a * b
elif op == "/":
    result = a / b if b != 0 else None
else:
    result = None
    print("不支持的运算符:", op)

if result is None:
    print("无法计算")
else:
    print(f"{a} {op} {b} = {result}")

字典派发写法(更 Pythonic):

python
# 用字典替代一长串 if / elif;a、b、op 也可以换成 input() 读进来
a, b, op = 3.0, 5.0, "+"

ops = {"+": lambda x, y: x + y, "-": lambda x, y: x - y,
       "*": lambda x, y: x * y, "/": lambda x, y: x / y}

print(ops[op](a, b) if op in ops else f"不支持的运算符:{op}")

10. 猜数字游戏(读多行 stdin)

程序想一个 1 到 100 的数,每次从 stdin 读一个猜测,输出「大了 / 小了 / 猜对了」,猜对就结束。stdin 填 50、25、37、42。

python
# 参考
import random

random.seed(7)                  # 固定种子,方便反复测试
answer = random.randint(1, 100)
tries = 0

while True:
    try:
        guess = int(input("请猜:"))
    except EOFError:
        print("输入用完了,答案是", answer)
        break
    tries += 1
    if guess > answer:
        print(f"第 {tries} 次:{guess} 大了")
    elif guess < answer:
        print(f"第 {tries} 次:{guess} 小了")
    else:
        print(f"猜对了!用了 {tries} 次")
        break

要注意:真实的 random.randint 每次运行结果都不同,加上 random.seed(7) 才能保证可复现——这对写测试很重要。

换一门语言