ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python基础入门:从环境搭建到核心语法实战

Python基础入门:从环境搭建到核心语法实战 1. 从Python基础开始先搞清楚这玩意儿能干嘛Python这几年火到什么程度不夸张地说已经快变成编程界的英语了。咱们做开发的、搞运维的、做数据分析的甚至办公室文员都在学Python基础。为什么因为它的语法像人话变量不用声明类型缩进就代表代码块两个小时能上手写点自动化脚本一周就能摸到爬虫和数据分析的门槛这个学习曲线是其他语言给不了的。我一直跟刚入门的同事讲Python基础不是一门课程而是一套解决问题的工具箱。你今天装好环境明天就能写个批量改文件名的脚本你把列表、字典、循环弄明白了很多重复性工作就能扔给电脑跑。这篇内容我就结合自己这些年实际使用的经验从Python安装配置、VSCode环境搭建、核心语法、类型转换这些最常被问到的地方讲起把基础阶段最该掌握的细节和容易踩的坑一次说清楚。这篇文章适合完全零基础的朋友也适合在Linux或者Windows上装完环境但不知道怎么系统学下去的初学者。我会告诉你每个操作背后的原因不是机械地照着敲一遍而是让你明白为什么这么干、出问题了怎么排查。2. Python环境搭建装错版本和装好一样重要2.1 先选版本Python 2和Python 3别搞混现在说Python基础默认就是指Python 3。Python 2在2020年1月1日就正式停止维护了网上很多老教程还带着Python 2的写法比如print后面不加括号、用raw_input()这些东西现在跑起来直接报错。你要是照着老教程敲代码第一行就卡住不是你的问题是教程过期了。我建议你装当前稳定的Python 3.x版本不用追最新的大版本选一个生态兼容性最好的就行。比如写这篇内容的时候Python 3.10、3.11、3.12都是常用版本如果你要跑一些老项目或者特定的科学计算库3.10兼容性最稳如果是全新学习3.11以上都行。怎么查自己装了什么版本打开命令行输入python --version能看到版本号就说明环境OK。2.2 Windows下安装Python勾选Add to PATH比什么都重要Windows安装Python是最简单的官方网站下载exe安装包双击运行。但有一个地方我几乎每次都要提醒人安装向导第一步一定要勾选“Add Python to PATH”这个复选框。它会把Python解释器所在的目录自动加到系统环境变量里这样你在命令行任意位置输入python都能直接运行。我自己早期装Python的时候就是没勾这个装完了在命令行敲python提示不是内部或外部命令当时完全懵了。排查了半天才发现就是环境变量没配好。解决办法倒也不难手动加上就行右键此电脑→属性→高级系统设置→环境变量在Path里加入Python安装路径比如C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\以及同目录下的Scripts文件夹。另外一个建议是安装界面底部有个Customize installation选项点进去可以确认是否安装pip。pip就是Python的包管理工具以后装第三方库全靠它。Python 3.4以上版本官方默认带pip但安装界面里有个pip勾选框确保它是选中的。2.3 Linux系统安装Python别动系统自带的PythonLinux系统下安装Python要格外小心。很多Linux发行版自带系统级的Python比如CentOS 7自带Python 2.7Ubuntu 18.04自带Python 3.6。系统的一些底层工具比如yum、apt、gnome之类的管理程序是依赖这些Python版本的千万不能随便卸载或者替换系统自带的Python否则可能会导致系统工具崩掉。我见过最惨的一次现场是有人为了追求新版本把服务器的系统Python整个替换成Python 3.12结果yum和好多管理命令全部失灵最后只能重装系统教训非常深刻。正确做法是在Linux上编译安装或者用包管理器额外装一个自定义版本的Python。以Ubuntu/Debian系为例最省心的方式是sudo apt update sudo apt install python3 python3-pip这样装好的是发行版仓库里的Python 3和系统自带的那个可能版本相同也可能不同但pip和python3命令都能直接用了。如果你非要指定版本用源码编译wget https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz tar -xzf Python-3.11.8.tgz cd Python-3.11.8 ./configure --enable-optimizations make -j 4 sudo make altinstall这里注意我用的是make altinstall而不是make install。用altinstall会在系统里装出python3.11这个命令但不会覆盖默认的python3软链接这是保护系统Python的关键操作。安装完验证一下python3.11 --version我个人偏爱源码编译因为可以选择--enable-optimizations参数做PGO优化编译出来的解释器运行时性能比包管理器装的默认版要好一些对于后续做计算密集型任务有实际感受的差别。2.4 VSCode Python环境配置一个解释器和三个插件写Python代码工具选对了能省一半心。我推荐VSCode搭配Python插件轻量、免费、跨平台而且配置起来只要三步。第一步去VSCode扩展市场搜PythonMicrosoft官方发布的那个安装。这个插件会自动识别Python解释器提供代码补全、智能提示、语法检查。第二步按CtrlShiftP打开命令面板输入Python: Select Interpreter选择你装的那个Python版本。这一步很关键如果没选对解释器你写代码时补全和运行结果可能和预想的不一致。第三步安装一个格式化工具插件比如Prettier或者autopep8保存代码时自动整理格式这能帮你从第一天就养成符合PEP8规范的编码习惯。还有个小技巧VSCode里创建虚拟环境不用敲命令命令面板输入Python: Create Environment选择venv它自动会创建.venv文件夹并激活。虚拟环境这个话题后面细说总之VSCode这个操作很快很稳。3. Python安装完成后怎么验证和解决环境疑问3.1 pip安装第三方库的六种情况Python安装好了紧接着就是装第三方库。这里我把最常见的几种情况和写法一次列出来你可以直接对照着用操作场景命令注意事项默认安装最新版pip install requests会装到当前解释器的site-packages安装指定版本pip install requests2.31.0版本号要严格匹配用双等号安装版本范围pip install requests2.20,3.0范围用引号包住避免shell解析冲突升级已安装的包pip install --upgrade requests不使用-u简写也成但完整写法更保险卸载不需要的包pip uninstall requests会二次确认也可以直接-y跳过确认从source安装pip install githttps://github.com/xxx/xxx.git需要系统装有gitLinux环境下如果提示权限不足优先用pip install --user requests这个命令会把库装到当前用户目录不污染全局环境。网上很多人直接让你加sudo我建议慎用用sudo pip装出的库归root管你普通用户运行Python时根本找不到反而会整出一堆ModuleNotFoundError的诡异报错。3.2 安装库太慢更换镜像源解决国内下载Python官方PyPI仓库里的包经常慢到让人怀疑人生。一个几百KB的包能转圈好几分钟。这是网络链路原因不怪pip本身。解决方案是配置国内镜像源我个人一直用的是清华镜像pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple如果不想每次输那么长的地址一次性配置成默认源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple配置完了以后所有pip install默认就走镜像。这个方法在Linux、Windows、macOS上通用。3.3 虚拟环境Python依赖管理的地基虚拟环境这个概念我建议在第一周就学不要等到项目做大了才回头补。说白了虚拟环境就是给你的每个项目单独建一个隔离的Python环境不同项目可以用不同版本的库互不干扰。没有虚拟环境的时候你装了一个A库的新版本可能直接导致另一个依赖旧版本A库的项目跑不起来这种依赖地狱我经历过太多次了。创建虚拟环境用Python自带的venv模块就够了# Windows下 python -m venv myprojectenv myprojectenv\Scripts\activate # Linux/macOS下 python3 -m venv myprojectenv source myprojectenv/bin/activate激活之后命令行提示符前面会多出(myprojectenv)这个时候你所有pip操作都装在虚拟环境里不会动到全局Python。项目做完想导出依赖清单用pip freeze requirements.txt换台电脑后pip install -r requirements.txt一键恢复。这个习惯越早养成越好。4. Python基础语法从Hello World走到小而实用的工具脚本4.1 变量、数据类型与Python的动态类型逻辑Python基础里第一个要理解的观念是动态类型。C语言里你得写int a 5;Java里得写int a 5;Python里只需要a 5然后你还可以随手改成a hello。解释器会根据你赋的值自动推断类型。听起来省事但这不代表你不需要知道类型。恰恰相反Python踩坑的一大半都在类型上。Python常见的内置类型有这些整数int42浮点数float3.14字符串strhello布尔值boolTrue或False列表list[1, 2, 3]元组tuple(1, 2, 3)字典dict{name: Tom, age: 18}集合set{1, 2, 3}列表和字典是使用频率最高的两个。列表就是一个可变的、有序的元素集合你可以追加、删除、切片字典负责存储键值对查一个东西对应的另一个东西特别快。我举个例子要统计一段文字里每个单词的出现次数用字典就非常顺手text apple banana apple orange banana apple word_count {} for word in text.split(): word_count[word] word_count.get(word, 0) 1 print(word_count)输出结果是{apple: 3, banana: 2, orange: 1}。这里的dict.get(word, 0)方法是一个高频技巧如果键不存在就返回默认值0存在就返回当前值然后加1。你可以试试用其他语言写这个逻辑对比一下就知道Python的简洁度在哪了。4.2 类型转换int()、str()、float()与隐式转换的坑Python类型转换这个知识点搜索热度一直很高因为它是编程里最容易绕晕又绕不开的操作。类型转换分两类隐式转换是你没写任何转换代码解释器自动完成的显式转换就是你调用函数手动转。先说隐式转换一个容易踩坑的例子num 10 result num / 3 print(result) # 3.3333333333333335在Python 3里/除法的结果永远是浮点数不管除数和被除数是不是整数。这和C、Java里的整数除法行为完全不同。想要整除效果得用//print(10 // 3) # 输出3再说显式转换最常见的组合是字符串和数字互相转。用户输入一行内容你用input()读到的永远是一个字符串。比如用户输入了25你以为它是一个数字可以直接参与加法结果一执行25 1就报TypeError。这时候必须做类型转换age_str input(请输入年龄) age int(age_str) # 字符串转整数 birth_year 2025 - age print(你的出生年份大概是, birth_year)int()函数如果遇到转不了的内容比如int(abc)会抛ValueError异常。所以在真实项目里我一般建议在转换前先做校验或者用try...except包住避免程序直接崩溃try: age int(age_str) except ValueError: print(输入的不是有效数字请重新输入)再补充一个常见的坑float(3.14)是合法的能得到3.14但int(3.14)会报错因为int()不认带小数点的字符串。你要先float(3.14)得到3.14再int(3.14)得到3注意这里的int()是直接截断小数部分不是四舍五入。4.3 字符串处理f-string、切片与常用方法字符串是Python基础里最亲民的一个类型它自带的方法特别多掌握了能省大量时间。先说格式化老代码里你会看到我是%s今年%d岁 % (name, age)这种写法这是旧式的。还有{}{}.format(a, b)这种format写法也还行。但Python 3.6之后官方主推的是f-string也是我最推荐你直接学的name 张三 age 25 print(f我叫{name}明年{age 1}岁)f-string就是在字符串前面加一个f然后用花括号把变量或表达式包进去可以任意执行算术甚至函数调用。可读性比%和format高了一大截。字符串切片则是处理文本的基础操作。切片语法是字符串[起始:结束:步长]记住左闭右开规则——包含起始位置不包含结束位置s python基础 print(s[0:3]) # 输出 pyt print(s[::-1]) # 倒序输出 础基nohtyp[::-1]这个写法我刚学的时候觉得很新奇它是从尾到头、步长-1的意思一行代码就完成字符串反转。处理文件名、日志信息时特别常用。还有几个高频方法split()按分隔符拆分字符串成列表strip()去掉首尾空白字符join()把列表元素用指定分隔符合并成字符串。这三个组合起来就能应付日常80%的文本处理需求。4.4 流程控制for循环、while循环和if条件判断的实战逻辑流程控制是任何编程语言的骨架Python的表达非常直观。if、elif、else判断注意是elif不是else if很多人从C语言转过来会在这里手滑score 85 if score 90: print(优秀) elif score 60: print(合格) else: print(需要补考)循环里面我强调一下for循环配合range()的写法以及一个经常被忽视的小细节for i in range(5): print(i)range(5)生成0、1、2、3、4共5个数。range(start, stop, step)可以控制起始、结束和步长比如range(1, 10, 2)生成1、3、5、7、9。遍历列表时如果你既需要索引又需要元素不要写for i in range(len(lst))这种老风格用内置的enumerate()更优雅fruits [苹果, 香蕉, 橙子] for index, fruit in enumerate(fruits, start1): print(f{index}. {fruit})输出1. 苹果 2. 香蕉 3. 橙子while循环则适合不确定循环次数的场景。我写个经典例子猜数字游戏用户在1到100之间猜循环直到猜中target 50 guess -1 while guess ! target: guess int(input(请输入你猜的数字)) if guess target: print(大了) elif guess target: print(小了) print(恭喜你猜对了)这里要注意int(input(...))用了前面讲的类型转换知识如果用户输入非数字程序会崩溃。实际写工具时一定要在外层加异常处理。4.5 函数从def关键字到理解参数传递Python函数用def定义非常灵活支持默认参数、关键字参数、可变参数等。一开始你不需要全掌握但基础的定义函数、调用函数、返回值是必须会的def calculate_area(width, height): 计算矩形面积 return width * height area calculate_area(5, 8) print(area) # 40一个重要的概念是传参方式。Python里所有东西都是对象实参传给函数本质是让形参引用同一个对象。如果形参是可变对象比如列表、字典在函数内部修改它外部也会变。这个特性经常导致隐形bug。举个例子def add_item(item, lst[]): lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2]而不是预期的[2]看到问题了吗默认参数lst[]在函数定义时只被创建一次每次调用都复用同一个列表。我早期在这个坑上栽过好多次。正确写法是使用不可变默认值传None之后在函数内部新建def add_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst这个看似细节的问题其实是Python基础到进阶的一道分水岭理解它以后你对可变与不可变对象的理解会更扎实。4.6 模块与包import的背后逻辑写Python脚本到一定程度你肯定不想把所有代码堆在一个文件里。模块化就是把功能拆分到不同文件然后用import引入。Python基础阶段你只需要理解三种导入方式# 方式一导入整个模块 import math print(math.sqrt(16)) # 方式二导入特定函数 from math import sqrt print(sqrt(16)) # 方式三导入模块并起别名 import numpy as np第三种方式是业界惯例尤其在使用第三方库时。看到别人代码里写得np.array你就知道它前面一定有import numpy as np。一个我自己摸索出来的经验是尽量不要用from module import *。它会把模块里所有名字一股脑导入当前命名空间看起来省事实际上容易造成名字覆盖加大排查问题的难度。比如你先from module_a import *再from module_b import *两个模块都有func()这个函数后导入的会静默覆盖先导入的程序按你意料之外的版本执行极难察觉。4.7 免费Python源码怎么用复制粘贴之前先看这三个地方搜Python教程的时候肯定会遇到很多免费Python源码大全之类的资源。这不是坏事但我见过太多初学者把代码贴进自己的环境一运行报错直接心态崩了。其实出问题不一定是你操作错有可能是源码的环境和你不一样、版本不匹配、依赖库缺失。拿到别人代码我建议先看三处。第一看文件开头有没有import声明缺哪个库就pip install哪个第二看有没有明显的版本相关语法比如print有没有括号、有没有f-string这种新特性第三看有没有读取本地文件的逻辑比如代码里写着open(data.txt)你没有这个文件自然会FileNotFoundError。还有一个小建议读到好源码时别直接复制跑完就完事了试着改动几个参数看看输出会怎么变化再试着给它加个功能。这才是源码学习的正确姿势它从照抄变成改造你的进步速度会快得多。5. 实战项目写一个处理表格数据的Python小工具理论知识聊了不少但Python基础真正落地要靠动手。我分享一个我当年学基础时亲手写的小项目——批量处理CSV文件。这个项目用到的知识点覆盖了文件读写、列表与字典、循环、函数、类型转换、字符串处理几乎把基础语法全部串起来了。场景是这样的你手上有一个sales.csv文件里面有日期、产品、销售额三列你需要读取它统计每个产品的总销售额然后按销售额从高到低排序输出。先创建CSV文件随便写几行日期,产品,销售额 2025-01-01,苹果,150.5 2025-01-01,香蕉,89.9 2025-01-02,苹果,200 2025-01-02,橙子,120.3 2025-01-03,香蕉,95.5然后写Python脚本import csv def read_and_summarize(file_path): product_sales {} with open(file_path, moder, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: product row[产品] # 类型转换字符串转浮点数 amount float(row[销售额]) product_sales[product] product_sales.get(product, 0) amount # 按销售额从高到低排序 sorted_sales sorted(product_sales.items(), keylambda x: x[1], reverseTrue) for product, total in sorted_sales: print(f{product}: {total:.2f}) if __name__ __main__: read_and_summarize(sales.csv)运行后会输出苹果: 350.50 香蕉: 185.40 橙子: 120.30我来逐行说明关键点。csv.DictReader会读取表头把每行包装成字典这样访问数据可以用列名而不是索引下标代码可读性高很多。open的encodingutf-8参数处理中文必须加否则在Windows上可能因为默认编码GBK而报解码错误。float(row[销售额])就是前面讲过的类型转换把字符串变成数字才能做加法。最后的排序用到了匿名函数lambda x: x[1]表示按每个元组的第二个元素即金额排序reverseTrue表示降序。这个小工具如果不用Python在Excel里筛也能做但一旦数据量到几万行、文件有十几个Excel就开始卡顿Python脚本眨眼间跑完这是技术方案的优势。你可以把这个思路迁移到很多场景批量处理日志文件、整理多个Excel表、自动归档下载文件夹等等。6. Python基础阶段常见问题与排查实录6.1 环境报错速查表我自己学习阶段和带新人时遇到过大量重复的问题整理成一张速查表遇到了直接对照找解法报错信息原因解决方法python 不是内部或外部命令Python未加入PATH重装时勾选Add to PATH或手动添加环境变量ModuleNotFoundError: No module named xxx目标库未安装或装到了别的环境先pip install xxx检查虚拟环境是否激活SyntaxError: invalid syntax语法错误常见于版本差异或缩进问题检查是否有Python 2的print写法检查缩进是否混乱FileNotFoundError代码中有文件读取但文件路径不对用绝对路径或确认当前工作目录UnicodeDecodeError文件编码问题读取时指定encodingutf-8TypeError: can only concatenate str (not int) to str字符串和数字直接拼接用f-string或str()做类型转换PermissionError: [Errno 13]没有文件写入权限检查目录权限或改用--user安装ValueError: invalid literal for int()int()转换了无法转换的字符串转换前加try-except或做校验6.2 三个最容易被忽略的学习习惯第一永远不要只看不敲。Python是一门手上功夫手指对语法的记忆比你脑子对语法的记忆可靠得多。我的做法是看教程时每看一个小节就停下来把例子自己重新打一遍再改几个参数跑一遍。看起来慢实际效果远好于看完视频再集中练。第二遇到报错要学会看最后的Traceback不要只看第一行。很多初学者一看到红色报错就关闭窗口其实报错最后一行才是真正的错误原因前面的信息是调用链追踪。比如ZeroDivisionError: division by zero最后一行告诉你除数为0前面告诉你在哪一行哪个函数。顺着最后一行的提示去改大多数问题5分钟内解决。第三善用print()调试。基础阶段不要一上来就学复杂的调试器。觉得结果不对就在关键位置加print()打印中间变量看它是不是预期值。我自己写复杂一点的业务逻辑时仍然会用print来快速定位不是所有场景都需要IDE断点调试。6.3 一种处理代码能跑但结果不对的排查思路如果说代码报错是明枪代码能跑但结果不对就是暗箭更难处理。我以前写一个数据去重脚本逻辑看着没错但输出就是多了几条重复记录排查了半天发现是源数据里同一个字段在不同行有首尾空格导致apple和 apple被当成两个东西。这类问题经验之谈是分三个方向排查。第一检查输入数据用print()把原始数据打印几行看看有没有隐藏的空白字符、空值、格式不一致。第二检查类型转换某个字段是不是还在当字符串用直接10 5变成了105而不是15。第三检查循环边界比如用了range(len(lst))边界写没写对差了一位就会漏掉最后一条数据或越界。7. 个人经验Python基础学完后下一步怎么走写到这我自己也很有感触。Python基础这个阶段说难不难说简单也不简单关键是别被前面几个劝退点卡住。我见过太多人卡在第一步装环境上装完发现连打开Python交互式命令行都觉得迷茫然后就没有然后了。我的经验是基础阶段不要追求面面俱到你的目标很明确能写脚本运行、能读懂报错、能处理字符串和列表、能调用函数和标准库。这些目标达到了就算基础过关。比如数独游戏、猜数字、批量处理文件这些项目既能巩固语法又能给你正反馈。等基础扎实了再根据自己的方向选框架和库数据分析方向去学pandas和matplotlibWeb方向去学Flask或Django自动化方向去学requests和selenium。最后再分享一个小技巧这个习惯我一直保留到现在给自己建一个代码笔记文件夹把每天学到的小技巧、踩过的坑、有用的代码片段按主题存下来。比如字符串处理.py、文件操作.py、报错解决.md。这样做最大的好处是你不需要把每个细节都记在脑子里需要的时候翻一下笔记立刻就能调出解决方案。Python生态更新快、知识面广但有了自己的知识库不管以后走哪个方向你都会越学越顺手。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进