Python第六课:环境配置、虚拟环境与第一个数据可视化项目

发布时间:2026/9/26 17:40:14
Python第六课:环境配置、虚拟环境与第一个数据可视化项目 1. 前五课的通病装好了Python却跑不通第一个程序1.1 版本选择为什么我劝你装3.10以上而不是最新版很多新手学Python前五课都顺风顺水print(Hello World)会写了if/else会写了循环也能刷几个题了。可一到第六课想自己装个环境、跑个真实项目python不是内部或外部命令、pip装包报错、模块找不到一连串问题能把人打回原形。这一课我们先把环境这笔烂账算清楚。先说版本。打开python.org会发现当前稳定版已经到3.12甚至3.13了但我的建议是新手优先选3.10到3.12之间的版本不要盲目追最新。原因很简单——第三方库的适配速度永远慢半拍。数据分析常用的pandas、numpy爬虫常用的scrapy、lxml底层很多是C语言编译的二进制包新版本Python发布后这些库的官方预编译wheelWindows的.whl安装包往往要等好几个月才跟上。你装个3.13然后发现某个库死活装不上然后开始怀疑人生没必要。反过来也别再用3.6、3.7这种老版本。2021年以后这些版本陆续停止官方安全维护更关键的是新版的pandas、Django等库已经在源码里直接抛弃了对它们的支持你装完库就会看到类似requires Python 3.9的报错。选一个比主流慢半拍、但生态完全成熟的版本是最省心的策略。1.2 环境变量和pip大多数安装教程没讲透的部分Windows安装时那个Add Python to PATH的勾选框大概是被忽略次数最多的选项。它决定了你能否在命令行里直接敲python回车。如果当时没勾选有两个补救办法一是重装一遍勾上二是手动去系统环境变量里把Python安装目录比如C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\和它的Scripts子目录加进Path。装完之后验证安装一定不要只在IDLE里能跑就算成功。打开CMD或PowerShell敲下面的命令python --version能输出版本号说明基础环境通了。接着测试pip。重点来了新手最容易踩的坑不是pip不存在而是pip对应的Python版本不对——电脑里装了多个Pythonpip命令可能指向老的3.8而python指向新的3.11。这就导致你用python跑程序总报模块找不到用pip却总是装到了别的Python里。解决的办法是强制绑定以后所有安装命令都写成python -m pip install而不是裸的pip install。python -m pip的意思是用当前这个python解释器去执行pip模块这样装到哪一目了然永远不会装错地方。python -m pip install --upgrade pip python -m pip install requests pandas matplotlib国内网络环境下pip默认源下载慢是常态你可以临时加-i参数指定镜像比如清华大学源或阿里云源速度能快几十倍。1.3 虚拟环境没有被依赖问题毒打过的人不会懂等你会装的包多了就会遇到一个典型的版本地狱项目A要求requests版本不超过2.25项目B又必须用2.31以上的版本共存在同一个环境里就会互相拆台。这时候虚拟环境virtual environment就是你的隔离沙箱。Python自带的venv模块就能搞定不需要额外安装python -m venv venv这会在当前目录生成一个venv文件夹里面是一套独立的Python解释器和包管理空间。用之前需要激活Windowsvenv\Scripts\activatemacOS / Linuxsource venv/bin/activate激活后命令行前缀会出现(venv)这时候你再用pip安装的所有包都只属于这个项目跟全局环境无关。这是我在第五课就该强调、但直到第六课才来讲的必修课。记住了每个正经Python项目都应该有自己的虚拟环境。配环境时先建venv、再装依赖、最后跑代码三个步骤的顺序不要乱。1.4 编辑器二选一VSCode轻快PyCharm省心热词里VSCode配置Python和PyCharm配置Python环境都是高频搜索说明很多人卡在这一步。我的建议是二选一别折腾一堆编辑器。VSCode的配置流程是装好Python后去扩展市场搜索Python安装微软官方那套扩展包Pylance就是它自带的智能提示引擎然后按CtrlShiftP打开命令面板输入Python: Select Interpreter选择你刚刚建好的venv环境。做完这个动作编辑器右下角状态栏会显示当前解释器的路径这一步就是VSCode和Python之间的立约仪式。PyCharm这边用免费的Community版就够了。新建项目时在Base interpreter里选Python版本它会在项目里默认帮你建一个venv理论上开箱即用。但PyCharm启动慢、内存吃得多电脑配置一般的话跑个数据分析脚本都可能卡。我的倾向是如果你是纯零基础、懒得看命令行用PyCharm如果你希望养成对解释器、路径、环境的掌控感或者以后要搞Linux服务器部署就用VSCode从配置环境开始练手。2. 语法回炉把看得懂示例变成能自己造代码2.1 类型不是写出来的但心里要有数Python是动态类型语言x 5之后你再写x Hello解释器不会报错。这是灵活性但也是新手代码跑飞的根源。前五课你可能已经体会过那种语法没错运行报错的崩溃最常见的莫过于count 10 print(总数是 count)运行时报TypeError: can only concatenate str (not int) to str。字符串和数字不能用直接拼接这是Python中最经典的类型错误之一。正确做法是用f-string格式化count 10 print(f总数是{count})这行代码读作f后跟一个字符串花括号里放变量。它会在运行时自动把变量转成字符串嵌进去比那种总数是 str(count)的老写法清晰得多。我建议从第六课起所有涉及拼接输出的代码一律用f-string这不仅是习惯问题也决定了你能不能写出一眼能读懂的代码。2.2 数据结构选型列表、字典、元组、集合各有脾气过了会写变量这关就该认真对待四种内置容器了。它们分别对应不同的使用场景选错了会让代码又长又丑。列表list有序、可修改适合装按顺序排列的东西比如一周每天的销量。元组tuple有序、不可修改适合装本来就不该被改的东西比如坐标(x, y)、固定的配置项。字典dict通过键取值适合描述属性和值的映射关系比如用户ID对应姓名。集合set自动去重、支持快速判断在不在里面适合做成员检查。举个例子统计一串文字里每个词出现的次数用字典就非常自然text python python java python go go words text.split() counter {} for word in words: counter[word] counter.get(word, 0) 1 print(counter)这里dict.get(key, 0)是个高频技巧键存在就返回它的值不存在就返回默认值0。理解这个写法比背什么字典的标准操作更有用因为它是真实业务里每天都在用的逻辑。选对数据结构之后很多看起来要写十行if的任务其实三行就能解决。2.3 函数与异常组织代码的第一道分水岭前五课的练习大多几十行写在一个文件里还能忍。但第六课之后你会发现平铺直叙的代码开始失控同一个逻辑要复制三遍、改一处要改三处。这时候就该引入函数了。函数的第一原则是单一职责一个函数只干一件事干完通过return把结果交出来。别把读数据、清洗数据、画图、存文件全塞进一个函数里。另一个容易翻车的细节是默认参数的坑def add_item(item, bag[]): bag.append(item) return bag这看起来没问题但Python的默认参数只在第一次调用时创建一次之后每次调用都会复用一个列表结果就是上一次调用的残留物出现在下一次结果里。正确姿势是用None做哨兵def add_item(item, bagNone): if bag is None: bag [] bag.append(item) return bag异常处理也是一样很多人觉得try/except是出错了再来兜底其实它是控制流程的一部分。新手最常见的错误是写空except把异常吞掉导致程序不报错但结果明显不对。至少应该这样try: result 10 / int(user_input) except ValueError as e: print(f输入格式不对{e}) except ZeroDivisionError as e: print(f除数不能为0{e})把具体异常类型写出来才知道程序在哪一步、因为什么而失败。这比一出错就上网复制万能try except靠谱得多。2.4 内置函数的正确打开方式以abs()为例热词榜上赫然挂着python abs函数可见这个基础内置函数困扰了不少人。abs()是求绝对值的这没什么好说的但你可以借它学到一个重要的学习方法内置函数的文档描述永远比你想象的丰富。print(abs(-3)) # 3 print(abs(3 4j)) # 5.0没错abs()传入一个复数34j返回的是它的模——即实部平方加虚部平方再开根sqrt(3^2 4^2) 5.0。一个看似只服务于去掉负号的函数其实还支持复数运算。这说明Python内置函数的行为比直觉更宽泛正确的学习方式是翻开官方文档读一遍而不是靠猜。怎么系统了解内置函数在交互式环境里敲dir(__builtins__)能看到Python所有的内置对象对某个函数有疑问直接敲help(abs)看说明。第六课开始我强烈建议养成见一个函数查一次文档的习惯。这不是浪费时间而是构建你脑子里工具索引的过程。把abs()这种小函数吃透了后面学zip()、enumerate()、filter()时你会发现它们背后都有同一个逻辑用更少的字表达更明确的意思。3. 第一个拿得出手的小项目用Python做一份销售数据可视化报告3.1 项目从哪来别一上来就爬虫量化两头抓很多新手被爬虫可视化界面量化交易策略代码这种热词吸引恨不得第六课就开始爬小红书、抓股票。我劝你先冷静这两件事都有现实门槛一个涉及对方网站的反爬和合规边界一个涉及数据的真实性和策略的回测验证都不适合作为第一个项目。第一个项目最理想的选择是数据从哪来——本地结果是什么——一张图。比如假设你手头有一份自家小卖部或者社团活动的月度销售记录包含月份、销售额、订单量三列目标是用Python读出来做出一张月度销售趋势图和一张订单量柱状图。这个项目完整覆盖了读取数据→清洗数据→计算指标→可视化输出→保存结果的全流程难度刚好是第六课能驾驭的。先建虚拟环境然后安装两个库python -m pip install pandas matplotlibpandas负责表格数据的读取和处理matplotlib负责画图。这俩是数据分析和可视化热词背后的绝对主力但第一个项目里用到的只是它们10%的功能剩下的留给以后慢慢掘。3.2 数据准备CSV读取与清洗的真实工作用Excel或记事本准备一份sales.csv内容大致这样month,sales,orders 2024-01,12800,86 2024-02,11050,72 2024-03,15320,97 2024-04,14200,83 2024-05,16850,105 2024-06,17500,112注意用utf-8编码保存。真实世界中数据不可能这么干净但第一份练习数据干净一点可以把精力集中在流程上。读取和初步检查的代码import pandas as pd df pd.read_csv(sales.csv, encodingutf-8) print(df.head()) print(df.info()) print(df.describe())df.head()看前几行df.info()看每列的类型和非空数量df.describe()看数值列的统计特征。拿到数据先做这三件事是数据分析的固定开场。如果发现某列类型不对比如sales变成了字符串可以用df[sales] df[sales].astype(float)强制转换如果某行数据缺失用df.dropna()或df.fillna(0)处理。这里想强调一句数据清洗占数据分析工作量的七八成后面画图反倒是体力活。如果读取时遇到UnicodeDecodeError大概率是文件编码问题。Excel另存的CSV经常是gbk编码可以把encoding参数换成gbk试试如果用utf-8报错且文件带BOM头可以改成utf-8-sig。这个坑我帮别人排过无数次记下来能少白几根头发。3.3 可视化落地matplotlib从画出来到画好看有了DataFrame画图就顺理成章了。先做一个趋势图和柱状图合并展示的版本import matplotlib.pyplot as plt # 解决中文乱码先记住这行后面会细说 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 把月份列转成字符串列表作为x轴 months df[month].astype(str).tolist() sales df[sales].tolist() orders df[orders].tolist() # 创建一张图里面上下排两个子图 fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 8)) # 上图销售额折线趋势 ax1.plot(months, sales, markero, colorsteelblue, linewidth2) ax1.set_title(月度销售额趋势) ax1.set_ylabel(销售额元) ax1.grid(True, linestyle--, alpha0.6) # 下图订单量柱状图 ax2.bar(months, orders, colorcoral) ax2.set_title(月度订单量) ax2.set_xlabel(月份) ax2.set_ylabel(订单量单) plt.tight_layout() plt.savefig(sales_report.png, dpi150) print(报告已保存为 sales_report.png)这段代码有四个细节值得展开。第一plt.subplots(2, 1)创建的是两行一列的子图布局ax1和ax2分别是两个坐标轴对象之后所有设置都在对应的坐标轴上完成而不是用全局的plt.plot()。第二markero让折线的每个数据点都带一个小圆点否则你只能看到一条线很难定位具体数值。第三grid(True, linestyle--, alpha0.6)加的是半透明虚线网格有了它读者才能大致读出坐标值。第四最后用plt.savefig而不是plt.show因为生成图片文件才能往报告里放、往微信群里发。3.4 新人必踩的坑中文乱码、模块找不到、编码错误先说中文乱码。matplotlib默认字体不包含中文字形直接画图的话标题和坐标轴全是方框。前面那两行rcParams就是在全局替换默认字体。Windows上最常用SimHei黑体macOS可以用PingFang SCLinux可以写WenQuanYi Micro Hei。另外必须加axes.unicode_minus False不然负号会显示成方框。这两行记到笔记里每个新环境都要重新设置。再说模块找不到。如果你运行import pandas时报ModuleNotFoundError: No module named pandas这不是Python的问题而是你运行的python和你装包的python不是同一个。回到第1.2节的方法用python -m pip install pandas装完再用同一个窗口运行脚本大概率就好了。检查当前用的是哪个解释器VSCode看右下角状态栏PyCharm看设置里的Project Interpreter。最后说编码错误。写完脚本文件运行时报SyntaxError或者脚本里的中文在终端显示乱码通常是因为文件保存的编码和Python默认读取的编码不一致。Python 3的源码默认是utf-8所以代码文件务必用utf-8保存而不是系统的ANSI/gbk。VSCode右下角可以切换文件编码存成UTF-8最稳妥。4. 热搜词背后的学习路径爬虫、量化、爱心代码该怎么看4.1 爬虫的真相先学会和API打交道再谈解析网页Python爬虫和爬虫可视化界面是永远的热词。但爬虫世界有个残酷的真相大部分有价值的网页都做了反爬而新手最大的问题不是不会绕过反爬而是连HTTP请求和JSON解析都没搞懂就去硬啃各种绕过XXX的骚操作最后既浪费了时间也可能踩到合规的红线。我推荐的学习路径是先学会请求一个公开API应用程序编程接口。举个例子很多公共服务或开源网站会提供测试用的JSON数据接口你用requests.get()拿到数据再解析成Python字典这个过程和真实爬虫的请求解析完全一致却没有网页结构变动带来的脆弱性。代码长这样import requests resp requests.get(https://jsonplaceholder.typicode.com/posts, timeout10) resp.raise_for_status() data resp.json() print(len(data)) print(data[0][title])raise_for_status()的作用是如果HTTP请求返回4xx或5xx状态码就抛一个异常避免你拿着错误数据继续跑。resp.json()把响应内容直接解析成Python的列表和字典。等你熟练了这套请求→解析的模式再去看网页爬虫时无非是多加了从HTML里提取数据这一步用的是BeautifulSoup或lxml的select/find方法而已。还想提醒一句合规的事只请求公开的、无门槛的数据频率控制在合理范围不要给对方服务器造成压力。爬虫练手优先找官方公开API这是最稳妥也最能学到东西的路径。至于可视化界面其实就是把爬到的数据存进pandas然后复用第三课的绘图代码本质上是技能组合不是新技能。4.2 量化策略代码看热闹没问题别拿真钱开玩笑量化交易策略代码能成热搜本质上是大家对躺着赚钱有期待。但如果有人告诉你学会Python就能自动炒股千万别信。真实现状是量化交易是数据、策略、回测、风控四位一体的系统工程Python代码只是其中很小的一环。作为一个学习项目理解移动平均线交叉这类经典策略是没问题且有价值的。所谓双均线策略就是快线比如5日均线上穿慢线比如20日均线时买入下穿时卖出。用pandas实现import pandas as pd df[ma5] df[close].rolling(5).mean() df[ma20] df[close].rolling(20).mean() df[signal] (df[ma5] df[ma20]).astype(int) df[position] df[signal].diff() # 1表示买入确认-1表示卖出确认 print(df.tail())这段代码没有任何预测能力它只是计算指标、标记信号。真正的量化流程里接下来还有一大段路要走获取可靠的历史行情数据、设计回测框架、计算收益率曲线和最大回撤、考虑手续费和滑点、做参数寻优最后还要实盘小资金验证。任何一步没想清楚都可能血本无归。所以我强烈建议量化当学习项目没有问题但至少前半年请把学习策略逻辑和回测方法作为目标而不是企图马上赚钱。4.3 爱心代码与源码库抄代码的正确姿势python爱心代码的热度高得离谱。坦白说这类项目确实是很好的练习素材因为它的代码量小、反馈直观、还能发给朋友玩。网上流传最广的爱心代码用的是一个参数方程(x²y²-1)³ - x²y³ 0凡是满足这个方程的坐标点都落在爱心曲线上。用双循环遍历坐标网格打印出来就是这样for y in range(15, -15, -1): line for x in range(-30, 30): formula ((x * 0.05) ** 2 (y * 0.1) ** 2 - 1) ** 3 - (x * 0.05) ** 2 * (y * 0.1) ** 3 line 爱 if formula 0 else print(line)运行之后控制台会打出一个用爱字拼成的心形。仔细读这段代码你其实锻炼了三个能力循环嵌套的顺序感、把数学公式翻译成代码的能力、控制台字符排版的直觉。至于免费python源码大全我的建议是源码能看但别抄完就跑。抱大腿的正确姿势是——先运行起来看效果再逐行改参数看变化最后自己重写一遍简化版。比如拿到一个爬虫小项目先把它跑通试着把目标URL改成另一个网站把输出字段改掉再试着抽掉某个模块看程序会不会挂。这个过程叫在别人的代码上做实验比闷头造轮子效率高得多也比纯抄代码有价值得多。5. Linux环境从本机能跑到服务器能部署5.1 apt安装与源码编译怎么选热词里linux系统安装python被搜得很频繁。很多人在本机跑通了Python程序一上服务器就懵要么系统没装Python要么版本太老要么装完Python之后pip又出问题。Linux下装Python最常用的两条路是包管理器和源码编译。以Ubuntu为例直接sudo apt install python3 python3-pip最省事装完用python3 --version验证。优点是快缺点是你只能得到一个由发行版决定的版本比如Ubuntu 22.04默认是Python 3.10几年之内不会变。对于大多数跑脚本、部署小型工具的场景这个版本完全够用。但如果你的项目依赖新版Python才有的特性或者某些库的版本要求较高就需要源码编译安装wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz tar -zxvf Python-3.11.9.tgz cd Python-3.11.9 ./configure --prefix/usr/local/python311 --enable-optimizations make -j$(nproc) sudo make install编译前要确保系统装了build-essential、zlib1g-dev、libffi-dev、libssl-dev等依赖不然编译出来的Python可能没有完整的ssl模块pip也会用不了。--prefix参数指定安装路径到/usr/local/python311这一步很关键——它的含义是装进一个独立目录不碰系统原来的Python。5.2 多版本共存别再动系统的那个Python为什么强调不碰系统原来的Python因为Linux系统本身就有大量脚本依赖自带的Python。Ubuntu的apt和update-manager等系统工具都绑定了/usr/bin/python3你如果贸然把系统默认的python替换掉轻则软件中心打不开重则系统更新都跑不了。这是我亲眼见过的惨案排障花了整整一个下午。正确做法是让新装的版本另起炉灶。源码编译安装后/usr/local/python311/bin下面会有一个独立可执行文件想用哪个版本就显式指定哪个。给python3.11建一个软链接可以像这样sudo ln -s /usr/local/python311/bin/python3.11 /usr/local/bin/python3.11多版本并存时的核心纪律是每个项目都要建venv并且激活后再操作。在Linux终端里创建和激活虚拟环境的方式是python3.11 -m venv myproject-venv source myproject-venv/bin/activate激活后随便你怎么装包、升级包都不会污染全局环境。如果你不想每次手动激活也可以在脚本第一行用shebang指定解释器路径配合chmod x script.py就能像运行普通命令一样运行Python脚本。5.3 Linux下写代码的现代工作流很多新手被Linux劝退是因为他们试图直接在服务器上写代码。这完全没必要。现代开发的标准姿势是本地Windows/macOS用VSCode或PyCharm写代码、跑通小规模测试用git托管代码然后同步到Linux服务器上部署运行。部署的常规步骤是先在本地项目根目录生成依赖清单python -m pip freeze requirements.txt然后把项目文件源码、requirements.txt、部署配置上传到服务器创建虚拟环境一键装依赖python3.11 -m venv /opt/myapp/venv source /opt/myapp/venv/bin/activate cd /opt/myapp python -m pip install -r requirements.txt最后用nohup或systemd把脚本挂起来运行。比如你有每小时要跑一次的数据统计任务写一个systemd service文件或者用cron定时任务指向/opt/myapp/venv/bin/python /opt/myapp/main.py。注意cron里的python必须写完整路径因为它不会自动加载venv。这类细节每踩一次都是学费现在先记下来省得后面抓瞎。6. 写给学到这里的人三条比语法更值钱的实践习惯6.1 每个阶段只做一个能看见结果的小项目第六课最核心的变化是从学语法切换成用语法。我的经验是每个学习阶段都给自己定一个周五晚上能做完、周一能发给同学看的小项目第一周做过命令行小游戏第二周做过节流器第三周做过日报生成器。项目不必宏大关键是有明确输出——一张图、一个文件、一个网页都行。没有输出物的学习学过的语法很快就会还给教程。6.2 把报错信息当成老师而不是敌人我见过太多新手一看到红色的Traceback就抄起来复制到搜索引擎。其实Python的报错信息几乎已经把答案写在脸上了ModuleNotFoundError告诉你哪个模块没装TypeError告诉你是哪一行、哪个变量出了类型问题IndexError告诉你访问了列表里不存在的下标。花30秒钟把报错信息从头读到尾把它当成提示而非打击这个习惯养成之后你排错的速度会快一倍。我自己的代码调试时间有一大半花在读报错上而不是猜原因上。6.3 建一个属于自己的代码笔记本定期回炉从第六课开始我建议你建一个本地文件夹专门存放三种代码一是你踩坑后修复成功的事故报告二是你从别人项目里读懂并重写过的最小示例三是那些以后肯定用得上的工具函数比如读取CSV、设置中文字体、下载文件的通用模板。这比收藏一堆最全Python教程更有用。教程是别人的总结代码笔记才是你自己的沉淀。等你学了几十课再回头翻会发现自己当初写下的笨拙代码正是成长最快的证据。