Python练习手册:从环境搭建、语法基础到爬虫与打包
2026/9/10 18:23:28 网站建设 项目流程

我见过太多人把Python学习变成了一部多集连续剧:第一集下载安装,第二集配环境变量,第三集打开教程,然后就停在进度条上不动了。这其实不是意志力的问题,而是学习方法从一开始就跑偏了——你把“python入门”当成了“看一本编程书”,但Python这门语言从诞生起就强调一件事:动手敲,敲完跑,跑出结果再继续改。

这篇内容不是给你复述一遍官方文档,也不是罗列“从入门到精通”的学习路线图,而是把我自己这些年带新人、带自己、带社群过程中反复用到的“python练习”思路完整拆开:从最容易被卡住的环境安装、VSCode配置和虚拟环境,到语法层面的类型转换、控制流练习,再到李白打酒这类经典题目、爱心代码这种可视化练手,最后聊到爬虫、数据分析、量化交易策略代码和打包成exe文件这条完整的提升路径。适合完全零基础的人当第一份实操手册,也适合那种“学过语法但一写就卡壳”的人调整自己的练习方式。

1. 环境搭建不是预习,是第一个练习项目——装Python、配环境、选编辑器

先说一个反常识的结论:环境搭建不应该被当成“学习前的准备工作”,它本身就是一次完整的python练习。很多教程把安装流程压缩成“下一步、下一步、完成”,导致新人一旦遇到问题,连问题出在哪都描述不清楚。而那些能顺畅跑代码的人,往往是因为他们在配环境阶段就把“路径”“解释器”“依赖包”这些概念磕明白了。

1.1 版本选择和安装里的关键细节

Python官网默认推荐的版本,这些年已经从3.7一路走到了3.12、3.13。我的建议很直接:新手上路不要追最新,也不要迷信“越老越稳定”,选当前主流生态最兼容的版本。什么算主流兼容?你看一下你准备用的第三方库(比如后面会聊到的pandas、OpenCV、PyInstaller)的发布时间,选它们已经正式支持的那个Python版本号,一般就不会踩wheel不兼容的坑。

Windows安装时有一个细节,我几乎每隔几天就要跟人重复一次:安装向导第一页最下方那个“Add Python to PATH”复选框,一定要勾上。很多人的python命令在cmd里输不了,80%的原因就是没勾这个。勾上之后,安装完成后重开一个命令行窗口,输入python --version,能正常回显版本号,说明Python已经被系统认识。

如果你需要在同一台Windows机器上装多个版本,不要把两个安装包先后无脑装进同一个默认目录。正确做法是安装时勾选“py launcher”组件,之后用py -3.11py -3.9这种命令区分不同版本。命令行输入py --list能列出当前机器上所有的Python版本,这是管理多版本最省心的方法,比手动改环境变量靠谱得多。

Linux系统安装Python又是另一种场景。优先用发行版自带的包管理器,比如Debian/Ubuntu上执行sudo apt install python3 python3-venv python3-pip。但如果发行版仓库里的版本太旧,或者你就是想用一个指定版本(比如CentOS上默认2.7,想用3.x),那就得走源码编译:下载源码包,./configure --enable-optimizations && make -j$(nproc) && sudo make install。这个过程会编译十来分钟,不要以为是卡死了。编译完之后注意,系统的python可能还是老版本,要用python3.11这样的全名去调用。

这里补一句我做过的测试:源码编译时加--enable-optimizations,版本运行速度能提升5%~10%,代价是编译时间翻倍。如果机器性能一般,不加这个参数也完全能用。

1.2 环境变量不是洪水猛兽,它是系统的小区门禁

很多人一听到“环境变量配置”就头皮发麻,其实它的原理特别简单。你把操作系统想象成一个小区,各种程序就是小区里的住户,小区门口有一个门禁名单(PATH环境变量)。当你在命令行敲下一个名字,比如python,系统就去门禁名单上挨个查看:“这个程序登记在哪个单元?”名单里列出的目录,就叫环境变量。

所以配置Python环境变量的本质就一句话:把python.exe所在的目录加进系统的PATH名单。Windows上的路径一般是C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\,另外还有这个目录下的Scripts子目录(放pip和其他命令行工具)。安装时勾选Add to PATH,安装程序会自动帮你写进去。如果没勾,也可以手动加:右键“此电脑” -> 属性 -> 高级系统设置 -> 环境变量,在“系统变量”里找到Path,把上面两个目录追加进去。

改完环境变量的第一个大坑是:已经开着的cmd窗口不会刷新,必须重开一个。这个环节特别适合当作第一次练习来做——改完之后故意不开新窗口试试,看系统提示“不是内部或外部命令”,然后重开窗口,看到python版本号成功输出。这种“失败-修正-成功”的体验,比背十遍概念都有用。

1.3 编辑器选型:VSCode配置Python环境 vs PyCharm

编辑器这件事上,我的态度比较务实:新手先用VSCode,等写项目写多了,再去感受PyCharm。原因很简单,VSCode配置过程本身就是在练习“理解解释器、理解项目结构”这些概念,而且后面写爬虫、做数据分析、调接口,VSCode的轻量和终端集成更顺手。

VSCode配置Python环境的要点就三步。第一步,装官方Python扩展,装完扩展后Ctrl+Shift+P打开命令面板,输入“Python: Select Interpreter”,选择你刚装的那个Python版本。这个动作的意义是告诉VSCode:“我用哪个解释器来跑代码”。第二步,在项目文件夹下新建一个.vscode目录,里面加settings.json,把Python路径固定下来,避免换设备后失效。第三步,用命令行进入项目目录,创建虚拟环境python -m venv venv,VSCode右下角一般会弹出提示询问是否切换解释器到venv,选择“Yes”。

PyCharm相比之下更“包办”:New Project的时候自动创建venv、自动识别解释器,基本不用手动配置。代价是启动慢、占内存、社区版有些功能要手动补。如果你是学生,机器内存不算充裕,我建议还是从VSCode开始。等你哪天需要看项目级的调用关系、重构代码,再换PyCharm不迟。

2. 别背语法,用“最小验证法”把基础操作练成本能

“python基础”四个字劝退了很多人,因为它们被教材包装得太抽象。但我在实际练习里发现一个特别有效的策略:把语法点拆成几十个能被立刻验证的小实验,每个实验只要5分钟,跑完代码、看到结果、改一改再跑,语法就变成肌肉记忆了。这套方法我叫它“最小验证法”。

2.1 类型转换是天然的练习入口

热搜词里“python类型转换”能排那么高,是有道理的。因为类型转换是第一次能让你“感受到代码有反应”的操作。整数、浮点数、字符串、布尔值、列表、字典这些核心类型,互相转的时候规律极其鲜明。

我建议你把下面这组练习直接抄走,逐个跑一遍:

# 字符串和数字互转 price = "49.9" real_price = float(price) + 1.0 print(real_price, type(real_price)) # 布尔值的特殊之处 print(bool(0), bool(1), bool(""), bool(" "), bool([]), bool([1])) # 列表和字符串的拆与合 letters = list("hello") print(letters) print("".join(letters)) print("-".join(letters)) # 字典的视图转换 d = {"name": "Python", "age": 33} print(list(d.keys())) print(list(d.values())) print(list(d.items()))

跑完之后别急着关,试着回答几个问题:为什么bool(" ")是True?为什么float("49.9")能成功,而int("49.9")会报错?当你把list("hello")拆成字符列表后,为什么"".join(letters)能拼回原字符串?这些问题全部答上来,你其实就已经理解了Python最核心的“动态类型”和“可迭代对象”这两个概念。

我见过不少人跳过这种基础,直接扑向爬虫,结果在解析网页数据时因为strint比较报错,找不到原因,最后回来补课。类型转换练习就像学骑车先学刹车——看起来很基础,但它决定了你后面会不会摔跤。

2.2 控制流和函数:用“改需求”来练,而不是“抄例子”

ifforwhiledef这些语法,人人都能看懂,但一到自己写就歇菜。原因在于,看例子是“别人替你做了逻辑设计”,而你自己写的时候,最大的难点不是语法,是把生活问题翻译成计算机逻辑的能力。

有一个练习思路我百试不爽:拿一个最简单的程序,反复加需求,每加一个需求,你就在被迫使用一个新的语法点。比如,一开始写“统计一个字符串中元音字母的数量”:

def count_vowels(text): vowels = "aeiouAEIOU" count = 0 for ch in text: if ch in vowels: count += 1 return count print(count_vowels("Hello, Python Practice"))

然后加需求:不区分大小写统计,这个能练str.lower()。再加需求:返回每个元音分别出现了几次,这个能练字典。再加需求:从命令行参数传入字符串而不是写死在代码里,这个能练sys.argv。再加需求:把统计结果写进一个文件,这个能练文件读写。一个20行的小函数,延伸出四五个知识点,而且每一步都有可运行的结果做反馈,练习效率远高于看100页语法书。

函数这里特别强调一个练习习惯:每写一个函数,先用两组不同的输入跑它,一组是正常输入,一组是边界输入(空字符串、负数、超长文本)。能看到边界输入下报什么错,你对这个函数的行为才算真正了解。

2.3 读懂报错,才是练习的真正开始

我接触过大量Python初学者,他们面对报错的第一反应是“我写错了,我不行”,第二反应是把报错信息整段复制到搜索引擎里。这两种反应都不算错,但都漏掉了最重要的一步:先读一遍报错信息本身。

Python的Traceback通常包含四层信息:文件路径和行号、错误类型、错误描述、上方可能还有调用链。举个例子,TypeError: unsupported operand type(s) for +: 'int' and 'str'这句话,翻译过来就是“有个int类型的数和一个str类型的字符串做了加法运算”。它告诉你的不只是“这一行报错了”,还明确告诉你是哪两类值冲突了。这时候你应该回头去看代码里这两个变量是怎么被赋值出来的,然后再问搜索引擎。

为了提高读报错的能力,我推荐做一个有点“自虐”但极有效的练习:故意写一个会报错的程序,然后要求自己不看他人解答,只根据Traceback信息判断出错的行和原因。比如故意把count_vowels(123)传进去,看它报什么错;故意少打一个冒号,看报什么错;故意让函数返回None,再看调用的地方发生了什么。当你和报错信息混成了熟人,写代码的胆子会大很多。

3. 经典练习题拆解——从李白打酒到爱心代码

练习到了一定阶段,就需要一些“有点意思”的题目来激发动力。经典编程题和可视化小作品是我特别推荐的两个方向:前者练逻辑思维,后者练工程感和正反馈。这一章拆两个被问得最多的案例,一个是算法题“李白打酒”,一个是可视化“爱心代码”。

3.1 李白打酒:一道递推题的两种解法

“李白无事街上走,提壶去买酒。遇店加一倍,见花喝一斗。三遇店和花,喝光壶中酒。试问壶中原有多少酒?”这道题的关键是把文字理解成状态变化:初始有一壶酒,遇到店,酒量翻倍;遇到花,喝掉一斗。在“三遇店和花”的条件下,最后酒壶空了,求初始量。

最直观的解法是倒推。因为最后一次一定是“喝光壶中酒”,所以从0开始反向走:遇到花之前,壶里应该有1斗(因为喝了1斗才变成0);遇到店之前,壶里应该是当前量的一半(因为翻倍后才到当前量)。这段逻辑用代码写出来只有几行:

wine = 0.0 for i in range(3): # 先反推遇花:喝掉1斗之前酒量多1斗 wine += 1 # 再反推遇店:翻倍之前是当前一半 wine /= 2 print(wine)

运行结果就是0.875斗。除了倒推,还有一个锻炼“建模能力”的方法——正推加穷举。因为你不知道初始酒量,就设初始量为x,用for循环让x从0到10每0.001步增长,模拟“翻倍、减一”交替三次,看哪个初始值最终能刚好变成0。这个方法的优点是:不需要你推理出数学关系,只需要你把题目规则用代码如实翻译,让计算机帮你找答案。两种解法都推荐写一遍,对比一下它们的思路差异,这比单纯背答案有价值得多。

这个练习真正想让你体会的,是“状态变量”的思想:程序本质上就是在不断更新某些变量,让它们按规则演化。后年你写爬虫翻页、写量化策略计算净值、写游戏角色状态,都是在做同一件事:定义状态,然后按规则更新它。

3.2 爱心代码:用参数方程做出第一个可视化作品

“python爱心代码”这个搜索词,每年情人节前后都会火一次。但很多人拿到现成代码跑个图就结束了,完全没搞懂图是怎么画出来的。把爱心代码当成练习来做,你要关注的不只是最终画面,而是“参数方程”这个数学工具。

最常见的爱心形状,用参数方程描述是这样一组公式:

import numpy as np import matplotlib.pyplot as plt t = np.linspace(0, 2 * np.pi, 1000) x = 16 * np.sin(t) ** 3 y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t) plt.figure(figsize=(6, 6)) plt.plot(x, y, color="red", linewidth=2) plt.axis("equal") plt.show()

t从0变化到2π,相当于一个点在圆周上绕一圈,xy的公式决定了它在不同角度时该落在什么位置,最终描出爱心轮廓。你改一下系数16变成20,爱心会变宽;把13改成10,爱心会变扁。这就是练习的精髓:每次只改一个参数,观察画面如何变化,逐渐建立“代码参数对应视觉结果”的直觉。

如果你想在控制台里用纯文本画爱心,可以练练字符画逻辑:两层循环遍历行列坐标,判断每个坐标是否落在爱心方程内部,是就打*,否则打空格。这个练习能强化你对坐标系的理解,也是以后做ASCII艺术、做简易游戏的基础。

3.3 基础题库100题的高效刷法

网上一搜“python基础题库100题”,能出来一大堆现成的题单。拿来就刷当然可以,但刷题的方式决定了效果。我的建议是“三段式”:先把题目用自己第一反应的方法写出来,能跑通就算过;然后回去看一下这道题能不能用今天刚学的语法换一种写法,比如列表推导式替代循环;最后再改题面条件,给自己加一两个限制,比如原来让你统计单词出现次数,现在改成忽略大小写且排除标点,逼自己多写几行处理逻辑。

我经常跟人说,刷题数量不是目标,每道题沉淀下来的“解法篮子”才是。同一道“求斐波那契数列第n项”,用循环、用递归、用生成器、用矩阵快速幂,写出来的时间各不相同,但这恰恰是练习的进阶路径。你不需要在基础阶段把所有解法都掌握,但至少要意识到:同一个问题,永远存在不止一种实现方式。

4. python转exe——脚本变成程序的最后一公里

“怎么能把我的py文件发给朋友,让他不装Python也能直接跑?”这个问题出现的频率之高,让“python转exe文件”成为了常年热搜。本质上大家在问的是:如何把Python脚本打包成Windows可执行文件。这里我不只讲命令,还讲清楚原理和坑。

4.1 PyInstaller的基本用法,和你真正需要它做什么

.py转成.exe,目前最主流的工具是PyInstaller。它会读取你的脚本,分析里面import了哪些依赖,把Python解释器、依赖库和你的脚本一起打进一个可执行文件里。安装和基本用法非常简单:

pip install pyinstaller pyinstaller -F main.py

main.py同目录下运行之后,会生成dist/main.exe-F--onefile)的意思是把所有东西都合到一个exe文件里。如果不加-F,生成的是一个文件夹,里面有一堆dll和依赖文件,主程序藏在其中。单文件版本分享方便,但启动时需要先解压到临时目录,所以启动会稍微慢一些;文件夹版本启动快,但分发的时候得整个文件夹一起发。

这个工具的使用时机,我建议放在你写完一个有点完整性的小工具之后。比如你写了一个“批量整理桌面文件”的脚本,可以把同类型的后缀名归类到不同文件夹,那么在命令行里跑python organize.py和双击organize.exe完全是两种体验。后者让你第一次感受到“我做了一个程序”而不是“我运行了一段代码”。

4.2 打包的常见坑:启动慢、路径问题、依赖缺失

PyInstaller的坑,我踩过不少,挑几个高频的给你排一下雷。

第一个是启动慢。--onefile模式下,exe每次运行都会先把打包进去的库解压到系统临时目录,文件多了就会感觉卡顿。如果你特别在意启动速度,就改用文件夹模式pyinstaller main.py

第二个是路径问题。脚本里如果有with open("data.txt", "r")这类相对路径,在开发环境跑没问题,打包成exe后换到别的目录运行,可能就找不到文件了。这是因为相对路径是相对于“当前工作目录”的。解决办法是在代码里用os.path.dirname(__file__)sys.executable所在目录来拼绝对路径,你说不清文件会出现在哪,就让程序自己定位自己的家。

第三个是缺依赖。打包时最头疼的报错是ModuleNotFoundError: No module named 'xxx'。这个框在社区里经常以“要安装缺失的包以使用此工作流”的方式出现,意思是某个依赖没有被正确收集。解决思路是:手动执行pip install xxx,或者在PyInstaller的.spec文件中用hiddenimports显式声明这个模块。

pyinstaller -F --hidden-import=win32timezone main.py

这个参数的意思是“我确定需要这个模块,请你把它也打进去”。不要小看这一步,很多打包问题最后都用它解决。

4.3 依赖管理的正确姿势:虚拟环境+requirements.txt

聊打包就无法绕开一个话题:依赖管理。很多初学者在全局环境里装了一堆库,然后想打包某个脚本,PyInstaller可能会把一堆用不到的东西也打进去,导致exe体积巨大。更麻烦的是,不同项目依赖了同一个库的不同版本,全局环境根本没法共存。

所以,我强烈建议你每做一个项目就创建一个虚拟环境。虚拟环境可以理解成给每个项目单独开了一间“专属办公室”,你在里面安装的库不影响全局,全局的库也干扰不到它。创建和激活只需要三行命令:

python -m venv venv # Windows 激活 venv\Scripts\activate # Linux/macOS 激活 source venv/bin/activate

激活后,命令行提示符前缀会出现(venv),这时候安装的库都归这个环境管。等项目稳定了,用pip freeze > requirements.txt导出依赖清单,别人拿到这个文件后执行pip install -r requirements.txt,就能快速还原出一样的运行环境。如果你的项目在跑的时候提示缺包,错误提示里也会给出类似的命令建议,别愣住,那就是让你在对应的虚拟环境里安装依赖。

5. 数据分析和爬虫的练习路径——两个最容易出成果的方向

如果你已经把前面的基础语法和经典题练得差不多了,接下来最值得投入的两个方向就是爬虫和数据分析。它们之所以适合作为进阶练习,是因为反馈极其直接:爬虫能让你用Python跟真实世界的网站打交道,数据分析能把一堆杂乱的数据变成图表。两个方向组合起来,还能做出一个完整的数据处理流水线。

5.1 从requests和BeautifulSoup开始,安全又规范地练爬虫

爬虫的第一个知识点,是理解HTTP请求是什么。你在浏览器里输入网址、按下回车,本质上就是向服务器发出一次请求,服务器返回HTML内容。requests库做的就是这件事,让你用代码发请求而不是用浏览器:

import requests from bs4 import BeautifulSoup url = "https://example.com/public-list" resp = requests.get(url) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, "html.parser") items = soup.find_all("a", class_="item-title") for item in items[:10]: print(item.get_text(strip=True))

练爬虫时,我特别强调一个原则:只请求公开的、允许抓取的数据,并且查看网站的robots.txt规则。用代码去访问网页和用浏览器访问网页本质是一样的,但不应给目标网站造成访问压力,也不要抓取需要登录、需要授权的数据。这就好比你去图书馆看书,可以自由翻阅书架上的书,但不能把别人正在用的电脑占为己有。

爬虫的进阶方向是接口抓取。很多网站的数据不是直接写在HTML里,而是由前端JS通过Ajax请求从接口拿到的。你打开浏览器开发者工具的Network面板,能看到那些XHR请求的地址和参数。用requests按同样的方式请求接口,返回的往往是JSON,解析起来比HTML更方便。练这个能让你积累“POST接口”的调试经验:参数、请求头、会话Cookie,这些都是后端交互的基本功。

5.2 pandas和matplotlib:把数据变成图表的完整闭环

数据分析和可视化的核心工具,一个是pandas,一个是matplotlib。pandas处理表格数据,作用类似于Excel的自动化版本;matplotlib负责画图,包括折线图、柱状图、散点图等。

练习时从哪里拿数据?有几个公开的数据集网站可以下载CSV文件,也可以直接读取系统自带的样例数据。拿到数据之后,练习路径通常是:读取文件 -> 查看前几行 -> 做简单的清洗 -> 分组统计 -> 画图。我举个最简单的例子:

import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("sales_data.csv") print(df.head()) # 按产品分组统计销售额 summary = df.groupby("product")["amount"].sum().sort_values(ascending=False) print(summary) # 画柱状图 summary.plot(kind="bar", figsize=(8, 5), color="skyblue") plt.title("Sales by Product") plt.xlabel("Product") plt.ylabel("Amount") plt.tight_layout() plt.show()

很多人卡在这一步,是因为把pandas的语法当成新语言在背。我的建议是不要按教程的顺序学,而是带着问题去找答案:我想按某列分组,然后聚合另一列,我该怎么写?groupby()这个函数名已经暗示了答案。用“问题驱动”的方式练习,比通读一遍pandas文档高效得多。

可视化环节容易忽略两个细节:第一是plt.show()前最好加plt.tight_layout(),防止标题或标签被切掉;第二是中文显示问题,matplotlib默认字体不支持中文,图上会出现小方框,需要在代码里指定中文字体。这两个坑几乎每个新手都会遇到,提前知道能省不少时间。

5.3 量化交易策略代码:作为工程练习的真实场景

“python量化交易策略代码”能挂在热搜上,说明很多人对这一块有强烈好奇。我必须先把话说清楚:这里讲的是如何用Python组织一个策略策略的代码框架,是帮助你练习数据处理和多步骤流程编排,而不是投资建议。真正实操交易还涉及账户、风控、合规等一大堆事情,不是初学者用几行代码就能搞定的。

一个最简单的量化策略是“双均线交叉”:当短期均线上穿长期均线时,认为上涨趋势可能开始,于是买入;当短期均线下穿长期均线时,认为下跌趋势可能开始,于是卖出。用pandas可以这样写一个完整的回测骨架:

import pandas as pd # 假设df包含收盘价 close,index为日期 df["short_ma"] = df["close"].rolling(5).mean() df["long_ma"] = df["close"].rolling(20).mean() df["signal"] = 0 df.loc[df["short_ma"] > df["long_ma"], "signal"] = 1 df.loc[df["short_ma"] < df["long_ma"], "signal"] = -1 # 根据信号变化计算持仓变化:信号从0变1时买入,从1变-1时卖出 df["position"] = df["signal"].diff() # 计算策略收益 df["return"] = df["close"].pct_change() df["strategy_return"] = df["position"].shift(1) * df["return"] df["cumulative"] = (1 + df["strategy_return"]).cumprod()

这段代码虽然短,但它集中体现了三个关键练习点:rolling窗口函数、diff差分、shift移位。特别是shift(1),它解决了一个在回测中特别容易被搞晕的问题:当天的信号要用前一天确认后的持仓来交易,防止未来函数泄漏。你能把这几步逻辑想明白,说明对pandas的数据操作已经有了进阶理解。

6. 进阶练习——装饰器、多进程与SQLAlchemy

当你走过上述的路径,基础语法熟练了,数据处理也有感觉了,就该往“更像工程”的方向靠一靠。这个阶段我最推荐练习三个主题:装饰器,多进程,以及用SQLAlchemy操作数据库。这三个刚好对应一个日常项目里几乎躲不开的能力需求:复用逻辑、提升性能、持久化存储。

6.1 装饰器:不修改函数,却能给函数加功能

装饰器是Python里极有魅力、也极容易让初学者懵的概念。它的本质其实很简单:一个装饰器就是一个函数,这个函数接收一个函数作为参数,然后返回一个新的函数。当你写@timer修饰某个函数时,Python只是把那个函数当作参数传给timer,再把返回的结果重新赋值给原来的函数名。

我建议用计时器这个最经典的例子来入门:

import time def timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} took {end - start:.4f}s") return result return wrapper @timer def crawl_one_page(): time.sleep(1) return "data" crawl_one_page()

这个练习的收获不在于记住“装饰器的语法模板”,而在于理解闭包中的wrapper*args, **kwargs怎么把任意参数透传给原函数,以及返回值透传的重要性。如果你在装饰器里忘了return result,原函数的所有返回值都会变成None,这个bug很隐蔽,值得自己故意踩一次。

进一步的练习是给装饰器加参数。比如写一个@retry(times=3)装饰器,让被装饰的函数在抛出异常时自动重试3次。这个装饰器会对外层再包一层函数,把你的参数(times)和原函数都处理好。能独立写出来,装饰器这个知识点就算真正吃透了。

6.2 多进程:让计算密集型任务吃满CPU

Python有一个常被提起的“GIL锁”问题:同一时刻,一个Python进程内只能有一个线程执行Python字节码。所以在CPU密集型的场景(比如大量循环计算、数值运算)里,多线程并不能真正加速。想要充分利用多核CPU,正确的姿势是多进程。

练习多进程最推荐的入口是concurrent.futures.ProcessPoolExecutor,因为它的API特别简单,不需要手动管理进程池和通信。来看一个计算密集型任务的对照:

from concurrent.futures import ProcessPoolExecutor import time def heavy_calc(n): total = 0 for i in range(n): total += i ** 2 return total nums = [3_000_000, 3_000_000, 3_000_000, 3_000_000] start = time.time() results = list(map(heavy_calc, nums)) print("串行耗时:", time.time() - start) start = time.time() with ProcessPoolExecutor(max_workers=4) as executor: results = list(executor.map(heavy_calc, nums)) print("多进程耗时:", time.time() - start)

在四核机器上,多进程的版本通常会比串行快3倍以上。这个练习除了让你感受到性能提升,还顺带理解了“任务提交”“结果分批返回”的并发编程基础。进阶可以再试一下as_completed,实现“谁先完成谁先处理”的动态结果获取。

如果以后你处理的是I/O密集型任务,比如大量网络请求,那应该用的不是多进程,而是threadingasyncio。I/O等待时间太多,线程切来切去反而更合适。能分清这两种场景,并发编程就算入门了。

6.3 SQLAlchemy:ORM操作数据库的项目化思路

最后聊一下数据库。Python操作SQLite、MySQL这类数据库,可以直接用SQL语句配合sqlite3pymysql,但那会让代码散落大量字符串拼接,项目一复杂就难以维护。SQLAlchemy是Python里最流行的ORM(对象关系映射)库,它的核心思路是:把数据库里的表映射成Python类,把每一行数据映射成类的一个实例,这样你操作数据库的代码就变成了操作普通的Python对象。

搭建一个最小示例,用SQLite数据库存用户信息:

from sqlalchemy import create_engine, Column, Integer, String, select from sqlalchemy.orm import declarative_base, sessionmaker engine = create_engine("sqlite:///demo.db") Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer) Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() # 新增记录 session.add_all([User(name="Alice", age=25), User(name="Bob", age=30)]) session.commit() # 查询记录 stmt = select(User).where(User.age > 26) for user in session.scalars(stmt): print(user.name, user.age)

这个练习最值得理解的地方是“会话”这个概念:session负责替你追踪对象的变化,commit()时才统一把改动同步到数据库。你不需要手写INSERT INTOSELECT WHERE,只需要关心Python对象的状态。后面再做更复杂的多表关联、按条件更新、事务处理,也都是在这一套框架上叠加。

关于练习习惯,最后再分享一点个人经验

如果你从头读到这里,会发现整篇文章讲的不是某个单独的技巧,而是一套围绕“python练习”展开的成长路径:环境搭建当第一个项目,用最小验证法练语法,用经典题培养逻辑,用打包和数据类应用感受工程化,再用装饰器、多进程、SQLAlchemy这些进阶主题把代码写得更像一个系统。

在我带过的所有学习者里,进步最快的那批人并没有特别高的天赋,他们只是有一个共同习惯:每天固定留出40分钟,不干别的,就打开编辑器写点东西。很多时候写的不是新知识,而是把昨天写过的代码重新敲一遍,然后换一个参数、改一个输入、故意制造一次报错。这种做法看起来笨拙,但恰恰是这些“改来改去”的瞬间,把被动理解变成了主动掌握。

所以,如果你看完这篇,不用想着把它保存起来等以后再看。现在就去开一个终端,把第一段李白打酒的代码敲一遍,或者把一个字符小爱心的参数方程改到你自己觉得好看为止。跑起来,比记住任何建议都重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询