你需要掌握的核心能力
-
循环:for … in range(…)
-
容器:list / set
-
列表操作:索引、append
-
逻辑控制:布尔变量(flag)、break
-
常用库:random、statistics
-
格式化输出:"%.6f" % x
Task 1:Fibonacci 数列(前 N 项)
题目
递推:
xn=xn−1+xn−2,x0=x1=1x_n = x_{n-1} + x_{n-2},\\quad x_0=x_1=1xn=xn−1+xn−2,x0=x1=1
求前 N=20 项。
Solution 代码核心
N = 20
fib = [1, 1]
for i in range(2, N):
fib.append(fib[i-1] + fib[i-2])
print(fib)
你要会的点
-
fib = [1,1]:先把初始条件放进 list
-
range(2, N):从第 2 项开始算到第 N-1 项(Python 的上界不包含)
-
fib[i-1]、fib[i-2]:用索引拿到前两项
-
append(…):把新值加到 list 末尾
延伸/更优写法
1)用两个变量滚动更新(省内存,适合只要最后一项)
a, b = 1, 1
for _ in range(N-2):
a, b = b, a+b
2)生成器(generator)思路:边算边吐出
适合后面学迭代器时用。
Task 2:求 1000 以内所有素数(prime numbers)
Solution 代码核心
N = 1000
prime = [2]
for i in range(3, N):
isprime = True
for k in prime:
if k * k > i:
break
if i % k == 0:
isprime = False
break
if isprime:
prime.append(i)
print(prime)
你要会的点
-
prime=[2]:先存已知的第一个素数
-
双层循环:
-
外层 i:每个候选数
-
内层 k in prime:用已有素数去试除
-
-
% 取余:i % k == 0 说明能整除 → 不是素数
-
isprime(flag 思维):默认 True,一旦发现能整除就改 False
-
break:提前退出内层循环(不浪费时间)
重要延伸:效率优化(你考试/作业常用)
优化 :埃拉托色尼筛法(Sieve of Eratosthenes)
这是“求一堆素数”的经典最快思路之一(后面数值方法/算法很常见)。
Task 3:随机数列表 + 统计量(min/max/mean/median/std)
Solution 代码核心
from random import seed, random
from statistics import mean, median, stdev
N = 101
array = [random() for _ in range(N)]
print("The minimum is: %.6f" % min(array))
print("The maximum is: %.6f" % max(array))
print("The mean is: %.6f" % mean(array))
print("The median is: %.6f" % median(array))
print("The stddev is: %.6f" % stdev(array))
你要会的点
-
random():生成 [0, 1) 的随机浮点数
-
两种造 list 的方式:
-
循环 append
-
列表推导式(list comprehension):[random() for i in range(N)]
-
-
统计函数:
-
min(array), max(array):内置函数
-
mean, median, stdev:来自 statistics
-
-
输出格式:"%.6f" % x 保留 6 位小数
延伸:随机数的“可复现性”
你 import 了 seed 但没用上。
如果你希望每次运行得到一样的随机结果(实验可复现/写报告很重要):
seed(0) array = [random() for _ in range(N)]
细节补充(容易考/容易错)
-
statistics.stdev 默认是 样本标准差(分母 n-1),不是总体标准差。
-
N=101 是奇数,median 会更“干净”(正中间那一个)。
Task 4:找出 list 里所有重复出现的数字(返回“重复值集合”)
Solution 代码核心
from random import randrange
def find_duplicates(numbers):
seen = set()
duplicates = set()
for num in numbers:
if num in seen:
duplicates.add(num)
seen.add(num)
return duplicates
random_list = [randrange(9) for _ in range(15)]
print("Original list:", random_list)
print("Duplicates:", find_duplicates(random_list))
你要会的点
-
set():集合,特点是 不重复,查找 x in set 很快
-
两个集合:
-
seen:已经见过的元素
-
dup:重复出现过的元素(最终答案)
-
-
算法逻辑:
-
如果当前元素在 seen 里 → 加入 dup
-
无论如何都把当前元素加入 seen
-
写法改进(更 Pythonic)
直接遍历元素,不用下标:
def find_duplicates(numbers):
seen, dup = set(), set()
for x in numbers:
if x in seen: dup.add(x) seen.add(x) return dup
题目理解补充
-
返回的是 重复“值”的集合,不是重复出现的次数、也不是重复的索引。
-
randrange(9) 会生成 0~8(如果你想包含 9,应该用 randrange(10))。
这一整份练习的“考点总结”
range(a,b) 左闭右开;range(N) 最常用
list:索引、append、列表推导式
flag + break:写判断类算法(prime/搜索)非常常见
%:整除判断的核心工具
set:去重 + 快速 membership test(in)
常用标准库:random、statistics
格式化输出:%.6f 控制小数位,写报告很实用



