小宇是我一个朋友家的孩子,刚上大一,专业和计算机没什么关系,但最近铁了心要学Python。他跑来问我第一句话就是:“哥,我下载了Python,然后呢?”这个问题其实特别典型——大部分新手不是被语法难倒的,而是卡在“装完了不知道干嘛”“写了两行报错看不懂”“照着教程敲代码结果和教程长得不一样”这三件事上。
所以我决定干脆陪他走一遍完整的入门过程,从装环境到跑通第一个程序,再到理解变量和类型这些基础概念,全程记录下来。这篇就是“小宇学Python”系列的第一篇,主要解决从零到能写出第一个完整小脚本这件事。如果你也是刚接触Python,或者装了好几次Python但一直没真正用起来,这篇应该能帮你把地基打牢。
1. 在装Python之前,先把三件事想清楚
小宇一开始的操作是直接去搜索引擎搜“Python”,然后点进一个看起来很像官网的网站,下载了一个不明所以的安装包。被我拦下来之后,我先让他搞清楚三个问题。
1.1 Python版本怎么选:3.8还够用吗
现在去官网能看到Python已经出到3.12以上了,但网上大量教程、公司内部老项目还在用3.8、3.9。小宇问我到底装哪个,我给他的建议是:新学者直接用最新稳定版,千万别装3.8以下的版本。
原因其实不复杂。Python 2早就停止维护了,现在网上你能找到的绝大多数库和新教程都默认Python 3。而在Python 3内部,版本越新,语法支持越完整,比如match语句、更友好的报错提示,都是新版本才有的。你用3.8写出来的代码大概率能在3.12跑,但反过来用3.12的新特性写的代码,在3.8上可能直接报语法错误。
另外还有一个实际原因:很多第三方库开始要求Python 3.9以上的版本,你装个3.8回头装库的时候会发现一堆警告甚至安装失败。没必要给自己添堵,走最新稳定版就行。
1.2 编辑器用哪个:别一上来就上IDE
小宇第二件事是问我“要不要装PyCharm”。PyCharm是很优秀的Python IDE,我工作里也经常用,但它对新手的第一个问题不是难用,而是信息太密。一个刚学会print("hello")的人打开PyCharm,满屏的快捷键提示、配置项、工程文件树,很容易产生“我是不是还不会用这个工具”的挫败感。
我给小宇的安排是分阶段走:
- 前两周:用VS Code,把界面调简洁,只装Python扩展,专心学语法本身;
- 等能独立写50行以上的小脚本了,再换PyCharm或继续用VS Code都行,那时候你能看懂IDE在帮你干什么了,效率才提得上来。
如果你连VS Code都嫌重,直接用IDLE也行——Python安装包自带的一个极简编辑器,写了代码直接F5运行,零配置,缺点是代码提示几乎没有,超过20行的代码就有点费眼了。
1.3 “安装成功”到底是什么意思
很多新手装完Python之后,看到桌面上多了个图标,就觉得自己装好了。其实判断是否安装成功有一个硬指标:打开命令行(Windows叫命令提示符或PowerShell,macOS叫终端),输入python能进入一个带>>>提示符的交互环境。
为什么强调这个?因为Python安装的本质是把解释器放进你的系统里,那个蓝色图标的“IDLE”只是附带的记事本+运行器。你后面用VS Code写代码,本质也是让VS Code调用你系统里的Python解释器去跑你的.py文件。如果解释器没装好,编辑器装得再漂亮也没用。
提示:装完Python后记得把“Add Python to PATH”这个复选框勾上。这是新手最容易栽跟头的一步,如果忘了勾,命令行里输
python会直接提示“不是内部或外部命令”。后面我会详细说这个问题。
2. 实操:Windows和macOS各自的完整安装步骤
为了不让你们看完上面那段还是不知道鼠标往哪点,我直接按系统把小宇装环境的过程写一遍。我自己主力机是Windows,拿小宇那台Windows笔记本走了一遍,后面又用我自己的macBook Air验证了一遍,两边都跑通了。
2.1 Windows安装路线图
第一步,打开Python官网(python.org),把鼠标悬停在顶部的Downloads菜单上,它会自动识别你的系统并给出一个大大的黄色按钮,写着“Download Python 3.x.x”,直接点。
第二步,重点来了。双击安装包之后,第一个界面最下面有一个复选框“Add Python to PATH”,一定要打勾。然后再点“Install Now”。这一步的作用是告诉Windows:你要把Python的执行路径写进系统环境变量里,这样以后你在任何目录下打开命令行都能直接敲python命令。
第三步,等待进度条走完,然后立刻验证。按下Win + R,输入cmd回车,在黑色窗口里输入:
python --version如果显示类似Python 3.12.4,说明安装成功。接下来再输入python,看到>>>就说明你进入了Python交互模式,可以在这里面直接写代码。退出交互模式的方法是输入exit()然后回车,或者按Ctrl + Z再回车。
小宇第一次装的时候没勾PATH,验证的时候系统提示“不是内部或外部命令”,后来我让他重新跑了一遍安装包,选择“Modify”,在下一步里手动勾选了“Add Python to PATH”,问题才解决。这里多说一句:遇到这种问题别慌,不需要重装系统,只需要把Python安装目录(一般类似C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\)和它的Scripts子目录手动填进环境变量的Path里,效果一样。
2.2 macOS安装的两种方式
macOS这边其实有三种装法,我推荐用官网安装包或者Homebrew,看你的情况选。
最省心的是官网安装包。同样是进python.org下载macOS版,双击.pkg文件,一路“继续”就行。装完打开终端,输入:
python3 --version注意,macOS上因为历史原因,python命令可能还指向系统自带的Python 2或干脆不存在,所以要敲python3。如果你希望以后敲python也能直接进入最新版,可以在终端里配置别名,但新手阶段没必要折腾,老老实实用python3,避免和你电脑里可能存在的旧版本起冲突。
用Homebrew装也简单:先在终端执行/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"装好Homebrew,然后:
brew install python这种方式的好处是后续装别的开发工具(比如Node.js、Git)也用得上,坏处是那个安装脚本可能因为网络原因比较慢。你按自己的网络情况取舍就好。
2.3 装完VS Code并把编辑器连上Python
这一步是整个环境配置里最容易被忽略但最关键的。VS Code默认只能当记事本用,不告诉它Python在哪,它就不会给你任何代码提示和报错高亮。
在VS Code左侧扩展商店里搜索“Python”,选择那个发布者是Microsoft的扩展,安装。然后随便新建一个.py文件,写一行print("hello"),VS Code右下角或底部状态栏会出现一个Python版本号,你点它,选择刚才装好的解释器,就关联成功了。
关联成功后会有什么变化?第一,你写pri的时候会自动弹出print补全选项;第二,写错单词下面会出现红色波浪线;第三,右上角会出现一个三角形的运行按钮,点一下就能直接跑当前文件。这三样对于新手来说,体验的提升是立竿见影的。
注意:VS Code弹窗提示安装“pylint”“ruff”之类的时候,直接同意就行。语法检查工具能帮你把很多低级错误在运行之前就拦住。
3. 小宇的第一个脚本:不只会print,还要理解print
环境装好之后的小宇特别兴奋,按照教程敲了个print("hello world"),跑通了,然后问我:“然后呢?”我相信这也是很多自学者卡住的第一道坎——会打印一句话之后,不知道下一步该干嘛。
我的想法是,第一课不要急着讲循环和函数,先用几个简单例子让新手理解程序是怎么一步一步执行的,以及print到底在干什么。
3.1 从print到变量:程序就是按顺序执行的口令
我让小宇写了这样一段代码:
print("程序开始") print("大家好,我是小宇") print("程序结束")我说:“你现在猜一下,运行之后这三行会以什么顺序出现在屏幕上?”小宇说肯定是先出现“程序开始”,最后出现“程序结束”。我让他运行,果然如此。
这个看似废话的结论,其实是编程最底层的逻辑:代码是从上到下逐行执行的口令列表。你写什么,它就执行什么,顺序就是你写的顺序。很多人学编程卡在“为什么我的程序不按我想的运行”,往往就是没理解这一点。
然后我们引入变量。我让他改了代码:
name = "小宇" age = 19 print("大家好,我是" + name) print("今年" + age + "岁")运行之后第二行报错,提示can only concatenate str (not "int") to str。我问小宇能不能看懂,他说大概意思是“不能把字符串和整数拼在一起”。对,这就够了。我们借此引出了第一个基础概念:Python里的数据是有类型的,数字和文字不能直接往一个加法里塞。
修正方案有两个。第一个是用str()把数字转成字符串:
print("今年" + str(age) + "岁")第二个是用f-string,这也是我更推荐新手养成习惯的写法:
print(f"大家好,我是{name}") print(f"今年{age}岁")f-string的规则很简单:在引号前面加个小写f,然后字符串里需要插入变量的位置用大括号包住变量名。代码更短,也不会搞混类型。我给小宇说,以后你自己写脚本,输出内容涉及变量一律用f-string,保证少踩一半的坑。
3.2 交互式运行和保存成文件的区别
小宇后来发现自己把代码写在IDLE里,按F5运行能出结果,但在命令行输python进去一个个敲,敲一行出一行结果,这让他有点困惑:“我到底该用哪种方式?”
我说两种方式对应两种典型的用法。命令行里的>>>模式叫交互式环境(REPL),适合临时算个东西、试个语法、验证一个小想法,比如你懒得开文件就进来看一眼2 ** 10等于多少。而写.py文件再运行,才是正经做事的方式——文件可以保存、修改、复用,代码长了也不可能一行行在交互环境里敲。
判断标准很简单:如果你这次只是想“试一下”,用交互模式;如果你打算“写一个自己能反复用的小工具”,就新建文件写代码然后运行。学编程百分之九十九的时间是在操作文件,交互模式只是个临时草稿纸。
3.3 给你的第一个脚本加个“人味”
很多教程第一课到这里就结束了,但我还是多带小宇走了一步:让程序能问用户问题,并根据回答做不同的事。这一步会用到input(),代码很短:
name = input("你是谁?") print(f"你好啊,{name}!欢迎来到Python的世界。")input()的作用是让程序停下来,等待用户在终端里输入文字,然后把输入的内容赋值给name这个变量。注意,无论用户输入的是数字还是文字,input()返回的一定是字符串,所以如果后面要拿它做数学运算,需要用int()或float()转一下。
小宇跑完这段,兴奋点来了:“这有点意思了,程序好像能和我对话了。”是的,这就是交互的雏形。一个感知输入、处理信息、给出输出的闭环,其实就是一个程序的完整结构。不管多复杂的软件,拆到最底层也是这个逻辑。
4. 基础语法必须吃透的四个小块
环境跑通、有了第一个交互示例之后,小宇问我:那我接下来是不是可以直接去学爬虫、学数据分析?我跟他说你先别急,爬虫和数据可视化再好玩,也是建立在你能随意操作数据的基础上的。基础语法的四个小块,今天必须过一遍。
4.1 变量命名不是随便起的
Python允许你用英文、数字、下划线给变量起名,但有几个规则:
- 不能以数字开头,
1name是错的,name1是OK的; - 不能包含空格和连字符,比如
my-name会报语法错误; - 不能用Python保留字,比如
if、for、while这些词是语法的一部分,不能拿来当变量名。
更重要的是养成可读性优先的命名习惯。我让小宇做个小练习:定义一个变量存放你的出生年份,他顺手写了个a = 2006。我说这个a过两周你自己回来看都不知道是啥,改成birth_year = 2006,虽然多了几个字符,但信息量完全不同。
4.2 类型转换是新手最容易踩的坑
前面print那段已经出现了一次类型问题。这里把类型转换的常用方法一次说清:
int():把字符串或浮点数转成整数,注意int("3.14")会报错,得先float("3.14")再int();float():转成浮点数(小数);str():转成字符串,任何类型基本都能转;bool():转成布尔值,这里有个经典坑:bool("False")是True,因为非空字符串都是真,只有空字符串bool("")才是False。
我让小宇写了这样一段小代码验证这些转换:
age_str = input("请输入你的年龄:") age_int = int(age_str) next_year = age_int + 1 print(f"明年你就{next_year}岁了")这段代码虽然只有四行,但完整覆盖了“输入—转换—运算—输出”四个环节。能独立理解这段代码的人,才算真正过了变量和类型这一关。
4.3 列表和切片:Python最实在的一个特性
Python的列表(list)基本可以理解成一个有序的柜子,里面可以放任意类型的东西:
fruits = ["苹果", "香蕉", "梨", "西瓜"] print(fruits[0]) # 苹果 print(fruits[-1]) # 西瓜,负数索引表示从尾部往前数 print(fruits[1:3]) # 切片,取索引1到2,结果是['香蕉', '梨']切片这里小宇一开始没绕明白,为什么[1:3]取到的是第2和第3个元素,不是第2、3、4个。我给他打了个比方:切片规则是“起点在1,终点在3,但3本身不包含”,就把右侧当成一个不关门的边界,走到3门口但不进去。这样理解[:2]取前两个、[::2]隔一个取一个,都顺理成章了。
4.4 条件判断:让程序学会见机行事
有了变量、类型、列表,再加上if,你的程序才真正有了“逻辑”。小宇第一次写条件判断的时候犯了个经典错误:
if score = 80: # 错!这是赋值=是赋值,==才是判断相等。这个细节几乎每个新手都会错一次。正确的写法是:
score = 80 if score >= 60: print("恭喜你,及格了") elif score >= 90: print("优秀!") else: print("下次再加油")顺带一提,这个例子还有一个小坑在逻辑顺序上:因为90 >= 60也是成立的,所以如果你把score >= 90的判断放在最前面才符合预期,否则永远轮不到“优秀”这条分支。这一点比语法本身更重要——分支的顺序就是判断的优先级,你得先想清楚哪件事要先下结论。
5. 小宇的真实翻车现场:报错信息这么读才对
学编程的一个铁律是:报错不可怕,读不懂报错才可怕。小宇在练习过程中一共产生了三类报错,我把它们原原本本记下来,每个都说说怎么定位和修复。
5.1 SyntaxError:代码“读不通”
小宇的代码:
print("hello"运行后报SyntaxError: '(' was never closed。这个报错的意思是“这一行有个括号没闭合”。Python看到引号字符串"hello"后面没有右括号)就直接到了末尾,它不知道该怎么继续,干脆告诉你“我读不下去了”。
遇到这类错误,解决方法是先看行号提示,再看光标停留在哪个位置附近,缺括号补括号,缺引号补引号。关键心法是:别怕报错,报错就是Python在打手电筒帮你找问题。
5.2 NameError:名字没定义
这是小宇把变量名拼错时遇到的:
print(nmae)报错:NameError: name 'nmae' is not defined。字面意思就是:Python认不出nmae这个东西。定位思路是检查两点:变量是不是拼错了;变量是不是在它赋值之前就被使用了。Python的变量在赋值之前是不存在的,所以你用了第20行才定义的变量在第10行用,一样会报这个错。
给大家一个小技巧:报错信息会精确到文件名、行号、出错的名称,它就是最直接的定位器。读报错不是从头读,先看最后一行“什么类型的错+具体名字”,再向上翻找出错的那一行。
5.3 TypeError:两种类型“合不来”
这个我们前面遇到过了,字符串和整数不能直接相加。小宇实际踩坑的代码是:
count = 5 print("剩余次数:" + count)报错信息是can only concatenate str (not "int") to str。这类错误的高频出现时间是在新手开始处理用户输入之后,因为input()返回字符串,而用户输的数字默认是文字,你要参与数学运算必须先int()一下。
我给小宇一个参考顺序:遇到TypeError,先看两个操作数的类型分别是什么(可以用type()函数打印验证),再看它们能不能兼容;不兼容就先转换类型,再做操作。
5.4 报错之后的心态调整
我跟小宇说一句很实际的话:你写的每一个程序,在整个开发过程里,真正“一次跑通”的概率几乎为零。老程序员的日常也不过就是“写—跑—报错—改—再跑”这个循环,只是他们改得快而已。所以你第一次遇到报错时不要怀疑自己是不是不适合学编程,那不是智商问题,那是所有程序员的日常。
怎么提升改错速度?两个建议。第一,报错信息的关键词用搜索引擎搜,中文搜不到就英文搜,绝大多数错误都能搜到解决方案;第二,自己学会“二分定位”——注释掉一半代码,跑一次,看报错还在不在,以此判断出错范围,缩小搜索半径。
6. 第一课该做个什么小项目:就用当天的知识点写个BMI计算器
光听不练等于没学。我给小宇布置的当天作业是写一个BMI体质指数计算器。选择这个项目是因为它足够简单,却又能把今天所有知识点全串起来:输入、类型转换、运算、条件判断、输出。先看完整代码:
height = float(input("请输入你的身高(米):")) weight = float(input("请输入你的体重(千克):")) bmi = weight / (height ** 2) print(f"你的BMI指数是:{bmi:.2f}") if bmi < 18.5: print("体重偏轻") elif bmi < 24: print("体重正常") elif bmi < 28: print("体重偏重") else: print("肥胖范围")首先说明,这里的参考值用的是国内常用标准,具体标准大家可以根据自己的了解调整,重点是这个项目覆盖的语法点。逐行拆解:
第一行,float(input(...))两个函数嵌套用:内层input()先弹输入框,外层float()把用户的字符串转成小数。身高体重的BMI公式要求的是小数,用int()会出错,所以这里必须用float()。
第二行同理。
第三行是计算,height ** 2表示身高的平方,指数运算用双星号,新手容易写成height^2,那是按位异或,跑出的数会完全不对。
第四行,{bmi:.2f}是f-string的格式化语法,意思是把bmi这个数保留两位小数输出。不加这个的话,结果可能变成一长串小数。
后面就是条件判断的四档划分。注意elif的顺序:< 18.5最先判断,然后是< 24,这样判断是安全的。如果反过来先判断< 24,BMI为17的人会直接落到“体重正常”,因为17也是小于24的。这个顺序问题的本质和前文讲的score >= 90那个坑是一回事——条件判断的先后顺序决定了逻辑优先级,要从窄到宽、从特殊到一般来编排。
小宇运行时我观察到一道小坎:他在命令行里输入身高后,自己把单位“1.75米”一起打进去了,结果float("1.75米")直接报错ValueError: could not convert string to float。这正好又复习了一遍类型转换的话题:float()只认数字格式的字符串,带中英文的单位符号一概不认。这也提示我们,如果做一个给别人用的程序,输入提示要写清楚格式,甚至要做异常处理,不过那是后面try except的功课了,第一课不做扩展。
这个小项目跑通之后,小宇问我:“这东西有什么实际用吗?”我说你是觉得它太简单了吧?我让他反着想一个问题:如果明天产品经理让你做一个“给一万个人用”的BMI计算器,你至少要再考虑哪些事?比如:用户输入负数怎么办?输入0怎么办?用户输入超大的数怎么办?这么一问,他立刻意识到了——写一个自己能跑的脚本和写一个别人能用的工具之间,差的不是代码量,而是对边界情况的考虑。这个意识从第一课就开始建立,后面学函数、学异常处理的时候,你会发现自己比同龄人更容易理解“现实世界的代码长什么样”。
我对小宇说的是:这一篇不要贪多。今天你只要真的做到三件事——装好环境、跑通第一个交互小程序、理解变量和类型是怎么一回事,就已经走完了很多人学编程半途而废之前最艰难的一段路。下一篇我们正式开始啃语法硬骨头:循环结构、函数定义、还有怎么把你的脚本从“写完就丢”变成“能反复调用”的小工具。顺便说一句,小宇在练习里已经不止一次问我“函数到底干嘛用的”,这事确实值得单独开一篇好好说。