ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python实战笔记:从环境搭建到数据分析与爬虫开发完整指南

Python实战笔记:从环境搭建到数据分析与爬虫开发完整指南 说实话我自己的Python笔记攒了三年从最开始连editplus都跑不明白到后来靠它吃饭中间踩过的坑比代码还多。这份笔记不是教科书是我平时写脚本、做小工具、帮人调环境时留下的实战记录今天整理出来分享给你不管你是刚开始关注python安装教程还是已经写了几百行代码想找点进阶方向应该都能从中翻到点东西。我会把Python学习路径上最容易卡人的地方挨个拆开包括环境配置、基础语法里的隐藏陷阱、常用库安装、爬虫和数据可视化的小案例以及几个我很喜欢写的经典小项目。每一条都配有我当时现场的真实感受和补救方案你可以直接照着操作也可以当作排查手册放在手边。1. 先把Python跑起来环境搭建与编辑器配置1.1 版本选择和安装细节很多人一上来就问“Python装哪个版本好”我的答案很简单不要追新也不要太老去官网下当前最新的稳定版就行。这个判断标准不是看版本号好不好听而是看第三方库的兼容性。新版本刚发布时很多常用库来不及适配你装完numpy都可能报错体验会非常差而太老的版本又缺少语法支持很多新写法跑不了。实际上python下载安装教程里最需要强调的就是一件事安装时记得勾选“Add Python to PATH”这一项漏掉后面在命令行输入python就会提示“不是内部或外部命令”。安装完之后我建议你先打开命令行输入 python --version 确认一下能正常输出版本号再继续。macOS和Linux用户自带Python的话版本可能比较旧建议用包管理器安装新的版本不要直接动系统自带的解释器否则容易把系统工具搞坏。Windows用户还要留意一个细节如果你电脑里有多个Python版本安装器会多出一个“py launcher”用 py 命令可以切换版本这个后面配虚拟环境的时候特别好用。1.2 编辑器怎么选vscode还是pycharm编辑器这块我被问过无数次说实话没有标准答案只有适不适合。如果你主要做数据分析和脚本类工作Visual Studio Code会是更轻的选择启动快、插件生态好配好vscode python环境之后写小工具很舒服。如果你要写大型项目尤其是后端工程PyCharm的智能提示和重构功能会让你省不少力气。我个人的建议是新手先用PyCharm社区版因为它开箱即用不用折腾配置能让你把精力放在语言本身。用了一两个月之后再试试vscode配置python你会发现自己已经能理解那些json配置项在干什么了。vscode配置python的核心其实就两步一是安装Python扩展二是在左下角选择正确的解释器路径。很多人报“找不到模块”说白了就是vscode还在用全局解释器而不是虚拟环境里的解释器。1.3 虚拟环境是后期省事的关键刚学的时候我根本不知道虚拟环境是什么所有库都往全局塞直到有一天一个项目需要django2另一个需要django4装完一个另一个就崩我才意识到隔离的重要性。虚拟环境这东西你可以把它理解成给每个项目单独开了一间小房间房间里的库互相不干扰。创建虚拟环境只需要在项目目录下输入python -m venv venvWindows下激活是 venv\Scripts\activatemacOS和Linux下是 source venv/bin/activate。激活之后命令行前面会出现一个(venv)前缀这时候你再pip安装任何库都只在这个项目里生效。我现在的习惯是每接手一个新项目第一件事就是建虚拟环境第二件事是配置国内源这两个动作可以避免掉后续80%的依赖问题。1.4 python国内源怎么配才省心说到国内源我最早装库的时候不知道这个每次pip install都像开盲盒有时候一个几十MB的包能下十分钟中间断一次还要重来。后来我养成了一个习惯直接用豆瓣或清华镜像源安装pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple但这只能解决单次问题更省事的做法是永久配置。在用户目录下新建一个pip.iniWindows或pip.confmacOS/Linux写入[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn配好之后以后所有pip命令都走国内源速度立竿见影。我记得第一次配置完再装包进度条是直接刷过去的那种畅快感现在还记得。不过也要提醒一句国内源有时候同步会延迟如果你发现某个库版本一直很旧可以临时指定官方源装一次。2. 基础语法最容易踩坑的几处2.1 abs函数和内置函数的隐藏行为python abs函数是我在笔记里专门圈过的一个点因为它太简单了简单到几乎没人看文档。它默认只接受数值类型整数、浮点数、复数都行。复数返回的是模长这个很多人不知道。比如 abs(34j) 返回 5.0。但真正的坑在别处如果你把一个字符串传进去比如 abs(-5)python会直接抛TypeError。有些新手在写命令行工具时input()拿到的明明是数字但类型是字符串直接abs()就会挂。正确的做法是先做类型转换abs(int(s))。这个场景我反复提是因为它特别典型不是abs本身难而是“内置函数 数据类型”的组合判断恰恰是新手最缺的意识。顺便说一下其他内置函数的隐藏行为。round()的银行家舍入会让 round(0.5) 返回0这个反直觉pow()支持第三个参数做模运算 pow(2, 10, 1000)divmod()一次返回商和余数。这些内置函数如果你不查文档可能写很多年代码都不会碰到但一旦碰上了排查起来会特别痛苦。2.2 类型转换别忽视边界情况python类型转换大概是新手最早接触的操作之一int()、float()、str()、list()、dict()这些几乎天天用。但转换过程中的边界条件我踩过的坑可以写一页纸。int(3.14)会报错但float(3.14)就可以int(3.9)也报错因为字符串转整数不接受小数格式。这个逻辑其实很一致int()是把内容变成整数它不负责舍入。如果你想把字符串3.9变成整数3老老实实先转float再int。列表转集合set()会自动去重但丢失顺序如果你既要去重又保留顺序得用循环或字典。最坑的是bool和数字的关系True等于1False等于0这意味着 sum([True, False, True]) 返回2。有些时候这是优点比如统计满足条件的个数一行代码搞定但如果你没意识到这个特性拿bool值去做索引可能会出现非常诡异的结果。2.3 赋值与可变对象这个坑害了多少新手python赋值操作看起来简单但背后藏着一个大坑变量名只是对象的引用不是对象本身。我见过太多新手写出下面的代码然后一脸懵a [1, 2, 3] b a b.append(4) print(a) # [1, 2, 3, 4]明明只改了b为什么a也变了因为b和a指向同一个列表对象append是在对象上做修改所以a看到的也是修改后的内容。这个问题在函数传参时更致命你在函数内部改list外面的数据被一并改了。正确的复制方式是 b a.copy() 或者 b a[:]如果是嵌套列表还需要用 copy.deepcopy(a)。我的经验是只要遇到“一个变量赋值给另一个变量之后原变量被莫名修改”的情况第一反应就应该是“它们是不是引用了同一个可变对象”。2.4 协程async/await不是魔法协程是不少python开发者进阶的必经之路python协程的核心是async/await这两个关键字。我第一次接触的时候总觉得它很高深后来发现可以把它理解成“一个人同时在做几件事但每件事做到需要等待时就换个任务”跟多线程的区别是它不用操作系统切换上下文开销小得多。一个最简单的协程写法import asyncio async def task(name, delay): print(f{name} start) await asyncio.sleep(delay) print(f{name} done) async def main(): await asyncio.gather(task(A, 1), task(B, 2)) asyncio.run(main())这里有两个新手必踩的坑。第一调用异步函数不会执行它只是创建一个协程对象你必须await或者放到事件循环里第二asyncio.sleep()和time.sleep()不一样前者会让出控制权后者会阻塞整个事件循环如果你在协程里用time.sleep()所有任务都会卡住。我写爬虫和脚本时经常用协程处理大量网络请求速度比同步循环快好几倍。3. 第三方库安装实操numpy、cv2和依赖冲突3.1 安装numpy的正确姿势python第三方库那么多但numpy绝对是金字塔尖的库之一几乎做数据相关的事情都离不开它。安装numpy的方法很简单但有两个细节值得说。第一别用官网那种几十MB的安装包直接用pip。第二如果你在装的时候遇到编译错误尤其是Windows下多半是因为pip在尝试从源码构建而不是下载预编译的wheel包。解决办法是升级pip并确保Python版本和库版本匹配python -m pip install --upgrade pip pip install numpy pandas如果你需要在线编译器做演示又不想在本地装环境可以在浏览器里搜numpy在线编译器jupyter的在线版或者replit都行。但我自己的体会是在线工具适合临时验证长期学习还是在本地环境里跑更顺手因为可以装各种扩展包。安装numpy之后我建议你立刻跑一个命令验证import numpy as np print(np.__version__) print(np.array([1, 2, 3]) * 2)能正常输出就说明安装成功了。我见过很多人装完库不验证结果代码里报错才发现装错环境了。3.2 cv2下载与常见报错python下载cv2这个需求在热搜里排得靠前说明很多人卡在这一步。其实OpenCV在Python里的包名不叫opencv而是opencv-python所以你需要在命令行输入pip install opencv-python然后导入时写的才是 import cv2。很多新手在网上搜“cv2怎么装”结果pip install cv2装了半天都是失败原因就是包名搞错了。装完opencv-python之后一般会连带装好numpy因为cv2依赖它。如果你在import cv2的时候报错说DLL加载失败多半是Visual C运行库没装去微软官网装一下VC_redist.x64.exe基本就能解决。还有个小技巧如果你只需要处理图像不需要视频功能装opencv-python-headless版本会更轻量不过初学者没必要管这个区别。3.3 依赖冲突和国内镜像源依赖冲突是Python环境里最让人头疼的问题之一。最常见的情况是你装了A库它要求numpy版本小于1.25但另一个B库要求大于1.26结果就是装一个崩另一个。我的处理思路分三步。第一步先看报错信息里的Requires提示搞清楚冲突的具体版本第二步升级或降级其中一个库试试但一定要在虚拟环境里操作第三步如果冲突实在解决不了干脆把整个虚拟环境删掉重建这比在那个环境里一点点排查快得多。依赖冲突这件事几乎每个Python开发者都会遇到所以我现在特别强调两个习惯一是每个项目都用虚拟环境二是在项目根目录维护一个requirements.txt文件用 pip freeze requirements.txt 导出当前依赖换环境时 pip install -r requirements.txt 一键恢复。4. 经典小项目里藏着核心语法4.1 turtle画爱心、四叶草和烟花python爱心代码大概是所有入门者都想要的东西网上流传的各种版本多到让人眼花缭乱。我自己也写过一个经典版本用turtle库import turtle t turtle.Turtle() t.speed(0) t.color(red) t.begin_fill() t.left(50) t.forward(133) t.circle(50, 200) t.right(140) t.circle(50, 200) t.forward(133) t.end_fill() t.hideturtle() turtle.done()这套代码的核心其实是turtle的circle方法配合角度控制画出两个圆弧构成爱心轮廓。画完之后你还可以往里加自己的名字或者改成闪烁效果。四叶草也是turtle的经典项目思路是画四个椭圆形的花瓣每个花瓣之间旋转90度再用小圆弧做茎。python烟花代码稍微复杂一点核心是随机生成粒子的位置和颜色然后逐步更新。turtle做烟花其实不是它的强项因为清屏比较麻烦更大的意义在于让你理解“动画就是不断重绘”这个底层逻辑。我之前给一个初学者朋友改过一版烟花他改完之后不仅会了turtle还顺带学会了随机数和颜色模型。4.2 “李白打酒”与递归/回溯“李白打酒”是一道很有意思的传统算法题原题是李白无事街上走提壶去买酒遇店加一倍见花喝一斗三遇店和花喝光壶中酒试问壶中原有多少酒。这道题的数学版本可以直接倒推但编程版本通常会变形成“遇店5次见花10次壶中酒是否刚好喝完输出所有可能顺序”。这个就是典型的递归加回溯def dfs(store, flower, wine, path): if store 0: dfs(store - 1, flower, wine * 2, path 店) if flower 0 and wine 0: dfs(store, flower - 1, wine - 1, path 花) if store 0 and flower 0 and wine 0: print(path) dfs(5, 10, 2, )这段代码里的核心思想是每一步有两种选择遇到店酒量翻倍遇到花酒量减一当所有次数用完且酒刚好为0时就输出路径。它同时包含了递归终止条件的设计和剪枝思想非常适合拿来理解“暴力枚举剪枝”这个组合刷算法题的人应该会熟悉这种套路。4.3 小游戏项目练手感python小游戏是保持学习兴趣的不错选择。我的建议是先从无界面游戏开始比如猜数字这个用input和循环就能做难度低反馈强import random target random.randint(1, 100) while True: guess int(input(请输入你猜的数字: )) if guess target: print(大了) elif guess target: print(小了) else: print(猜对了) break之后再逐步挑战贪吃蛇、飞机大战这类带界面的游戏。做游戏最大的收获不是学会pygame这个库而是理解“游戏循环”的概念事件处理、状态更新、画面渲染三者不断循环。这个概念在后面的图形界面和游戏开发里都会反复用到。我最开始学pygame时卡在坐标理解上很久后来画了一个笛卡尔坐标系才彻底想明白屏幕上x向右、y向下和数学坐标的区别这个转换意识在写可视化界面时特别关键。5. 爬虫与数据可视化零基础也能上手5.1 爬虫入门与合规注意点说到python爬虫教程很多人第一反应是“它能抓取我喜欢的网站数据”这个方向确实是最快让人看到成果的。爬虫入门其实只需要掌握三个库requests负责请求网页BeautifulSoup负责解析HTMLre负责正则匹配。一个最简爬虫示例import requests from bs4 import BeautifulSoup resp requests.get(https://example.com) soup BeautifulSoup(resp.text, html.parser) for link in soup.find_all(a): print(link.get(href))但这里我必须多说一句爬虫技术是工具怎么用要看目的。我写的所有爬虫项目都只抓公开数据而且遵守网站的robots规则控制请求频率不给对方服务器添麻烦。如果你要爬的数据可能涉及版权、隐私、个人用户信息或者需要登录才能访问那么请务必先确认你的行为合规。技术本身没有对错但用它的人得想清楚边界。5.2 可视化界面不要一上来就做GUI爬虫只是拿数据的手段把数据展示出来才是完整闭环。很多人爬完数据就想做一个“python爬虫可视化界面”我特别理解这种冲动但我建议你先把数据展示这一步搞定再加界面也不迟。最直接的可视化是绘图用matplotlib把爬下来的数据变成折线图或柱状图。等图表逻辑跑通之后再考虑用Flask起一个网页或者用PyQt做桌面GUI。我的经验是如果你连数据长什么样都没看清就急着做界面最后八成会卡在“界面写好了但数据没接进来”这个尴尬状态。数据先行界面后补这个顺序可以避免大部分返工。5.3 数据分析与可视化matplotlib和pandas组合python数据分析与可视化是个很大的话题但如果只挑一两个最核心的框架我会选pandas和matplotlib。pandas负责清洗和处理数据matplotlib负责把结果画出来。一个典型流程是用pandas读入CSV文件做一些筛选和聚合然后用matplotlib绘图import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(data.csv) df[date] pd.to_datetime(df[date]) daily df.groupby(df[date].dt.date)[amount].sum() daily.plot(kindline) plt.title(每日数据趋势) plt.xlabel(日期) plt.ylabel(数值) plt.show()pandas的groupby配合聚合函数是数据分析里最常用的手段如果你学会了这个再看任何“按XX分组统计XX”的需求都会很轻松。而matplotlib的绘图逻辑是这样的先建图figure再在图上添加坐标轴axes然后调用plot、bar、scatter等方法把数据画上去。搞清楚这个逻辑就不会出现“打开一个新图却把线画到了上一张图”的问题。5.4 坐标系图解看懂数据定位我前面提到自己当年卡在坐标转换上很久这里展开说说。python用到的坐标系主要有三种数学坐标系x向右y向上、屏幕坐标系x向右y向下和图像坐标系原点在左上角y向下。初学者最容易弄混的就是屏幕坐标系和数学坐标系导致画出来的图案是反的。我当时给自己画了一个示意图在纸上画一个直角坐标系标出原点和正方向然后再对照屏幕上的坐标。做的事情也很简单就是调用matplotlib画出点1,1、-1,1、-1,-1、1,-1看它们分布在哪个象限边画边把每个点的坐标写下来。这个练习只花了我十分钟但彻底打通了坐标转换的任督二脉。后面学图像处理、游戏开发、数据可视化都用得上这个基础概念。6. 进阶方向与问题排查实录6.1 量化交易策略代码怎么起步python量化交易策略代码是很多人想学Python的动力但这个方向的门槛其实不在Python本身而在金融知识的积累。如果你想用Python写一个简单的均线策略思路大概是获取历史行情计算短期均线和长期均线当短期上穿长期时买入下穿时卖出。在代码层面最核心的是用pandas计算移动平均import pandas as pd df[ma_short] df[close].rolling(window5).mean() df[ma_long] df[close].rolling(window20).mean() df[signal] (df[ma_short] df[ma_long]).astype(int) df[position] df[signal].diff().fillna(0)这段代码里有一个关键点signal是持仓状态持有1空仓0而真正需要执行的买卖动作是当持仓状态发生变化的那一刻也就是用diff()算出来的position字段等于1时买入等于-1时卖出。很多人第一次写策略代码时会直接在signal等于1时买入、等于0时卖出结果在同一根K线上反复交易回测结果惨不忍睹。另外我必须提醒回测表现好并不代表实盘能赚钱滑点、手续费、市场波动都会吃掉收益量化交易不是印钞机。6.2 Flet打包APK的实战注意点用python写移动应用是很多人的愿望python flet正是这样一个框架它能用Python代码写UI然后打包成安卓APK。这个方向我很看好因为它让只会Python的开发者也能做移动端工具。但打包APK的时候有几个坑特别值得说。首先是环境问题打包APK依赖构建工具链和Android SDK而不是在Windows上装个包就能一键完成我在Linux和macOS上的成功率高一些。其次打包之前一定要在代码里检查有没有用到不支持的标准库模块比如tkinter就不能在Flet应用里当UI用。最后是体积问题一个最简单的Flet APK也可能有几十MB因为打包进去了Python运行时和常用依赖这是正常现象不用慌。6.3 疑难报错速查表翻完自己的笔记我把最常见的报错和排查方法整理成了一张表这份东西比很多所谓的“python安装教程”都实用报错信息原因解决办法pip 不是内部或外部命令Python没有加入PATH环境变量重装Python并勾选Add to PATHModuleNotFoundError: No module named cv2包名写错或没有安装pip install opencv-pythonsyntaxError: invalid syntax语法写错常见于中文标点或缩进不一致检查是不是用了中文括号/引号确认缩进统一cannot be resolved against python helper roots解释器路径或虚拟环境配置异常在vscode里重新选择解释器路径并重启IDEAttributeError: NoneType object has no attribute xxx某个函数返回了None你却拿它继续操作打印中间结果定位哪个环节返回了NoneImportError: DLL load failed缺少C运行库或库版本不兼容安装VC运行库或更换库的版本这张表里的第三条值得单独说python对缩进极其敏感你一个不小心把tab和空格混用了它就会报invalid syntax而且报错位置往往不是真正问题所在排查起来非常忽悠人。我现在写代码一律只用四个空格做缩进编辑器也统一配置成tab转空格这个习惯可以省掉大量时间。6.4 学习网站和可持续路径最后聊一聊python学习网站和怎么坚持下去。我推荐的路径是官方文档用来查细节菜鸟教程或W3Cschool用来快速入门语法GitHub用来抄真实项目代码。新手最容易犯的错误是“收藏了无数教程但一个都没看完”我自己也这样过后来反思了一下真正有效的方式是带着问题去学想写爬虫就去搜爬虫教程想画图就去搜matplotlib示例遇到一个解决一个进步反而更快。对于codex这类AI编程工具如何接入python的问题我现在的感受是工具再强也得先知道自己要什么才能问出好问题。比如你让它帮你写爬虫至少要能说清楚目标网址、要提取什么字段、输出格式是什么。如果你连这些基本概念都没有AI给你的代码你也看不懂改都无从下手。所以我在笔记最后写给自己的一段话是Python的学习曲线并不陡但很漫长保持好奇心比聪明更重要。我现在整理这份笔记的时候翻到最早那些安装、报错记录还是能想起来当时对着屏幕手足无措的样子。如果你正在走这条路希望你少踩一些我踩过的坑多写几段能真正让你开心的代码。遇到问题的时候先冷静看报错再上网搜关键词最后动手改这三步能解决你大部分问题。
返回列表