很多想学Python的朋友,卡住的地方往往不是"难",而是"不知道从哪句入手"。网上动不动就十几章的大教程,前面看得懂,后面越来越虚,最后连一个完整的小程序都写不出来,特别打击信心。这篇东西不讲框架、不讲算法,就专门围绕Python里最常用的那部分基础语句来聊——赋值、输入输出、条件判断、循环,把这几个基本功砸实。你不需要任何编程基础,跟着把代码敲一遍,再想清楚每条语句到底在干什么,后面学函数、学列表、学爬虫、做数据分析都会顺畅很多。我带新手入门这几年,反复验证过一件事:基础语句吃透了,比多背100个函数都有用。
1. 把Python当一门"按规则行动的语文"来学
1.1 语句、表达式到底是什么关系
很多零基础的人一上来就被"语句""表达式""对象""变量"这些词吓住,其实没那么玄。你用中文跟人交流,是靠一句一句的话;让Python做事,靠的也是一条一条的语句。比如a = 1是一条赋值语句,print("你好")是一条表达式语句,if x > 0:是一条条件语句。解释器拿到你的代码,就像一个听话的执行者,从上到下一行一行照着做。
这里有个常见误解,觉得"表达式"和"语句"是同一个东西。其实不一样:表达式是有值的,比如1 + 2,计算机看到它就算出3这个结果;语句是动作,比如a = 1这个赋值动作,它把数字1存进变量a,本身不返回值。
大部分新手接触的第一个程序就是print("hello world"),这行东西本质上是"调用 print 函数,把字符串输出到屏幕上"——注意,哪怕是输出,程序也是在"执行一个动作",所以它属于表达式语句。理解这个区分,你后面看那些报错信息会舒服很多。
1.2 两种跑代码的方式:交互式窗口和脚本文件
我见过不少人学Python时卡在环境上,其实只要分清两种运行方式就行。
第一种是交互式解释器。你在终端(Windows叫命令提示符或PowerShell,macOS叫终端)里输入python,回车后会看到>>>提示符。在这里输入一行,立刻就能看到结果,非常适合验证单条语句。比如你输入print(1 + 1),马上输出2。
第二种是脚本文件。把一段完整的代码写进一个扩展名为.py的文件里,然后在终端运行python 文件名.py,程序就会一口气从头跑到尾。日常写项目、做作业、跑数据分析,用的都是这种方式。
建议新手先养成写脚本的习惯:哪怕只有两行代码,也用文本编辑器存成.py文件再运行。因为交互式解释器不会提醒你保存草稿,关掉窗口你写的东西就没了,而且脚本文件能让你更容易看清整个程序的执行顺序。
1.3 环境准备的极简方案,不纠结版本
装Python这件事,很多人会纠结半天:装2还是装3?装官方版本还是装某个发行版?我的建议是:现在直接装3.x 的最新稳定版,别的不用多想。Python 2已经早就停止维护了,新写的代码没有任何理由再用老版本。
编辑器方面也没必要一步到位。刚开始学基础语句,系统自带的记事本、你手机上随便一个能编辑文本的应用都够用。只要注意保存文件时把后缀写成.py,并且把"文件类型"选成"所有文件",别让系统悄悄给你存成.py.txt就行。等后面写的东西多了,自然会有动力去换一个顺手点的编辑器。
2. 赋值语句与变量:让程序帮你"记住"东西
2.1 变量命名的规则和自由
score = 98,name = "小明",price = 3.5,这几行代码的共同点是:等号左边是变量名,右边是数据,这个动作叫赋值。你可以把变量理解成一个贴了标签的盒子,标签写什么,盒子里就装什么。
变量名不是随便起的,有三条硬规则:第一,只能由字母、数字、下划线组成,像my_name、score2都行;第二,不能以数字开头,2score会直接报语法错误;第三,不能用Python的关键字当名字,比如if、while、for这些词已经被语言本身占用了。有个偷懒的办法:你起完名字之后,如果编辑器或解释器把某个词标成了特殊的颜色,那很可能就是关键字。
剩下的就是自由了。千万别小看命名这件事,我见过太多人变量名全是a、b、c1、c2,代码写完超过十行自己都看不懂。给变量起一个"看了就知道干嘛"的名字,是长期省时间的投入。
2.2 动态类型是特性,不是毛病
Python的变量有个特性会让很多新手惊讶:同一个变量名,先存数字,再存字符串,完全不会报错。
x = 100 x = "我现在是字符串了" print(x)第二行执行之后,变量x就不再指向数字100,而是指向新的字符串。这是Python的动态类型特性,跟Java、C语言那种"一个变量锁定一种类型"的静态语言完全不同。
这个特性给新手带来了便利,比如同一个变量可以随着程序推进存放不同类型的数据。但也带来一个隐患:如果你不小心给变量赋了预料之外的类型,后面做运算时就会报TypeError。后面我会专门讲这个报错,这里你先记住一句话:变量本身没有类型,是变量指向的那个数据有类型。
2.3 多重赋值和链式赋值,很小但很实用
Python允许一行给多个变量赋值,用的场景非常多:
a, b = 1, 2 # a 得到1,b 得到2 x, y = y, x # 交换两个变量的值第二行尤其好用。在C语言里交换两个变量,你得先定义第三个临时变量,Python里一行就搞定了,这个特性在很多算法题里能省不少事。
还有一种是链式赋值:
a = b = 0这行代码让a和b都等于0。不过我要提醒一下:链式赋值在基础类型上没问题,一旦后面学到列表、字典这些可变对象,这种写法会引出一个"其实它们指向同一个对象"的坑。现在不用深究,知道有这回事就行。
2.4 NameError:报错信息里最常见的一个
新手拿到代码敲进去,遇到最多的报错之一就是NameError: name 'xxx' is not defined。意思是:解释器执行到这里,发现xxx这个变量名从来没被赋值过。
原因通常有三种:第一种是拼写错误,比如定义的是score,用的时候写成了socre;第二种是变量还没赋值就开始用了,而计算机是按照从上到下的顺序执行的,没轮到赋值语句,变量自然就不存在;第三种是作用域问题,后面学到函数时才会遇到。
遇到这种报错别慌,看报错信息里提示的是哪个变量名,再去代码里搜这个变量,基本上一眼就能找到问题。
3. 表达式语句与print:让程序开口说话
3.1 print 的默认行为和两个参数
print 大概是你刚开始学Python时用得最多的函数,但很多人其实没搞清楚它的细节。
你写print("a")和print("b"),运行之后是这样:
a b这是因为 print 默认在输出内容后面加了一个换行符。那如果我不想换行,想让两次输出接在同一行,怎么办?可以用end参数:
print("a", end="") print("b", end="") print("c", end="")输出结果就是一行:abc。end=""的意思是"这次输出完,结尾不加任何东西",于是下一个输出就紧跟着来了。反过来,如果你想让输出结束之后加一个符号,比如每个输出后面跟个逗号,可以写end=",",这在打印列表、生成表格类数据时很常用。
还有个sep参数,控制的是同时打印多个值时用什么分隔。默认是空格:
print(1, 2, 3) # 输出:1 2 3 print(1, 2, 3, sep="-") # 输出:1-2-3这两参数都很简单,但关键时刻确实能帮你少写好几行拼接代码。
3.2 格式化输出:三种方式怎么选
如果只是打印一个值,直接写就行。但在真实的代码里,你经常需要把变量的值跟说明文字拼在一起输出。这里有三代写法,新手至少得知道区别。
第一代是百分号格式化,在某些老教程里很常见:
name = "小明" score = 98 print("%s 考了 %d 分" % (name, score))第二代是format 方法,可读性好了一点:
print("{} 考了 {} 分".format(name, score))第三代(也是我推荐你直接用的)是f-string,Python 3.6 之后引入,语法就是在字符串前面加一个f,然后在字符串里面用花括号直接写变量名:
print(f"{name} 考了 {score} 分")三者输出结果完全一样。f-string 的好处是结构最接近你脑子里想表达的那句话,前面拼一个字符串再拼变量的感觉,读起来特别直观。而且它支持直接在花括号里写表达式,比如f"{score + 5}"会直接输出加完之后的结果。
有些培训班还在教百分号格式化,不是说它错,而是新代码没有理由不用更清晰的写法。我自己的习惯是:默认 f-string,除非手头代码本来就是老风格才跟着改。
3.3 字符串拼接的坑:数字不能直接和字符串相加
很多新手试图用+号把文字和数字连起来,比如:
age = 18 print("我今年" + age + "岁")运行会直接崩掉,报TypeError: can only concatenate str (not "int") to str。这个报错翻译过来是:字符串只能跟字符串拼接,你给了一个整数,我不认识。
正确做法有两种,第一种是用str()把数字转成字符串再拼,第二种是直接用 f-string:
print("我今年" + str(age) + "岁") print(f"我今年{age}岁")第二种明显省事。这个报错非常高频,几乎每个学基础语句的人都会撞上,撞上一次你就能记住:数字和文字之间,需要格式化这座桥。
4. 输入语句input与类型转换:完成第一次人机对话
4.1 input 会让程序停下来等你
前面讲的是程序输出内容,现在讲怎么让程序接收用户输入。input()这个函数,是很多基础练习里"人机交互"的开端。
name = input("请输入你的名字:") print(f"你好,{name}!")程序运行到input("请输入你的名字:")时,会在屏幕上显示提示文字,然后停下来等待。你输入几个字符,按回车,输入的内容才会被赋值给变量name。
新手容易有一个误解:以为 input 括号里的字符串会被"输出"到屏幕上。实际上它起到的作用就是"提示",跟 print 做的事情不一样。它们俩经常连在一起用,才给人一种"先输出再收集"的感觉。
4.2 input 永远返回字符串,这不是 bug
这是无数新人栽跟头的地方。不管你在键盘上输入的是什么,input 返回的一定是字符串。
age = input("请输入你的年龄:") print(type(age)) # 输出:<class 'str'>哪怕你输入的是18这个数字,它到了变量age里也是字符串"18",不是整数18。所以如果你直接拿它做数学运算:
age = input("请输入你的年龄:") print(age + 1)就会得到那个眼熟的报错:TypeError: can only concatenate str (not "int") to str。想让它当数字用,必须先做类型转换。
4.3 类型转换的常用句式
Python 提供了几个内置函数用来做类型转换:
int(x):把内容转成整数float(x):把内容转成小数(浮点数)str(x):把内容转成字符串
最常用的场景就是接收用户输入后马上转换:
age = int(input("请输入你的年龄:")) price = float(input("请输入商品价格:"))这里有个细节特别容易踩坑:int()转换要求内容本身是合法的整数形式。你输入18没问题,但输入18.5会报ValueError: invalid literal for int() with base 10: '18.5'。这并不是 Python 不讲理,而是int()的语义是"获取整数部分并转成整数",对于字符串它不会做舍入处理,只接受像"18"、"-5"这样的格式。
那如果用户真的输入了小数怎么办?两个办法:一是用float()接收后再用int()转换结果,即int(float(input(...))),二是对输入内容先做检查,看它是不是一个合法的数字,这就需要后面学到字符串方法或者异常处理再展开了。基础阶段你可以先记住这个组合句式。
4.4 ValueError 的排查思路
ValueError这个报错在输入输出场景里特别常见,核心问题只有一个:你给转换函数的那个数据,不是它期望的格式。
比如int("abc")就会报错,因为"abc"里没有一个字符是数字。排查思路也很简单:回到 input 那一行,想想用户输入什么之后程序才会走到这里,再想想这个输入跟你的转换函数是不是匹配。如果程序面向的是普通人而不是你自己,那就必须假设他们会输入各种奇怪的东西。很多所谓"健壮的程序",不过就是把这种边界情况都想到了而已。
5. 条件语句if:给程序装上"分岔路口"
5.1 if-elif-else 的完整结构
程序不会永远是一条直线走到底的。比如一个登录程序:密码对了就放行,错了就拒绝,这需要程序在某个节点"二选一"。做这个判断的基本语句就是if。
score = int(input("请输入成绩:")) if score >= 60: print("及格了") else: print("没及格")注意两点:第一,if和else那一行的结尾要写冒号,初学者漏掉冒号是最常见的低级错误;第二,条件成立后要执行的代码必须缩进,Python 就是用缩进区分代码块层级的。
如果分支不止两个,就需要elif,它是"else if"的简写:
score = int(input("请输入成绩:")) if score >= 90: print("优秀") elif score >= 60: print("及格") else: print("没及格")程序执行到这里,会从上往下依次判断条件,遇到第一个为真的条件就执行对应的代码块,然后直接跳出整个 if 结构,后面剩余的 elif 和 else 都不再看了。所以条件顺序很重要,如果你把score >= 60放在score >= 90前面,那考95分的人就会先被>= 60拦截,永远走不到"优秀"那里。
5.2 = 和 == 的世纪区别
写条件判断时,最频繁的翻车现场就是把赋值号和比较号搞混。
=是赋值,把右边的值装进左边的变量,比如a = 1==是比较,判断两边的值是否相等,返回True或False
if age = 18: # 错!这是赋值,不是判断 if age == 18: # 对!这是在问"age 是不是等于 18"比较运算符除了==,还有!=(不等于)、>、<、>=、<=。如果你想表达"多个条件同时满足"或"满足其中一个就行",就轮到逻辑运算符出场了:
and:两边都为真,结果才为真or:两边至少一个为真,结果就为真not:真变假,假变真
if score >= 60 and score < 90: print("成绩中游") if name == "admin" or name == "root": print("有管理员权限")5.3 一个没人讲透的细节:什么才是"真"
在 Python 的条件判断里,除了True和False这两个布尔值之外,很多其他类型的值也能直接参与判断,它们会自动被当成真或假。
规则很简单:数字 0 是假,空字符串是假,空列表是假,None 是假,其他的基本都是真。
name = "" if name: print(name) else: print("名字为空")这段代码会输出"名字为空",因为空串被判为假。反过来,if name:在有内容时会走真分支。这种写法在真实项目里极其常见,实际是在说"只要这个变量不是空值,就做点什么"。它比写if name != ""要简洁不少,也是Python社区里很有风格的表达。
还有一个细节:Python 支持链式比较,比如if 60 <= score <= 90:,这种写法在其他语言里是不行的,但在Python里语法是合法的,表达的是"score 在60到90之间"。新手看到别慌,知道有这个语法就行。
6. 循环语句while与for:让程序不知疲倦地重复
6.1 计数器 while 循环,以及怎么防止死循环
计算机最擅长的就是重复劳动。比如你要打印1到100的数字,如果用手写100行print(1)、print(2)……那写代码的人和计算机一样累。这时候就需要循环。先看while:
i = 1 while i <= 5: print(i) i = i + 1while i <= 5:的意思是:只要条件成立,就一直执行缩进里的代码块。这个循环里有一个关键的i = i + 1,它让循环变量每次增加1。等i变成6,条件6 <= 5不成立,循环自然结束。
新手最常见的问题就是忘记写i = i + 1,结果程序陷入死循环,窗口里不断输出数字,停不下来。遇到这种情况,按Ctrl + C可以强制中断程序。不用怪自己,几乎每个学循环的人都经历过。
6.2 for 循环和 range 的配合是入门标配
while循环写法灵活,但容易出问题。在"确定要循环多少次"的场景下,我更推荐for循环:
for i in range(5): print(i)这段代码输出0 1 2 3 4。注意是从0开始的,Python里range(n)生成的是0到n-1这 n 个数,不是1到n。这个"从0开始"的特性也经常让刚接触的人困惑,但等你学了列表下标,就会发现这是完全合理的设定。
range还可以传三个参数:range(起始, 结束, 步长)。
for i in range(1, 11): print(i) # 输出 1 到 10 for i in range(1, 11, 2): print(i) # 输出 1, 3, 5, 7, 9 for i in range(10, 0, -1): print(i) # 输出 10 到 1第三个参数是负数时,循环就会倒着走。这三个句式掌握了,很多循环需求都能直接套。
6.3 break、continue 和循环的 else
循环里还有两个"控制节奏"的语句。break用来提前跳出整个循环:
while True: word = input("输入 exit 退出:") if word == "exit": break这段代码会一直问你要输入,直到你输入exit,遇到break就跳出循环。while True本身是个死循环,但因为有了break,它变成了一个"直到满足条件才退出"的循环,这在写菜单程序、游戏主循环时特别常用。
continue跟break不一样,它只跳过当前这一次循环,直接进入下一次:
for i in range(1, 6): if i == 3: continue print(i)这段代码输出1 2 4 5,数字3被跳过了,但循环并没有停。
还有一个很多新手没见过的特性:循环后面可以跟else。当循环正常结束(没有被break打断)时,else块会执行;如果被break跳出了,else块不执行。这个特性在"检查是否存在某个元素"的场景里特别有用。
7. 把基础语句串成完整小程序:猜数字游戏
7.1 需求拆解:先别急着写代码
学了这么多语句,是时候串起来用了。做一个经典的猜数字小游戏:程序随机生成一个1到100之间的整数,让用户猜,每次输入后提示"大了"还是"小了",直到猜中为止。如果你能完整写出这个程序,说明赋值、input、类型转换、if判断、while循环这几条基础语句你都真正掌握了。
写代码之前先想清楚流程:
- 生成一个随机整数
- 进入循环,循环条件设为"还没猜中"
- 每次循环先让用户输入,并把输入转成整数
- 用 if 判断猜的数字跟目标的大小关系
- 猜中后 break 跳出循环,并输出恭喜语
把流程想清楚再落笔,比直接上手敲要稳得多。这也是程序员跟"代码搬运工"最大的区别。
7.2 完整代码和逐步讲解
import random target = random.randint(1, 100) guess = 0 while guess != target: guess = int(input("请猜一个 1 到 100 之间的数字:")) if guess > target: print("猜大了,再试试。") elif guess < target: print("猜小了,再试试。") else: print("恭喜,猜对了!")第一行import random是导入 Python 自带的随机数模块,random.randint(1, 100)生成1到100之间的随机整数。
guess = 0这行很关键:它既给变量guess一个初始值,又确保第一次判断循环条件时不至于出错。因为目标是1到100之间的数字,guess = 0一定不等于target,所以循环必然进入。如果初始值不小心设成了目标值,循环一次都不会跑,虽然例子中概率极低,但这种"初始值必须保证进入循环"的思路是通用的。
核心逻辑在循环体里:int(input(...))完成输入和类型转换,if-elif-else 根据大小关系给出反馈。因为反馈本身只有一种可能,这个结构写起来非常顺。
这个代码控制在25行以内,逻辑却覆盖了基础语句的方方面面,拿来练手特别合适。
7.3 三个立刻能做的扩展方向
如果这个程序你写出来了,先别急着高兴,试试扩展,比大量刷题有用得多。
第一个扩展是记录猜测次数。加一个count = 0,每次循环里count = count + 1,猜对后输出"你一共猜了多少次"。这个练习训练的是你在一段已有逻辑里追加变量的能力,非常贴近真实开发中"加需求"的感觉。
第二个扩展是猜错时提示范围。比如程序维护一个low = 1和high = 100,猜大了就更新high = guess - 1,猜小了就更新low = guess + 1,然后提示"答案是 x 到 y 之间"。这个扩展会逼你去思考变量之间的互动,比单纯加计数器难一个档次。
第三个扩展是处理非法输入。现在用户如果输入abc,程序会直接报 ValueError 崩溃。你可以先不学异常处理,用input()拿到字符串后判断guess_str.isdigit(),只有它是全数字时才转成整数继续判断。这一扩展做完,你就摸到了"让程序面对真实用户"的门槛。这三个扩展按顺序做完,基础语句的应用能力基本就到位了。
8. 学完基础语句,怎么继续往前走
8.1 我在零基础学员身上看到的高频错误
带了一阵子零基础入门之后,我发现有几类错误几乎是"条件反射"级别的,大家都会踩。提前知道它们,能省不少事。
第一,中英文标点混用。Python 里的冒号、括号、引号、逗号,全部必须是英文半角符号。你在中文输入法下打个逗号,解释器马上给你一个语法错误。这事防不胜防,我自己的做法是写代码的时候先把输入法切成英文,或者用一个能自动纠正的编辑器。写代码时中文标点和英文标点看起来真的很像,尤其是冒号和逗号。
第二,缩进混乱。Python 规定同一个代码块内的缩进必须一致,要么都用空格,要么都用 Tab。我强烈建议只用四个空格,别用 Tab。因为不同的编辑器对 Tab 的解释不一样,你今天在自己电脑上跑得好好的,换个环境就报意外的缩进错误,原因就是 Tab 和空格混用了。在编辑器里打开"显示空格和 Tab"这个选项,一眼就能查出来。
第三,变量名拼写不一致。定义时写的是username,使用的时候写user_name,程序就会报 NameError。这个纯粹是粗心,没有技巧可言,唯一的补救办法是报错之后认真看提示里的变量名,再去代码里搜索。
第四,背代码而不是写代码。这是学习态度问题。基础语句就这么几条,看别人代码觉得"我看懂了",跟亲手写出来的感觉完全不一样。看懂了但写不出来,本质还是没记住。
8.2 下一步最该学什么
如果你已经能独立写出猜数字程序,下面最值得学的东西,按顺序排列是这样的:
- 列表:用来存一堆数据,比如把所有猜测过的数字存起来。
- 字典:用来存"键值对"数据,比如"姓名-成绩"这样的对应关系。
- 函数:把重复的逻辑包起来,让代码可以复用。这是程序结构化的第一步。
- 字符串方法:
split、strip、isdigit等,处理文本的核心工具。 - 文件读写:让程序把数据保存到硬盘上,而不是关掉窗口就丢。
别急着碰爬虫、数据分析、人工智能这些漂亮的名词。基础语句之后,真正能拉开差距的是"你能把想法拆成可执行的步骤,再用语句把它们写出来"的能力。这一步没有捷径,唯一的路就是写小程序、改小程序、拆别人的小程序。
我的体会是,一千个学习Python的人,九百个都倒在"看懂了但没动手"上。这篇讲的基础语句不多,也很简单,但它们是你写出的每一个程序的地基。把这几条语句练到能脱口而出,再往后学,你就能感受到"用代码解决问题"这件事真正的乐趣了。最后说个我自己带人的小习惯:每学完一段基础内容,就逼自己写一个不需要参考任何代码的小程序,写不出来就回头看再写。这个习惯帮了很多人,也推荐给你。