1. 董付国老师Python小屋编程题171-180解析
作为一名长期关注Python教学的从业者,我注意到董付国老师的编程题系列在Python学习者中有着广泛的影响力。这个系列题目设计精巧,从基础语法到实际应用都有涉及,特别适合用来检验和提升Python编程能力。今天我们就来详细解析171-180这10道题目,不仅给出参考答案,更重要的是分析解题思路和背后的Python知识点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 编程题171:文件内容统计与分析
2.1 题目要求
这道题要求编写一个Python程序,统计指定文本文件中各单词出现的频率,并按照频率从高到低排序输出。
2.2 解题思路
这个题目考察了文件操作、字符串处理和字典使用等核心Python技能。我们需要:
- 使用open()函数读取文件内容
- 通过split()方法分割单词
- 利用字典统计词频
- 使用sorted()函数进行排序
2.3 参考代码与优化
python复制from collections import defaultdict
def word_frequency(file_path):
word_count = defaultdict(int)
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
words = line.strip().split()
for word in words:
word_count[word.lower()] += 1
sorted_words = sorted(word_count.items(), key=lambda x: x[1], reverse=True)
return sorted_words
提示:使用defaultdict可以避免判断键是否存在的麻烦,代码更简洁。对于大文件处理,建议逐行读取而非一次性读取全部内容。
3. 编程题172:矩阵转置与运算
3.1 题目解析
这道题要求实现矩阵的转置操作,并进行矩阵乘法运算。考察了Python中列表推导式和嵌套列表的操作。
3.2 核心实现
矩阵转置可以使用zip(*matrix)的巧妙方法:
python复制def transpose(matrix):
return [list(row) for row in zip(*matrix)]
矩阵乘法则需要三重循环:
python复制def matrix_multiply(a, b):
return [[sum(a[i][k]*b[k][j] for k in range(len(b)))
for j in range(len(b[0]))]
for i in range(len(a))]
3.3 性能优化建议
对于大型矩阵运算,建议使用NumPy库,其底层使用C实现,性能比纯Python实现快数十倍:
python复制import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
result = np.dot(a, b)
4. 编程题173:递归实现斐波那契数列
4.1 基础实现
这是经典的递归练习题:
python复制def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
4.2 性能问题与优化
上述实现存在严重的重复计算问题,时间复杂度为O(2^n)。可以使用记忆化技术优化:
python复制from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
4.3 迭代解法
对于大数计算,迭代解法更高效:
python复制def fib(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
5. 编程题174:面向对象设计 - 学生管理系统
5.1 类设计
这道题考察面向对象编程能力,需要设计Student类和管理系统:
python复制class Student:
def __init__(self, name, id, score):
self.name = name
self.id = id
self.score = score
def __str__(self):
return f"{self.id}: {self.name} - {self.score}"
class StudentManager:
def __init__(self):
self.students = []
def add_student(self, student):
self.students.append(student)
def find_by_id(self, id):
return next((s for s in self.students if s.id == id), None)
5.2 进阶思考
在实际项目中,我们可能还需要考虑:
- 使用SQLite或MySQL持久化存储
- 添加数据验证逻辑
- 实现成绩统计分析功能
6. 编程题175:多线程下载器实现
6.1 题目分析
这道题要求实现一个多线程下载器,考察了Python的多线程编程和网络请求。
6.2 核心代码
python复制import threading
import requests
def download(url, filename):
response = requests.get(url, stream=True)
with open(filename, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
def multi_download(url_list):
threads = []
for i, url in enumerate(url_list):
t = threading.Thread(target=download, args=(url, f"file_{i}.jpg"))
threads.append(t)
t.start()
for t in threads:
t.join()
6.3 注意事项
Python的多线程由于GIL限制,不适合CPU密集型任务,但对于I/O密集型任务(如下载)仍然有效。对于更复杂的下载需求,可以考虑:
- 添加进度条显示
- 实现断点续传
- 使用线程池控制并发数
7. 编程题176:装饰器实现函数执行时间统计
7.1 装饰器基础
装饰器是Python的高级特性,可以用来测量函数执行时间:
python复制import time
def timing(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} executed in {end-start:.4f}s")
return result
return wrapper
@timing
def long_running_func():
time.sleep(2)
7.2 进阶应用
装饰器还可以用于:
- 权限验证
- 日志记录
- 缓存结果
- 重试机制
8. 编程题177:正则表达式实战 - 数据清洗
8.1 题目场景
这道题要求使用正则表达式清洗一批混乱的数据,提取出有效的邮箱和电话号码。
8.2 正则模式
python复制import re
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
phone_pattern = r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b'
def extract_info(text):
emails = re.findall(email_pattern, text)
phones = re.findall(phone_pattern, text)
return emails, phones
8.3 正则优化技巧
- 对于复杂模式,使用re.VERBOSE标志增加可读性
- 预编译常用正则表达式提高性能
- 使用命名捕获组(?P
...)提高可维护性
9. 编程题178:生成器实现大数据处理
9.1 生成器优势
当处理大文件或大数据集时,生成器可以节省内存:
python复制def read_large_file(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.strip()
9.2 实际应用
python复制# 统计大文件行数
count = sum(1 for _ in read_large_file('huge.log'))
# 过滤数据
important_lines = (line for line in read_large_file('huge.log')
if 'ERROR' in line)
10. 编程题179-180:综合项目实战
10.1 题目179:爬虫实现
这道题要求编写一个简单的网页爬虫,可以使用requests和BeautifulSoup:
python复制import requests
from bs4 import BeautifulSoup
def simple_crawler(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
links = [a['href'] for a in soup.find_all('a', href=True)]
return links
10.2 题目180:数据分析与可视化
这道题要求对一组数据进行统计分析并绘制图表,可以使用pandas和matplotlib:
python复制import pandas as pd
import matplotlib.pyplot as plt
def analyze_data(data_file):
df = pd.read_csv(data_file)
df.describe().plot(kind='bar')
plt.savefig('analysis.png')
10.3 项目经验分享
在实际项目中,我们还需要考虑:
- 爬虫的robots.txt遵守和请求间隔
- 数据可视化中的图表类型选择
- 异常处理和日志记录
通过这10道编程题的详细解析,我们覆盖了Python编程的多个重要方面。每道题都展示了不同的Python特性和编程技巧,从基础语法到高级应用都有涉及。建议读者不仅要理解给出的解决方案,更要尝试自己先解决问题,然后再参考这里的实现,这样才能真正提高编程能力。
