下面每道题都可以直接在上面的编辑器里运行验证。「参考」是给卡住时看的,建议自己先写一遍。
1. 计算平均分并评级
给一组成绩,输出平均分(保留一位小数)和评级:≥90 优秀,≥80 良好,≥60 及格,否则不及格。
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,否则打印数字本身。
# 参考
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. 反转字符串并判断回文
输入一个字符串,输出反转结果,以及它是不是回文(正着读反着读一样)。
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 个。
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 的写法:
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,第一行是数字个数,第二行是用空格隔开的数。
# 参考
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。
# 参考
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i * j}", end="\t")
print() # 空的 print() 用来换行
对齐版:
for i in range(1, 10):
print("".join(f"{j}×{i}={i * j:<2} " for j in range(1, i + 1)))
7. 学生成绩管理
用一个列表装字典,实现:添加学生、按分数排序、找出及格的人、按分数段统计人数。
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. 判断质数并列出区间内所有质数
# 参考
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、+,分别表示两个操作数和运算符,支持 + - * /。
# 参考
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):
# 用字典替代一长串 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。
# 参考
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) 才能保证可复现——这对写测试很重要。