1-Python语法基础
约 5870 字大约 20 分钟
2026-10-30
说起"编程",很多同学的第一反应是神秘、遥远、是大神们的专属技能。其实程序离我们比想象中近得多:手机里的每一个APP、买票用的选座页面、学校教务系统里查成绩的界面,背后都是一段段程序。程序说白了就是一份"指令清单"——用计算机听得懂的语言,把做事的步骤一条条写清楚,让机器替我们执行。人写得慢还容易累,机器执行起来又快又不出错,这就是程序存在的意义。
那么,入门编程为什么选Python?因为它大概是所有主流语言里最像"人话"的一门:别的语言要写五六行才能完成的任务,Python常常一行就够;它又能文能武——网站开发、数据分析、人工智能、自动化办公,处处都有它的身影。在数据分析、人工智能领域,Python更是事实上的标准语言。江湖上有句名言:"Life is short, you need Python"(人生苦短,我用Python),说的就是它帮程序员省下的每一行代码,都是省下的生命。
本章是全书的第一站,分三步走:第一步认识Python——它从哪里来、靠什么运行、用什么软件写代码,把环境搭好;第二步学习变量与基本数据类型——这是程序"记住"数据的方式;第三步学习运算符与表达式——这是程序"加工"数据的工具。学完本章,你就能独立写出"输入三门课成绩、输出总分和平均分"的真实小程序——全书贯穿始终的"成绩管理"故事,从这一章正式开演。
【学习目标】
知识目标
了解Python的发展历程、版本演进和主要应用领域。
理解解释型语言的特点,掌握交互模式和脚本模式两种运行方式。
掌握变量的定义、赋值、命名规则与命名规范。
掌握int、float、str、bool四种基本数据类型,会使用type()查看类型。
掌握input()、print()的基本用法和int()、float()、str()类型转换。
掌握算术、赋值、比较三类运算符及运算符优先级规则。
能力目标
能够安装Python解释器和PyCharm,独立完成"新建项目、编写、保存、运行"的完整流程。
能够编写"输入—处理—输出"三段式结构的简单程序。
能够运用算术运算符完成总分、平均分等基本计算。
素养目标
感受Python简洁优雅的代码文化,建立"代码是写给人看的"意识。
养成规范命名、适当注释的良好编程习惯。
培养敢动手、多试验的学习习惯——编程是练出来的,不是看出来的。
1.初识Python
1.1 Python的发展历史
Python的诞生故事在编程圈里流传很广,甚至有点浪漫:1989年圣诞节,荷兰人Guido van Rossum(社区尊称"龟叔")所在的研究所放假闭馆,他不想让假期虚度,决定动手实现一个酝酿已久的想法——写一门新的脚本语言。1991年,第一个版本正式发布。有趣的是,Python这个名字并非来自蟒蛇,而是来自龟叔喜爱的英国喜剧团体Monty Python(蒙提·派森)——至于后来官方Logo干脆用了两条蛇,算是将错就错的一个可爱误会。
此后Python的版本一路演进:2000年发布2.0版;2008年发布3.0版。3.x与2.x互不兼容,是龟叔团队痛下决心的"断舍离"——修正了2.x时代积累的大量历史包袱(比如print从语句变成了函数)。过渡期里两个版本并行维护了十来年,2020年1月1日官方彻底停止维护2.x。今天的学习者不用再纠结版本问题:直接学3.x,本书全部代码都基于Python 3。
Python为什么能火遍全球?看一段对比就明白了。同样是打印一句"Hello World":
代码 1-1:三种语言打印"Hello World"的对比
// C语言版
#include <stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
// Java语言版
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
# Python语言版
print("Hello World")C和Java要先搭一堆"框架代码"才能干活,Python开门见山一句搞定。这种简洁不是偷工减料,而是设计哲学:Python官方有句信条——"应该有一种——最好只有一种——显而易见的方式来做一件事"。再加上它在Web开发、数据分析、人工智能、自动化办公、网络爬虫等领域的广泛应用,以及几十万个随取随用的第三方库(第六章会专门学习),Python常年占据编程语言排行榜第一梯队,也成了绝大多数人入门编程的首选。
1.2 解释器与Python的运行方式
计算机只认机器码,我们写的Python代码它是看不懂的,中间必须有一位"翻译"。按照翻译方式的不同,语言分两大阵营:C语言这类是编译型——像把整本书翻译完再出版,翻译一次,到处运行,速度快;Python这类是解释型——像同声传译,解释器(Interpreter)拿着代码逐行读、逐行执行。解释型的好处是即写即跑、随手就能做实验(马上就能体验到),代价是运行速度比编译型慢——不过对初学者的程序来说,这点差别完全无感。
从官网python.org下载的Python,里面自带的就是官方解释器(因为它是用C语言实现的,所以也叫CPython)。装好之后,就有两种使用Python的方式。
第一种是交互模式:打开命令行窗口,输入python回车,出现>>>提示符,就进入了"一问一答"的状态——敲一行代码,立刻看到结果:
>>> print("Hello World")
Hello World
>>> 8 * 8
64
>>> exit()交互模式像一台超级计算器,特别适合验证"这个写法到底行不行",学到新知识随时来试。退出用exit()。
第二种是脚本模式:把代码写进一个.py文件(比如hello.py),整个文件交给解释器从头执行。这才是写正式程序的方式——交互模式里敲的代码,关掉窗口就没了,脚本文件却能保存、修改、反复运行、发给别人。本书后面所有代码都以脚本模式为准。
现在正式写下第一个程序:
代码 1-2:第一个Python程序
# 这是注释:我的第一个Python程序
print("Hello World!")
print("你好,Python!")
print(1 + 2 + 3) # print里可以写表达式,先算好再打印程序运行效果如下:
Hello World!
你好,Python!
6两处细节说明。其一,#开头的一行是注释——写给人看的说明文字,解释器直接忽略。注释不用多,但关键处要有,"代码千万行,注释第一行"。其二,print()是打印函数(函数的完整概念第五章才讲,现在把它当成一个"打印命令"用就行),括号里放什么它就打印什么:文本要用引号包住,数字和表达式可以直接写。
1.3 编辑软件与开发环境
写Python代码,用什么软件都行——记事本也能写,但专业工具能让效率翻倍。这里介绍三款常见的,本书主讲PyCharm。
IDLE:Python安装包自带的轻量编辑器,双击就能用,无需任何配置。头几节课用它敲小程序很顺手,但它功能简单,不适合开发正式项目。
VS Code:微软出品的免费编辑器,轻快、插件丰富,装上Python扩展后写Python体验很好。它是个"多面手",以后写网页、写其他语言也常用它。
PyCharm:JetBrains出品的Python专用IDE(集成开发环境),也是本书的主力工具。它把编辑器、解释器、调试器、项目管理集成在一起:代码自动补全、拼写错误即时标红、运行结果一目了然。PyCharm分专业版(Professional,收费,面向企业开发)和社区版(Community,免费开源)——学习阶段用社区版完全够用,官网jetbrains.com即可下载。
环境搭建只需两步。第一步,安装Python解释器:官网python.org下载安装包,安装时务必勾选"Add Python to PATH"(把Python加入系统路径,否则命令行找不到它)。第二步,安装PyCharm社区版,一路默认即可。然后在PyCharm里走一遍完整流程:
- New Project新建项目,Python Interpreter一项选刚才装好的解释器;
- 在项目上右键,New → Python File,给文件起名(如hello.py);
- 在编辑区写代码;
- 在编辑区右键,Run 'hello'(或点右上角绿色三角);
- 窗口下方立刻显示运行结果。
建议从今天起养成三个习惯:一个程序一个.py文件;文件名用英文小写加数字(如chapter01_demo.py,别用中文和空格);写完随手Ctrl+S保存。环境是工具,趁手就行,别在挑选工具上花太多时间——把精力留给代码本身。
2.变量与基本数据类型
2.1 什么是变量
程序要处理数据,数据就得有地方存放。变量(Variable)就是存放数据的基本容器,可以把它想象成一个贴了标签的盒子:盒子里装的是数据,标签是变量名,程序通过标签来取用和更换盒里的东西。
代码 1-3:变量的定义与使用
score = 85 # 把85装进盒子,贴上标签score
print(score) # 通过标签取值:85
name = "张三" # 装一个字符串
print(name) # 张三
score = 92 # 撕下旧值,装上新值——"变量"名副其实
print(score) # 92score = 85这行叫赋值语句。要特别强调:这里的=不是数学里的"相等",而是"赋值"——把右边算好的结果,交给左边的变量。执行顺序永远是先右后左。理解了这一点,就能看懂一行"数学上不成立"的代码:x = x + 1,它的意思是"取出x的旧值,加1,再存回x"。这行代码不是笔误,而是第二章循环里天天要用的"累加"套路。
变量名不能随便起,Python定了一套规则,见表1-1。
表 1-1:变量命名规则与规范
| 类别 | 要求 | 正例 | 反例 |
|---|---|---|---|
| 组成字符(硬规则) | 只能由字母、数字、下划线组成 | score、math_score_1 | my-score、math score |
| 开头(硬规则) | 数字不能开头 | score2 | 2score |
| 大小写(硬规则) | 严格区分大小写 | Score与score是两个变量 | —— |
| 保留字(硬规则) | if、for、while等保留字不能当变量名 | —— | if = 1 |
| 规范(软性建议) | 见名知义;全小写加下划线 | chinese_score、average | a、b、xm1、cj |
硬规则违反了直接报错,软规范违反了程序照样跑——但看代码的人(包括三个月后的你自己)会痛苦。取名的功夫从第一天就练:存语文成绩就叫chinese_score,别叫cs——cs是"成绩"还是"参数"?没人猜得出。
2.2 基本数据类型
盒子里的数据是有"规格"的,这个规格就是数据类型。Python最基本的数据类型有四种,见表1-2。
表 1-2:四种基本数据类型
| 类型 | 名称 | 示例 | 说明 |
|---|---|---|---|
| int | 整数 | 85、0、-3 | 不带小数点的数 |
| float | 浮点数 | 92.5、-0.5、3.0 | 带小数点的数 |
| str | 字符串 | "张三"、'Python' | 引号包起来的文本 |
| bool | 布尔 | True、False | 只有这两个值,首字母必须大写 |
想知道某个变量是什么类型,用type()一查便知:
代码 1-4:type()查看数据类型
score = 85
price = 92.5
name = "张三"
passed = True
print(type(score)) # <class 'int'>
print(type(price)) # <class 'float'>
print(type(name)) # <class 'str'>
print(type(passed)) # <class 'bool'>有三个要点。第一,85和"85"是完全不同的两种数据:前者是int,能参与加减乘除;后者是str,是一段长得像数字的文本。这个区别马上在输入一节就会闯祸,请留意。第二,bool类型的True和False首字母必须大写,写成true会被Python当成一个没定义的变量名而报错。别看bool只有两个值,第二章的if判断、循环条件,全靠它发号施令。第三,字符串是最常用的类型,也是内容最丰富的类型——怎么从一串文字里取出某几个字、怎么统计、怎么替换,第三章会用一整章来展开。
2.3 输入与输出
一个有实用价值的程序,基本都遵循"三部曲":输入(拿到数据)→ 处理(加工数据)→ 输出(展示结果)。负责输入输出的是两个内置函数:input()和print()。
代码 1-5:input()的用法和一个大坑
name = input("请输入你的姓名:")
print("你好," + name + "!")
age = input("请输入你的年龄:")
print(age + 1) # 报错!TypeError: can only concatenate str (not "int") to str程序运行效果如下(输入部分用【】标注):
请输入你的姓名:【张三】
你好,张三!
请输入你的年龄:【18】
Traceback (most recent call last):
...
TypeError: can only concatenate str (not "int") to strprint(age + 1)为什么炸了?因为input()的返回值永远是字符串——用户输入18,拿到的是文本"18",不是数字18,文本加数字,Python直接罢工。这是初学者的第一大坑,几乎人人踩过。解决办法:用转换函数把文本转成数字,再用。三个转换函数见表1-3。
表 1-3:常用类型转换函数
| 函数 | 作用 | 示例 | 结果 |
|---|---|---|---|
| int() | 转成整数 | int("85")、int(92.5) | 85、92(直接砍掉小数,不四舍五入) |
| float() | 转成小数 | float("92.5")、float(85) | 92.5、85.0 |
| str() | 转成字符串 | str(85)、str(True) | "85"、"True" |
两个细节:int("85")没问题,但int("92.5")会报错——文本"92.5"不是合法的整数格式;int(92.5)得到92,它是直接截断而非四舍五入。掌握了转换函数,上面的坑这样填:
代码 1-6:类型转换与print()的常用用法
# 输入的同时完成转换:input()套上int()
age = int(input("请输入你的年龄:"))
print("明年你就" + str(age + 1) + "岁了")
# float()接收小数
height = float(input("请输入身高(米):"))
# print()用逗号可以一次打印多个内容,自动用空格隔开
print("年龄:", age, "身高:", height)程序运行效果如下(输入部分用【】标注):
请输入你的年龄:【18】
明年你就19岁了
请输入身高(米):【1.75】
年龄: 18 身高: 1.75input("提示语")外面套一层int(),是最常用的组合拳——输入整数都是这么写的。输出方面:+号可以把字符串首尾相连(拼接),但+号两边必须都是字符串,所以数字要先用str()转一下;嫌麻烦的话,用逗号一次打印多个内容也行,代价是逗号分隔的地方会多一个空格。至于"把数字按想要的格式填进文字模板"这种更优雅的输出方式,第三章的字符串格式化会专门解决。
【例题 1-1】个人信息卡
请编写一个"个人信息卡"程序:输入姓名、年龄、身高(米),程序输出一张信息卡,并自动算出明年的年龄和以厘米为单位的身高。
分析:输入三项信息——姓名是字符串直接用,年龄要转int,身高要转float;加工两项数据——明年年龄=年龄+1,身高厘米=身高×100;最后逐行输出。
代码 1-7:个人信息卡程序
# 第一步:录入信息
name = input("请输入姓名:")
age = int(input("请输入年龄:"))
height = float(input("请输入身高(米):"))
# 第二步:加工数据
age_next = age + 1
height_cm = height * 100
# 第三步:输出信息卡
print("========================")
print("姓名:" + name)
print("年龄:" + str(age) + "岁")
print("明年年龄:" + str(age_next) + "岁")
print("身高:" + str(height_cm) + "厘米")
print("========================")程序运行效果如下(输入部分用【】标注):
请输入姓名:【张三】
请输入年龄:【18】
请输入身高(米):【1.75】
========================
姓名:张三
年龄:18岁
明年年龄:19岁
身高:175.0厘米
========================这个程序麻雀虽小,五脏俱全:变量存数据、类型转换进出、算术运算加工、"输入—处理—输出"三段式结构,全章知识都过了一遍。顺带留意一个小遗憾:身高那行打印出来是"175.0厘米",带着个多余的.0——怎么让输出更美观?这是第三章字符串格式化的开场戏,先把问题记下。
3.运算符与表达式
3.1 算术运算符
数据进了程序,就要加工,加工靠运算符。Python的算术运算符共七个,见表1-4。
表 1-4:算术运算符
| 运算符 | 名称 | 示例 | 结果 | 备注 |
|---|---|---|---|---|
| + | 加 | 7 + 2 | 9 | |
| - | 减 | 7 - 2 | 5 | |
| * | 乘 | 7 * 2 | 14 | |
| / | 除 | 7 / 2 | 3.5 | 结果一定是小数 |
| // | 整除 | 7 // 2 | 3 | 只留整数部分 |
| % | 取余 | 7 % 2 | 1 | 7除以2,商3余1 |
| ** | 乘方 | 7 ** 2 | 49 | 也可开方,见下例 |
代码 1-8:算术运算符体验
print(7 / 2) # 3.5:除法结果一定是小数
print(6 / 2) # 3.0:哪怕能整除,结果也是小数
print(7 // 2) # 3:整除,只留整数部分
print(7 % 2) # 1:取余数
print(2 ** 10) # 1024:乘方
print(9 ** 0.5) # 3.0:0.5次方就是开平方
# 取余的两大经典用途
print(2024 % 2) # 0:余数是0,说明2024是偶数
print(185 % 10) # 5:对10取余,取出185的个位程序运行效果如下:
3.5
3.0
3
1
1024
3.0
0
5最需要划重点的是/和//的区别:/是真除法,结果永远是float(6 / 2得到3.0而不是3);//是整除,只要商的整数部分。而%取余看着不起眼,却是个宝藏运算符:判断奇偶(对2取余看余数是不是0)、判断整除(第二章的闰年判断全靠它)、取出个位数(对10取余),后面章节到处是它的舞台。
3.2 赋值运算符
3.1节说过,=是赋值:把右边的值交给左边的变量。赋值运算符家族里还有几位"缩写版"成员——复合赋值运算符:
代码 1-9:赋值与复合赋值
total = 0 # 基本赋值
total = total + 85 # 先算右边(0 + 85),再把结果存回total
print(total) # 85
# 上行代码的简写版:
total += 92 # 等价于 total = total + 92
print(total) # 177
total -= 50 # 等价于 total = total - 50
print(total) # 127
total *= 2 # 等价于 total = total * 2
print(total) # 254程序运行效果如下:
85
177
127
254+=读作"自身加上":total += 92就是"total在原来的基础上加92"。减、乘、除同理(-=、*=、/=)。别小看这些缩写——第二章循环里"累加器"total += score、"计数器"count += 1会天天出现,现在混个脸熟,届时一点就通。
3.3 比较运算符
程序经常要回答"是不是"的问题:成绩及格了吗?年龄满18了吗?这类问题用比较运算符提出,答案只有True或False两种:
代码 1-10:比较运算符
score = 85
print(score > 60) # True
print(score == 85) # True:两个等号才是"判断相等"
print(score != 90) # True:!=是"不等于"
print(score >= 90) # False
print(score <= 85) # True
print("张三" == "张三") # True:字符串也能比较是否相同程序运行效果如下:
True
True
True
False
True
True比较运算符共六个:(相等)、!=(不等)、>、<、>=、<=,运算结果是bool类型。最容易出错的地方提前预警:一个等号=是赋值,两个等号才是比较——这个笔误第二章讲if时会重点围剿,这里先把规矩立下。另外注意,比较出来的True/False可以像普通数据一样存进变量、打印出来,第二章的if语句,本质上就是"看这个值是不是True"来决定走哪条路。
3.4 运算符优先级
一个表达式里出现多个运算符时,谁先算谁后算,由优先级决定。基本规矩和数学一致:先乘除后加减,括号最优先:
代码 1-11:运算符优先级
print(2 + 3 * 4) # 14:先乘后加,和数学一样
print((2 + 3) * 4) # 20:括号最优先
print(10 - 4 - 3) # 3:同级运算从左到右
print(2 ** 3 ** 2) # 512:乘方是特例,从右往左(3**2=9,2**9=512)
print(1 + 2 > 2) # True:先算术(1+2=3),再比较(3>2)程序运行效果如下:
14
20
3
512
True本章涉及的运算符优先级从高到低汇总见表1-5。
表 1-5:运算符优先级(从高到低)
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1 | () | 括号最优先,拿不准就加括号 |
| 2 | ** | 乘方 |
| 3 | *、/、//、% | 乘、除、整除、取余 |
| 4 | +、- | 加、减 |
| 5 | >、<、>=、<=、==、!= | 比较运算,结果为True/False |
| 6 | =、+=、-=、*=、/= | 赋值运算,优先级最低 |
记不全没关系,专业建议就一条:优先级拿不准时,加括号。括号不影响性能,只提升可读性——代码首先是写给人看的。另外提一句:Python还有&、|、<<、>>这类位运算符,直接操作整数的二进制位,用在硬件、加密等底层场景,本课程用不到,知道有这么回事即可。
【例题 1-2】三门课成绩统计
请编写程序:输入语文、数学、Python三门课的成绩,程序输出总分和平均分,并回答"平均分是否超过60分"。
分析:成绩是整数,输入时套int()转换;总分用加法,平均分用除法;最后一问用比较运算符,结果正好是True/False。这道题是全书"成绩管理"主线的起点,后面每一章都会把它升级一次。
代码 1-12:三门课成绩统计
# 第一步:录入三门课成绩
chinese = int(input("请输入语文成绩:"))
math = int(input("请输入数学成绩:"))
python_score = int(input("请输入Python成绩:"))
# 第二步:计算
total = chinese + math + python_score
average = total / 3
# 第三步:输出
print("========================")
print("总分:" + str(total) + "分")
print("平均分:" + str(average) + "分")
print("平均分超过60分了吗?", average > 60)程序运行效果如下(输入部分用【】标注):
请输入语文成绩:【85】
请输入数学成绩:【92】
请输入Python成绩:【78】
========================
总分:255分
平均分:85.0分
平均分超过60分了吗? True程序虽短,已集齐全章要素:三个int变量存成绩、算术运算算总分与平均分、比较运算回答判断题、str()配合+完成拼接输出。同时也暴露了三个"下一章的引子":程序只会从上往下执行,如果想让"不及格就提示补考",需要第二章的分支;三门课只用了三个变量,要是全班50个人呢?需要第三章的容器;平均分"85.0"不够美观,同样在第三章的字符串格式化里解决。带着这些问题,进入第二章——控制程序的走向。
