1. Python作业(二)项目概述
刚接触Python编程的同学在完成基础语法学习后,往往需要一套能巩固核心概念的实践题目。这个作业包针对列表操作、函数封装、文件读写等Python核心技能设计了阶梯式训练任务,包含从基础到进阶的12个典型题目。我在实际教学中发现,通过这类结构化的练习,学生能快速跨越"看得懂代码但写不出来"的初级阶段。
2. 核心题目解析与实现思路
2.1 列表操作三连题
第一组题目聚焦列表的CRUD操作:
- 列表元素去重(保留原顺序)
- 合并两个有序列表并保持排序
- 统计列表中各元素出现频率
以去重问题为例,常见误区是直接用set()转换,这会破坏原有顺序。正确的解法是:
python复制def unique_list(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
这里利用集合查询O(1)特性提升效率,同时通过列表推导维持顺序。注意seen.add(x)始终返回None,所以条件判断能正常工作。
2.2 函数封装挑战题
第二组题目考察函数设计能力:
- 实现可配置分隔符的字符串拼接函数
- 编写支持异常处理的除法计算器
- 生成指定格式的乘法表字符串
对于除法计算器,需要处理两类异常:
python复制def safe_divide(a, b):
try:
return a / b
except ZeroDivisionError:
print("Error: 除数不能为零")
return float('nan')
except TypeError:
print("Error: 只支持数值类型")
return None
关键技巧:在数学计算函数中返回nan而非None,便于后续数值处理
2.3 文件处理实战题
第三组题目涉及文件IO:
- 统计文本文件词频并输出TOP10
- 实现CSV数据清洗管道
- 日志文件异常检测器
词频统计的优化方案:
python复制from collections import Counter
import re
def word_count(filepath):
with open(filepath, encoding='utf-8') as f:
words = re.findall(r'\w+', f.read().lower())
return Counter(words).most_common(10)
使用正则表达式\w+比split()更准确处理标点,Counter比手动字典统计更高效。
3. 进阶题目实现细节
3.1 面向对象编程题
设计一个银行账户类,要求:
- 支持存取款操作
- 记录交易历史
- 实现余额不足保护
python复制class BankAccount:
def __init__(self, name, initial_balance=0):
self.name = name
self._balance = initial_balance
self._transactions = []
def deposit(self, amount):
self._balance += amount
self._transactions.append(('deposit', amount))
def withdraw(self, amount):
if self._balance >= amount:
self._balance -= amount
self._transactions.append(('withdraw', amount))
return True
return False
@property
def balance(self):
return self._balance
注意用属性装饰器保护余额,避免直接修改。
3.2 算法优化题
实现并对比三种斐波那契数列算法:
- 递归解法
- 记忆化递归
- 动态规划
记忆化递归的典型实现:
python复制from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
使用lru_cache装饰器比手动维护缓存字典更优雅,maxsize=None表示不限制缓存大小。
4. 调试技巧与常见错误
4.1 典型报错排查指南
| 错误类型 | 可能原因 | 解决方案 |
|---|---|---|
| IndentationError | 混用空格和制表符 | 统一使用4个空格 |
| TypeError | 类型不匹配 | 检查变量类型(type()) |
| KeyError | 字典键不存在 | 使用dict.get()提供默认值 |
4.2 调试工具推荐
-
PDB调试器:
python复制import pdb; pdb.set_trace() # 设置断点常用命令:
- n(ext) 执行下一行
- s(tep) 进入函数
- l(ist) 查看上下文代码
-
日志调试法:
python复制import logging logging.basicConfig(level=logging.DEBUG) -
单元测试框架:
python复制import unittest class TestCases(unittest.TestCase): def test_add(self): self.assertEqual(1+1, 2)
5. 代码质量提升建议
5.1 PEP8规范要点
-
命名规范:
- 变量:lower_case_with_underscores
- 常量:ALL_CAPS
- 类名:CapitalizedWords
-
行长度:不超过79字符(文档字符串72字符)
-
导入顺序:
- 标准库
- 第三方库
- 本地模块
5.2 类型提示实践
python复制from typing import List, Tuple
def process_items(items: List[str]) -> Tuple[int, float]:
count = len(items)
avg = sum(len(i) for i in items) / count
return (count, avg)
使用mypy进行静态检查:
bash复制pip install mypy
mypy your_script.py
6. 项目扩展方向
- GUI版本开发:使用Tkinter/PyQt将控制台程序改为图形界面
- Web服务化:用Flask/Django暴露为REST API
- 性能优化:对计算密集型任务改用Cython/Numba加速
- 测试覆盖:使用pytest达到90%+测试覆盖率
例如将词频统计改为Web服务:
python复制from flask import Flask, request
app = Flask(__name__)
@app.route('/wordcount', methods=['POST'])
def word_count():
text = request.json.get('text', '')
words = re.findall(r'\w+', text.lower())
return dict(Counter(words))
这个作业包的设计关键在于题目之间的渐进式难度曲线,从基础语法到实际工程问题逐步过渡。在实际教学中,建议先完成70%基础题再挑战提高题,遇到问题时优先查阅Python官方文档而非直接搜索答案
