Python编程实战:100道核心练习题助你系统掌握语法与算法
很多Python初学者在学完基础语法后常常陷入“不知道下一步该练什么”的困境网上找的练习题要么太简单要么不成体系很难有效提升解决实际问题的能力。本文精心整理了100道覆盖Python核心语法与典型应用场景的实战练习题并附上详细解析与代码实现。无论你是刚入门的新手还是想巩固基础的开发者通过这一周的集中练习都能系统性地掌握列表操作、字符串处理、函数设计、文件IO等关键技能真正将知识转化为解决问题的能力。1. Python编程练习的核心价值与学习路径编程语言的学习绝不能停留在阅读和理解的层面。“动手练习”是连接理论知识与工程能力的唯一桥梁。对于Python这样一门以简洁和实用著称的语言通过大量练习来熟悉其语法特性和标准库用法显得尤为重要。1.1 为什么“刷题”对Python学习至关重要首先练习能帮助你内化语法。看懂了for循环的语法不代表你能熟练地在嵌套数据结构中运用它。只有亲手编写代码处理各种边界条件才能形成肌肉记忆。其次练习能让你熟悉标准库。Python的强大很大程度上源于其丰富的内置函数和标准库如os,json,collections,itertools。很多练习题会引导你使用这些工具让你在解决实际问题时能快速想到最优解。最后也是最重要的练习能培养你的计算思维和问题分解能力。面对一个复杂问题如“统计一篇英文文章中每个单词出现的频率”如何将其拆解为“读取文件”、“分割单词”、“清洗数据”、“计数”、“排序输出”等多个子任务并选择合适的数据结构字典和算法来实现这种能力只能在不断的实践中获得。1.2 如何高效使用这100道练习题不建议在一天内囫囵吞枣式地完成所有题目。更有效的方法是每日定量每天完成10-15题保持节奏。先思后码看到题目后先自己思考解决方案画出逻辑流程图或写下伪代码然后再动手编写。独立调试遇到错误先尝试根据报错信息自行排查这是提升调试能力的关键步骤。对比优化完成自己的版本后务必参考本文提供的解析和代码学习更优雅、更高效的实现方式。举一反三理解一道题后尝试修改需求或增加难度自己创造新的练习。下面我们将从环境准备开始逐步深入这100道经典练习题。2. 环境准备与工具推荐工欲善其事必先利其器。一个稳定、高效的开发环境能让你更专注于问题本身。2.1 Python解释器安装与验证本文所有代码基于Python 3.8版本编写大部分特性在Python 3.6及以上版本均可运行。安装步骤简述访问Python官网https://www.python.org/downloads/下载对应操作系统的安装包。安装时务必勾选“Add Python to PATH”将Python添加到环境变量这是后续在命令行中直接使用python命令的关键。安装完成后打开命令行Windows的CMD或PowerShellmacOS/Linux的Terminal输入以下命令验证python --version # 或 python3 --version如果正确显示版本号如Python 3.10.6则安装成功。2.2 代码编辑器与IDE选择对于练习阶段一个轻量级但功能强大的编辑器足矣。VS Code强烈推荐。免费、开源、插件生态丰富。安装Python扩展后能获得代码高亮、智能提示、调试、 linting等强大功能。PyCharm Community EditionJetBrains出品专为Python开发功能全面适合中大型项目但对初学者可能稍显复杂。Jupyter Notebook非常适合数据分析和交互式学习能分块运行代码并即时查看结果。2.3 创建练习项目建议为本次练习创建一个专属文件夹并在其中按章节或主题创建子文件夹来管理你的代码文件。# 在命令行中执行 mkdir python-100-exercises cd python-100-exercises # 可以使用以下结构可选 mkdir 01_basics 02_strings 03_lists 04_functions 05_files 06_oop 07_algorithms现在环境已经就绪让我们从最基础的题目开始挑战。3. 基础语法与数学运算第1-20题这一部分的题目旨在巩固变量、数据类型、运算符、条件判断和循环等最核心的语法。3.1 经典入门数字与计算题目1编写一个程序输入两个数字计算并输出它们的和、差、积、商保留两位小数。解析与实现这道题考察基本的输入输出和算术运算。注意输入的是字符串需要转换为数字除法运算要处理除数为零的情况输出格式可以使用f-string进行控制。# 题目1 解答 def basic_operations(): try: num1 float(input(请输入第一个数字: )) num2 float(input(请输入第二个数字: )) print(f{num1} {num2} {num1 num2}) print(f{num1} - {num2} {num1 - num2}) print(f{num1} * {num2} {num1 * num2}) if num2 ! 0: # 使用 format 控制小数位数 print(f{num1} / {num2} {num1 / num2:.2f}) else: print(f{num1} / {num2} 除数不能为零) except ValueError: print(输入错误请确保输入的是有效数字。) # 调用函数测试 if __name__ __main__: basic_operations()题目2判断一个年份是否为闰年。闰年规则能被4整除但不能被100整除或者能被400整除。解析与实现考察条件判断语句的灵活运用。关键在于将文字规则准确地转化为布尔表达式。# 题目2 解答 def is_leap_year(): try: year int(input(请输入一个年份: )) # 核心判断逻辑 if (year % 4 0 and year % 100 ! 0) or (year % 400 0): print(f{year}年是闰年。) else: print(f{year}年不是闰年。) except ValueError: print(输入错误请输入一个整数年份。) if __name__ __main__: is_leap_year()3.2 循环控制生成与判断题目3生成斐波那契数列的前N项。斐波那契数列前两项为0, 1从第三项开始每一项都等于前两项之和。解析与实现这是理解循环和列表更新的经典题目。需要注意初始条件的处理。# 题目3 解答 def fibonacci_sequence(): try: n int(input(请输入要生成的斐波那契数列项数 (N 0): )) if n 0: print(项数必须大于0。) return fib_list [] a, b 0, 1 # 前两项 for i in range(n): fib_list.append(a) a, b b, a b # 同时更新避免使用临时变量 print(f斐波那契数列前{n}项为: {fib_list}) except ValueError: print(输入错误请输入一个正整数。) if __name__ __main__: fibonacci_sequence()题目4找出100以内的所有质数素数。解析与实现质数是大于1的自然数且除了1和它自身外不能被其他自然数整除。最基础的算法是试除法。这里展示一个简单实现并引入math.sqrt进行优化因为一个数的因子如果存在必有一个小于等于其平方根。# 题目4 解答 import math def find_primes(limit100): primes [] for num in range(2, limit 1): is_prime True # 只需检查到 sqrt(num) 即可 for i in range(2, int(math.sqrt(num)) 1): if num % i 0: is_prime False break if is_prime: primes.append(num) return primes if __name__ __main__: primes find_primes(100) print(f100以内的质数有: {primes}) print(f共有{len(primes)}个。)4. 字符串操作与处理第21-40题字符串是Python中最常用的数据类型之一其内置方法非常丰富。4.1 字符串反转与回文判断题目21编写一个函数接收一个字符串返回其反转后的字符串。不能使用内置的[::-1]或reversed()。解析与实现考察对字符串遍历和拼接的理解。可以从末尾向前遍历也可以从中间交换字符。# 题目21 解答 def reverse_string_manual(s): 手动反转字符串 reversed_chars [] # 从最后一个字符开始向前遍历 for i in range(len(s) - 1, -1, -1): reversed_chars.append(s[i]) return .join(reversed_chars) # 用join拼接效率高于字符串累加 # 测试 test_str Hello, CSDN! print(f原始字符串: {test_str}) print(f手动反转后: {reverse_string_manual(test_str)}) print(f使用切片验证: {test_str[::-1]})题目22判断一个字符串是否是回文字符串正读反读都一样忽略大小写和非字母数字字符。例如“A man, a plan, a canal: Panama” 是回文。解析与实现这是一个综合题涉及字符串清洗去除无关字符、大小写转换和回文判断。# 题目22 解答 def is_palindrome(s): # 1. 清洗字符串只保留字母和数字并转换为小写 cleaned_chars [] for char in s: if char.isalnum(): # 判断是否为字母或数字 cleaned_chars.append(char.lower()) cleaned_str .join(cleaned_chars) # 2. 判断回文使用双指针法 left, right 0, len(cleaned_str) - 1 while left right: if cleaned_str[left] ! cleaned_str[right]: return False left 1 right - 1 return True # 测试 test_cases [ A man, a plan, a canal: Panama, race a car, 12321, hello ] for case in test_cases: result is_palindrome(case) print(f{case} 是回文吗 {result})4.2 字符串统计与格式化题目23统计一个字符串中每个字符出现的次数区分大小写并输出出现次数最多的字符及其次数。解析与实现使用字典来记录字符和其出现次数的映射关系这是此类统计问题的标准解法。# 题目23 解答 from collections import Counter # 也可以使用标准库的Counter这里展示手动实现 def count_characters(s): char_count {} for char in s: # get方法如果char在字典中返回其值否则返回默认值0 char_count[char] char_count.get(char, 0) 1 return char_count def find_most_common(char_count_dict): if not char_count_dict: return None, 0 # 使用max函数key参数指定排序依据根据字典的值 most_common_char max(char_count_dict, keychar_count_dict.get) most_common_count char_count_dict[most_common_char] return most_common_char, most_common_count # 测试 test_string programming is fun count_dict count_characters(test_string) print(字符统计结果:) for char, count in count_dict.items(): print(f {char}: {count}) common_char, common_count find_most_common(count_dict) print(f\n出现最多的字符是 {common_char}出现了 {common_count} 次。) # 使用 collections.Counter 的简洁写法 from collections import Counter counter_obj Counter(test_string) print(f\n使用Counter的结果: {counter_obj}) print(f最常见的字符: {counter_obj.most_common(1)})5. 列表、元组与字典进阶第41-60题列表和字典是Python中最灵活、最强大的数据结构必须熟练掌握。5.1 列表推导式与复杂操作题目41使用列表推导式生成一个10x10的乘法表二维列表。解析与实现列表推导式是Python的语法糖能简洁高效地生成列表。嵌套的列表推导式可以生成多维列表。# 题目41 解答 def multiplication_table(n10): # 外层推导式生成每一行内层推导式生成行内的每个元素 table [[i * j for j in range(1, n1)] for i in range(1, n1)] return table # 生成并打印 table multiplication_table() print(10x10乘法表:) # 格式化打印使输出对齐 for row in table: for num in row: print(f{num:4d}, end) # 每个数字占4位宽度 print() # 换行题目42给定一个列表去除其中的重复元素并保持剩余元素的原始顺序。解析与实现这是一个常见的面试题。简单的set()可以去重但会打乱顺序。我们需要一个既能去重又能保序的方法。# 题目42 解答 def remove_duplicates_preserve_order(lst): 去除列表重复项保持顺序 seen set() result [] for item in lst: if item not in seen: seen.add(item) result.append(item) return result # 测试 original_list [3, 5, 2, 5, 1, 3, 9, 2, 7, 5] unique_list remove_duplicates_preserve_order(original_list) print(f原始列表: {original_list}) print(f去重后列表: {unique_list}) # Python 3.7 中字典的键是保序的可以利用这一点更简洁 # 但为了清晰展示算法上面是通用解法。 unique_list_dict list(dict.fromkeys(original_list)) print(f使用dict.fromkeys去重: {unique_list_dict})5.2 字典的合并与深度操作题目43合并两个字典。如果键重复则第二个字典的值覆盖第一个字典的值。解析与实现在Python 3.5中可以使用{**dict1, **dict2}的语法。在Python 3.9中可以使用dict1 | dict2。我们也需要掌握通用方法。# 题目43 解答 def merge_dicts(dict1, dict2): 合并两个字典dict2的键值对覆盖dict1 # 方法1使用update方法原地修改dict1 # result dict1.copy() # 先复制避免修改原字典 # result.update(dict2) # return result # 方法2字典推导式 (Python 3.5) # return {**dict1, **dict2} # 方法3最直观的循环 result dict1.copy() for key, value in dict2.items(): result[key] value return result # 测试 dict_a {a: 1, b: 2, c: 3} dict_b {c: 30, d: 4, e: 5} merged merge_dicts(dict_a, dict_b) print(f字典A: {dict_a}) print(f字典B: {dict_b}) print(f合并后: {merged}) # Python 3.9 的简洁写法 # merged_new dict_a | dict_b # print(f使用 | 运算符合并: {merged_new})题目44将一个嵌套字典可能多层嵌套扁平化。例如输入{a: 1, b: {c: 2, d: {e: 3}}}输出{a: 1, b.c: 2, b.d.e: 3}。解析与实现这是一个递归或栈/队列应用的典型问题。我们需要遍历字典当值是字典时递归处理并将父键与子键用点号连接。# 题目44 解答 def flatten_dict(nested_dict, parent_key, sep.): 将嵌套字典扁平化 items [] for key, value in nested_dict.items(): new_key f{parent_key}{sep}{key} if parent_key else key if isinstance(value, dict): # 如果值是字典递归展开 items.extend(flatten_dict(value, new_key, sepsep).items()) else: items.append((new_key, value)) return dict(items) # 测试 nested { name: Alice, address: { street: 123 Main St, city: Wonderland, zipcode: { code: 12345, extension: 6789 } }, age: 30 } flat flatten_dict(nested) print(原始嵌套字典:) import pprint pprint.pprint(nested, width1) print(\n扁平化后字典:) pprint.pprint(flat)6. 函数设计与文件操作第61-80题函数是代码复用的基础文件操作则是与外部世界交互的必备技能。6.1 高阶函数与装饰器题目61编写一个计时装饰器用来测量任何函数的执行时间。解析与实现装饰器是Python的高级特性它允许在不修改原函数代码的情况下为函数添加新功能。time模块的time()或perf_counter()函数可用于计时。# 题目61 解答 import time import functools def timer_decorator(func): 计时装饰器 functools.wraps(func) # 保留原函数的元信息如名字、文档字符串 def wrapper(*args, **kwargs): start_time time.perf_counter() # 高精度计时 result func(*args, **kwargs) # 执行原函数 end_time time.perf_counter() elapsed end_time - start_time print(f函数 {func.__name__} 执行耗时: {elapsed:.6f} 秒) return result return wrapper # 使用装饰器 timer_decorator def example_slow_function(n): 一个模拟的耗时函数 sum 0 for i in range(n): sum i ** 2 return sum # 测试 if __name__ __main__: result example_slow_function(100000) print(f计算结果: {result})6.2 文件读取、写入与JSON处理题目62读取一个文本文件统计文件中每个单词出现的频率并将结果按频率降序写入一个新的JSON文件。解析与实现这道题综合了文件I/O、字符串处理、字典统计和JSON序列化。需要注意文件路径、编码、单词边界的处理简单的按空格分割可能不够。# 题目62 解答 import json import re from collections import Counter def count_words_in_file(filepath): 统计文本文件中单词的频率 word_counter Counter() try: with open(filepath, r, encodingutf-8) as file: for line in file: # 使用正则表达式找到所有“单词”由字母、数字、连字符、下划线组成 # 并转换为小写保证大小写不敏感 words re.findall(r\b[\w\-]\b, line.lower()) word_counter.update(words) except FileNotFoundError: print(f错误文件 {filepath} 未找到。) return None except Exception as e: print(f读取文件时发生错误: {e}) return None return word_counter def save_word_freq_to_json(word_counter, output_path): 将单词频率字典保存为JSON文件按频率降序排列 if not word_counter: return False # 将Counter转换为列表并按频率降序、单词升序排序 sorted_items sorted(word_counter.items(), keylambda x: (-x[1], x[0])) # 转换为有序字典列表便于JSON输出 result_list [{word: word, count: count} for word, count in sorted_items] try: with open(output_path, w, encodingutf-8) as json_file: json.dump(result_list, json_file, ensure_asciiFalse, indent4) print(f结果已成功保存到: {output_path}) return True except Exception as e: print(f写入JSON文件时发生错误: {e}) return False # 测试 (假设当前目录下有一个 test.txt 文件) if __name__ __main__: input_file test.txt # 请确保此文件存在或修改为你的文件路径 output_file word_frequency.json counter count_words_in_file(input_file) if counter: print(f共找到 {len(counter)} 个不同的单词。) print(出现频率最高的10个单词:) for word, count in counter.most_common(10): print(f {word}: {count}) save_word_freq_to_json(counter, output_file)题目63实现一个简单的日志记录器可以将不同级别的日志信息DEBUG, INFO, WARNING, ERROR同时输出到控制台和写入文件。解析与实现这是一个小型的设计题考察对类、文件操作和字符串格式化的综合运用。我们创建一个Logger类。# 题目63 解答 import datetime class SimpleLogger: 简单的日志记录器 LOG_LEVELS { DEBUG: 10, INFO: 20, WARNING: 30, ERROR: 40 } def __init__(self, name, log_fileNone, levelINFO): self.name name self.log_file log_file self.level self.LOG_LEVELS.get(level.upper(), 20) # 默认INFO def _log(self, level, message): 内部日志方法 level_num self.LOG_LEVELS.get(level, 0) if level_num self.level: return # 如果日志级别低于设置级别则不记录 timestamp datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) log_entry f[{timestamp}] [{level}] {self.name}: {message} # 输出到控制台 print(log_entry) # 输出到文件 if self.log_file: try: with open(self.log_file, a, encodingutf-8) as f: f.write(log_entry \n) except Exception as e: print(f写入日志文件失败: {e}) # 定义便捷方法 def debug(self, message): self._log(DEBUG, message) def info(self, message): self._log(INFO, message) def warning(self, message): self._log(WARNING, message) def error(self, message): self._log(ERROR, message) # 测试 if __name__ __main__: # 创建一个日志器记录到文件 app.log级别为 DEBUG logger SimpleLogger(MyApp, log_fileapp.log, levelDEBUG) logger.debug(这是一条调试信息。) logger.info(程序启动成功。) logger.warning(磁盘空间不足。) logger.error(连接数据库失败) print(\n--- 查看日志文件内容 ---) try: with open(app.log, r, encodingutf-8) as f: print(f.read()) except FileNotFoundError: print(日志文件尚未创建。)7. 面向对象编程与算法思维第81-100题最后一部分挑战性更强涉及类的设计、继承、特殊方法以及一些经典算法。7.1 类与对象的设计题目81设计一个BankAccount类模拟银行账户的基本操作包括开户、存款、取款、查询余额、显示账户信息。取款时需检查余额是否充足。解析与实现这是一个经典的OOP入门题。我们需要定义类的属性账号、户名、余额和方法各种操作。注意取款时的业务逻辑校验。# 题目81 解答 class BankAccount: 银行账户类 # 类属性用于生成自增的账号 _next_account_number 1000 def __init__(self, account_holder, initial_balance0.0): 初始化账户 self.account_number BankAccount._generate_account_number() self.account_holder account_holder self.balance initial_balance print(f账户 [{self.account_number}] 创建成功户主: {self.account_holder}初始余额: {self.balance:.2f}) classmethod def _generate_account_number(cls): 生成唯一的账号类方法 num cls._next_account_number cls._next_account_number 1 return num def deposit(self, amount): 存款 if amount 0: print(存款金额必须大于0。) return False self.balance amount print(f成功存入 {amount:.2f}。当前余额: {self.balance:.2f}) return True def withdraw(self, amount): 取款 if amount 0: print(取款金额必须大于0。) return False if amount self.balance: print(f取款失败。余额不足 (当前余额: {self.balance:.2f})。) return False self.balance - amount print(f成功取出 {amount:.2f}。当前余额: {self.balance:.2f}) return True def get_balance(self): 查询余额 return self.balance def display_info(self): 显示账户信息 print(- * 30) print(f账号: {self.account_number}) print(f户主: {self.account_holder}) print(f余额: {self.balance:.2f}) print(- * 30) def __str__(self): 定义对象的字符串表示 return fBankAccount({self.account_number}, {self.account_holder}, 余额: {self.balance:.2f}) # 测试 if __name__ __main__: # 创建账户 account1 BankAccount(张三, 1000) account2 BankAccount(李四, 500) # 操作账户1 account1.deposit(500) account1.withdraw(200) account1.withdraw(2000) # 应失败 account1.display_info() # 操作账户2 account2.deposit(300) account2.withdraw(100) print(f账户2的余额: {account2.get_balance():.2f}) # 测试 __str__ 方法 print(account1) print(account2)7.2 经典算法实现排序与查找题目82实现快速排序算法。解析与实现快速排序是一种高效的排序算法采用分治策略。其核心思想是选择一个“基准”元素将数组分为两部分一部分所有元素小于基准另一部分所有元素大于基准然后递归地对这两部分进行排序。# 题目82 解答 def quick_sort(arr): 快速排序 (递归实现) if len(arr) 1: return arr else: pivot arr[len(arr) // 2] # 选择中间元素作为基准 left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quick_sort(left) middle quick_sort(right) # 测试 if __name__ __main__: test_list [64, 34, 25, 12, 22, 11, 90, 88, 7, 19, 5] print(f排序前: {test_list}) sorted_list quick_sort(test_list) print(f排序后: {sorted_list}) # 验证 print(f排序是否正确 {sorted_list sorted(test_list)})题目83实现二分查找算法。给定一个已排序的列表和一个目标值返回目标值在列表中的索引如果不存在则返回-1。解析与实现二分查找是高效的查找算法时间复杂度为O(log n)。前提是列表必须有序。算法不断将查找区间对半分割并与中间值比较。# 题目83 解答 def binary_search(sorted_list, target): 二分查找 (迭代实现) left, right 0, len(sorted_list) - 1 while left right: mid (left right) // 2 mid_value sorted_list[mid] if mid_value target: return mid # 找到目标返回索引 elif mid_value target: left mid 1 # 目标在右半部分 else: # mid_value target right mid - 1 # 目标在左半部分 return -1 # 未找到 # 测试 if __name__ __main__: sorted_data [2, 5, 8, 12, 16, 23, 38, 45, 56, 72, 91] targets [23, 5, 100, 1, 72] for target in targets: index binary_search(sorted_data, target) if index ! -1: print(f目标值 {target} 在列表中的索引是: {index}) else: print(f目标值 {target} 不在列表中。)8. 常见问题与调试技巧在练习过程中你一定会遇到各种错误和问题。这里总结一些高频问题及其解决方法。8.1 语法与运行时错误排查问题现象常见原因解决思路SyntaxError: invalid syntax缺少括号、引号缩进错误使用了中文标点。仔细检查报错行附近的符号是否配对确保使用英文标点。IndentationError混用了空格和Tab进行缩进。在编辑器中设置“将Tab转换为空格”推荐使用4个空格。NameError: name xxx is not defined变量或函数名拼写错误或在定义前使用。检查变量名是否拼写正确确认其作用域是否在函数内定义却在外部使用。TypeError: can only concatenate str (not int) to str字符串与数字直接使用连接。使用str()函数将数字转为字符串或使用f-string格式化。IndexError: list index out of range访问列表的索引超出了有效范围如空列表访问[0]。在访问前检查列表长度if len(my_list) 0:。使用for item in list:遍历更安全。KeyError访问字典中不存在的键。使用dict.get(key, default_value)方法或先用key in dict判断。ZeroDivisionError除数为零。在进行除法运算前判断除数是否为零。FileNotFoundError文件路径错误或文件不存在。使用绝对路径或检查相对路径是否正确。使用os.path.exists()检查文件。8.2 逻辑错误与调试建议逻辑错误是最难发现的因为程序能运行但结果不对。使用print()调试在关键位置打印变量的值这是最简单有效的方法。使用断点调试在VS Code或PyCharm中设置断点可以逐行执行查看所有变量状态。缩小问题范围如果一段代码很长尝试注释掉一部分看剩余部分是否能正确运行逐步定位问题代码块。编写测试用例对于函数预先想好几组输入和预期输出包括边界情况用代码进行验证。阅读错误信息Python的错误信息通常很详细会指出错误类型和发生位置仔细阅读是第一步。9. 最佳实践与进阶学习建议完成这100道练习题后你已经打下了坚实的Python基础。为了成为一名更优秀的开发者请关注以下最佳实践9.1 代码风格与可读性遵循PEP 8这是Python的官方代码风格指南。使用工具如autopep8或black可以自动格式化代码。有意义的命名变量、函数、类名应清晰表达其用途如user_list而非ul。编写文档字符串为模块、类、函数编写文档字符串说明其作用、参数和返回值。保持函数单一职责一个函数只做一件事并且做好。这能提高代码的可测试性和复用性。9.2 性能与效率选择合适的数据结构列表适合顺序访问集合set用于快速成员检查字典dict用于键值映射。善用内置函数和库Python的内置函数如map,filter,sorted和标准库如collections,itertools通常由C实现比自己写的循环快得多。避免不必要的复制对于大列表切片操作list[:]会创建新副本消耗内存。理解时间与空间复杂度对于大数据处理学习基本的算法复杂度分析O(n), O(log n)等至关重要。9.3 下一步学习路线深入标准库系统学习os,sys,json,csv,datetime,collections,itertools,functools等常用模块。学习一个Web框架尝试用Flask或Django构建一个简单的网站理解HTTP、路由、模板、数据库ORM。学习数据分析生态掌握NumPy数组计算、Pandas数据处理、Matplotlib/Seaborn数据可视化。学习异步编程了解asyncio、aiohttp处理I/O密集型任务。参与开源项目在GitHub上寻找感兴趣的项目阅读代码尝试提交Issue或Pull Request。构建个人项目这是巩固知识的最佳方式。可以是一个爬虫、一个自动化脚本、一个小工具或一个Web应用。编程能力的提升没有捷径唯有多看、多写、多思考。这100道练习题是一个很好的起点但真正的成长来自于你将所学应用于解决真实世界的问题。