资讯详情

资讯详情

Python练习手册:从环境搭建、语法基础到爬虫与打包

我见过太多人把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.11、py -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扩展装完扩展后CtrlShiftP打开命令面板输入“Python: Select Interpreter”选择你刚装的那个Python版本。这个动作的意义是告诉VSCode“我用哪个解释器来跑代码”。第二步在项目文件夹下新建一个.vscode目录里面加settings.json把Python路径固定下来避免换设备后失效。第三步用命令行进入项目目录创建虚拟环境python -m venv venvVSCode右下角一般会弹出提示询问是否切换解释器到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最核心的“动态类型”和“可迭代对象”这两个概念。我见过不少人跳过这种基础直接扑向爬虫结果在解析网页数据时因为str和int比较报错找不到原因最后回来补课。类型转换练习就像学骑车先学刹车——看起来很基础但它决定了你后面会不会摔跤。2.2 控制流和函数用“改需求”来练而不是“抄例子”if、for、while、def这些语法人人都能看懂但一到自己写就歇菜。原因在于看例子是“别人替你做了逻辑设计”而你自己写的时候最大的难点不是语法是把生活问题翻译成计算机逻辑的能力。有一个练习思路我百试不爽拿一个最简单的程序反复加需求每加一个需求你就在被迫使用一个新的语法点。比如一开始写“统计一个字符串中元音字母的数量”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, colorred, linewidth2) plt.axis(equal) plt.show()t从0变化到2π相当于一个点在圆周上绕一圈x和y的公式决定了它在不同角度时该落在什么位置最终描出爱心轮廓。你改一下系数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-importwin32timezone 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(stripTrue))练爬虫时我特别强调一个原则只请求公开的、允许抓取的数据并且查看网站的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(ascendingFalse) print(summary) # 画柱状图 summary.plot(kindbar, figsize(8, 5), colorskyblue) 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包含收盘价 closeindex为日期 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(times3)装饰器让被装饰的函数在抛出异常时自动重试3次。这个装饰器会对外层再包一层函数把你的参数times和原函数都处理好。能独立写出来装饰器这个知识点就算真正吃透了。6.2 多进程让计算密集型任务吃满CPUPython有一个常被提起的“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_workers4) as executor: results list(executor.map(heavy_calc, nums)) print(多进程耗时:, time.time() - start)在四核机器上多进程的版本通常会比串行快3倍以上。这个练习除了让你感受到性能提升还顺带理解了“任务提交”“结果分批返回”的并发编程基础。进阶可以再试一下as_completed实现“谁先完成谁先处理”的动态结果获取。如果以后你处理的是I/O密集型任务比如大量网络请求那应该用的不是多进程而是threading或asyncio。I/O等待时间太多线程切来切去反而更合适。能分清这两种场景并发编程就算入门了。6.3 SQLAlchemyORM操作数据库的项目化思路最后聊一下数据库。Python操作SQLite、MySQL这类数据库可以直接用SQL语句配合sqlite3或pymysql但那会让代码散落大量字符串拼接项目一复杂就难以维护。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_keyTrue) name Column(String) age Column(Integer) Base.metadata.create_all(engine) Session sessionmaker(bindengine) session Session() # 新增记录 session.add_all([User(nameAlice, age25), User(nameBob, age30)]) session.commit() # 查询记录 stmt select(User).where(User.age 26) for user in session.scalars(stmt): print(user.name, user.age)这个练习最值得理解的地方是“会话”这个概念session负责替你追踪对象的变化commit()时才统一把改动同步到数据库。你不需要手写INSERT INTO和SELECT WHERE只需要关心Python对象的状态。后面再做更复杂的多表关联、按条件更新、事务处理也都是在这一套框架上叠加。关于练习习惯最后再分享一点个人经验如果你从头读到这里会发现整篇文章讲的不是某个单独的技巧而是一套围绕“python练习”展开的成长路径环境搭建当第一个项目用最小验证法练语法用经典题培养逻辑用打包和数据类应用感受工程化再用装饰器、多进程、SQLAlchemy这些进阶主题把代码写得更像一个系统。在我带过的所有学习者里进步最快的那批人并没有特别高的天赋他们只是有一个共同习惯每天固定留出40分钟不干别的就打开编辑器写点东西。很多时候写的不是新知识而是把昨天写过的代码重新敲一遍然后换一个参数、改一个输入、故意制造一次报错。这种做法看起来笨拙但恰恰是这些“改来改去”的瞬间把被动理解变成了主动掌握。所以如果你看完这篇不用想着把它保存起来等以后再看。现在就去开一个终端把第一段李白打酒的代码敲一遍或者把一个字符小爱心的参数方程改到你自己觉得好看为止。跑起来比记住任何建议都重要。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →