Python 基础语法(1):常量、变量、类型、输入输出与运算符
- 前言
- [1. 常量和表达式](#1. 常量和表达式)
-
- [1.1 把 Python 当成计算器](#1.1 把 Python 当成计算器)
- [1.2 使用表达式计算平均数](#1.2 使用表达式计算平均数)
- [2. 变量和类型](#2. 变量和类型)
-
- [2.1 变量是什么](#2.1 变量是什么)
- [2.2 定义、命名和使用变量](#2.2 定义、命名和使用变量)
- [2.3 Python 的基本数据类型](#2.3 Python 的基本数据类型)
- [2.4 为什么需要类型](#2.4 为什么需要类型)
- [2.5 动态类型特性](#2.5 动态类型特性)
- [3. 注释](#3. 注释)
-
- [3.1 注释的作用和语法](#3.1 注释的作用和语法)
- [3.2 注释的书写规范](#3.2 注释的书写规范)
- [4. 输入输出](#4. 输入输出)
-
- [4.1 程序如何与用户交互](#4.1 程序如何与用户交互)
- [4.2 通过控制台输出](#4.2 通过控制台输出)
- [4.3 通过控制台输入与类型转换](#4.3 通过控制台输入与类型转换)
- [5. 运算符](#5. 运算符)
-
- [5.1 算术运算符](#5.1 算术运算符)
- [5.2 关系运算符](#5.2 关系运算符)
- [5.3 逻辑运算符](#5.3 逻辑运算符)
- [5.4 赋值运算符](#5.4 赋值运算符)
- [6. 自测练习](#6. 自测练习)
- 总结
前言
刚开始学习 Python 时,不必急着挑战复杂项目。先把常量、变量、数据类型、注释、输入输出和运算符这些基础语法学扎实,后面的逻辑判断、循环和函数才会更容易理解。
这一篇从最简单的算术运算出发:先把 Python 当成计算器,再逐步引入变量和类型,接着学习如何写注释、如何与用户交互,最后梳理常见运算符。建议大家把代码亲手运行一遍,尤其留意字符串拼接、输入类型、浮点数比较和短路求值这几个容易踩坑的地方。
1. 常量和表达式
1.1 把 Python 当成计算器
Python 可以直接进行算术运算。下面三行代码分别演示加减、乘法和除法:
python
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
这里的 print 是 Python 的内置函数,用来把结果输出到控制台。算术运算可以使用 +、-、*、/ 和括号 ()。计算顺序与日常数学规则一致:先乘除,后加减,需要改变顺序时使用括号。
运算符和数字之间可以没有空格,也可以有多个空格,但通常保留一个空格,这样代码更美观、更容易阅读。
形如
1 + 2 - 3的算式在编程语言中称为表达式 ,算式的运算结果称为表达式的返回值 。其中1、2、3是字面值常量 ,+、-、*、/是运算符,也叫操作符。
熟悉 C 或 Java 的读者需要注意:在 Python 中,2 / 3 的结果是小数,不会因为两个操作数都是整数就截断小数部分。
1.2 使用表达式计算平均数
给定四个分数 67.5、89.0、12.9、32.2,求它们的平均数,可以直接把求和与除法写进一个表达式:
python
print((67.5 + 89.0 + 12.9 + 32.2) / 4)
代码先计算括号内四个分数的总和,再除以 4,最后由 print 输出表达式的返回值。这个例子只需一步计算,但如果计算过程更复杂,就需要变量来保存中间结果。
2. 变量和类型
2.1 变量是什么
计算四个分数的方差时,需要先求平均值,再计算每个分数与平均值之差的平方,最后求和并除以"项数减一"。这个过程包含多个中间结果,适合使用变量保存:
python
avg = (67.5 + 89.0 + 12.9 + 32.2) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (12.9 - avg) ** 2 + (32.2 - avg) ** 2
result = total / 3
print(result)
代码中的 avg、total 和 result 都是变量,** 表示乘方,** 2 就是求平方。变量的作用类似计算器上的存储功能,只不过 Python 可以创建很多变量,分别保存不同的数据。
变量可以看成一块能够容纳数据的空间,这块空间通常对应计算机的内存。变量名则像空间的标签,程序可以通过标签找到并使用其中的数据。
如果把内存想象成一栋宿舍楼,每个房间都可以存放数据,那么内存容量就相当于房间总量。内存越大,能够容纳的数据也就越多。
2.2 定义、命名和使用变量
Python 定义变量的语法非常直接:
python
a = 10
其中,a 是变量名,赋值运算符 = 表示把右侧的数据放入左侧变量对应的空间。变量命名既有必须遵守的硬性规则,也有提升可读性的建议:
| 类别 | 规则 | 示例或说明 |
|---|---|---|
| 硬性规则 | 变量名由字母、数字和下划线构成 | 可以使用 total_count |
| 硬性规则 | 数字不能作为变量名开头 | 1num 不合法 |
| 硬性规则 | 变量名不能与关键字重复 | 关键字有特殊语法含义 |
| 硬性规则 | 变量名区分大小写 | num 和 Num 是两个变量 |
| 建议规则 | 使用有描述性的单词 | 名称应尽量表达变量用途 |
| 建议规则 | 多个单词可使用驼峰命名法 | 如 totalCount、personInfo |
数学中常使用 x、y、z 表示变量,但一个程序往往会创建很多变量。若全部使用单个字母,代码规模变大后就很难判断每个变量的用途,因此更推荐有明确含义的名字。
定义变量后,可以读取它的值:
python
a = 10
print(a)
也可以重新赋值,修改变量的值:
python
a = 20
print(a)
在 Python 中,定义变量和修改变量都使用 =,从写法上看没有明显区别。还可以把一个变量的值赋给另一个变量:
python
a = 10
b = 20
a = b
print(a)
print(b)
执行 a = b 后,变量 b 的值被赋给 a,因此二者输出的值相同。
2.3 Python 的基本数据类型
变量不仅能保存数字,还能保存文本、真假状态等不同种类的数据。为了区分这些数据,Python 引入了类型。与 C++、Java 等语言不同,Python 不需要在定义变量时显式指定类型,变量类型会在赋值时确定。
整数。 使用 int 表示整数,可以通过内置函数 type 查看变量类型:
python
a = 10
print(type(a))
Python 的 int 表示范围没有固定上限。只要内存足够,理论上可以表示非常大的整数。
浮点数。 小数使用 float 表示:
python
a = 0.5
print(type(a))
Python 的小数只有 float 一种类型,没有 double。Python 的 float 相当于 C++ 或 Java 中的双精度浮点数,占用更多内存,同时具有更高精度,大约可以精确到小数点后 15 位。
字符串。 使用单引号或双引号包裹的内容称为字符串,用于表示文本:
python
a = 'hello'
print(type(a))
在 Python 中,单引号字符串与双引号字符串没有区别,'hello' 和 "hello" 完全等价。可以使用 len 获取字符串长度:
python
a = 'hello'
print(len(a))
两个字符串可以通过 + 拼接:
python
a = 'hello'
b = 'world'
print(a + b)
这里的 + 进行的是字符串拼接。字符串不能直接与整数或浮点数相加。
布尔值。 布尔类型只有 True 和 False 两个取值,分别表示真和假:
python
a = True
print(type(a))
b = False
print(type(b))
布尔值在后续的逻辑判断中非常重要。除了以上类型,Python 还有 list、tuple、dict 和自定义类型等,这些内容后续再展开。
| 类型 | 典型值 | 主要用途或特点 |
|---|---|---|
int |
10 |
表示整数,范围没有固定上限 |
float |
0.5 |
表示小数,相当于双精度浮点数 |
str |
'hello' |
表示文本,可使用 + 拼接 |
bool |
True、False |
表示逻辑上的真与假 |
2.4 为什么需要类型
类型首先决定数据在内存中占据多大空间。例如,一个 float 数据占用 8 个字节。计算机使用二进制表示数据,一个二进制位称为一个比特 ,8 个二进制位称为一个字节 (Byte),因此一个 float 对应 64 个二进制位。
类型还约定了数据能够进行哪些操作。int 和 float 可以进行 +、-、*、/ 等算术运算;str 可以使用 + 拼接,也可以使用 len 获取长度,但不能进行减法、乘法和除法。
类型系统是在对数据进行"归类"。相同类型的数据通常具有相似的特性和使用规则。
2.5 动态类型特性
Python 变量的类型可以在程序运行过程中发生变化,这种特性称为动态类型:
python
a = 10
print(type(a))
a = 'hello'
print(type(a))
程序刚开始执行时,a 是 int;重新赋值后,a 变成了 str。C++、Java 等语言通常不允许变量在定义后改变类型,这种特性称为静态类型。
| 特性 | 动态类型 | 静态类型 |
|---|---|---|
| 类型能否在运行中变化 | 可以 | 通常不可以 |
| 课件中的代表语言 | Python | C++、Java |
| 主要影响 | 中小型程序可减少代码量;大型程序会提高模块交互成本 | 变量定义后类型固定 |
动态类型是一把双刃剑:对于中小型程序,它可以明显减少代码量;对于大型程序,类型会在运行中变化,也可能增加不同模块之间的理解和交互成本。
3. 注释
3.1 注释的作用和语法
注释是一种特殊代码,不会影响程序执行,但能解释代码的作用和执行逻辑,帮助开发者阅读程序。给前面的方差代码加一行说明,目的就一目了然了:
python
# 计算 4 个数字 67.5, 89.0, 12.9, 32.2 的方差
avg = (67.5 + 89.0 + 12.9 + 32.2) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (12.9 - avg) ** 2 + (32.2 - avg) ** 2
result = total / 3
print(result)
代码首先要容易理解,其次才是执行正确。注释不只是写给别人看的,也是写给几个月之后可能已经忘记上下文的自己看的。
Python 中有两种常见的注释风格。第一种是以 # 开头的注释行:
python
# 这是一行注释。
第二种是由三引号包裹的文档字符串。它可以包含多行内容,通常放在文件、函数或类的开头,三双引号和三单引号的写法等价:
python
"""
这是文档字符串
这是文档字符串
"""
3.2 注释的书写规范
注释不是越多越好,关键是准确、适量并且便于维护。
| 规范 | 说明 |
|---|---|
| 内容准确 | 注释应与代码保持一致,代码修改后要及时更新注释 |
| 篇幅合理 | 既不能过于简略,也不应长篇大论 |
| 使用中文 | 国内公司一般要求使用中文注释,外企另当别论 |
| 积极向上 | 注释中不要出现负面、攻击性或不专业的内容 |
4. 输入输出
4.1 程序如何与用户交互
程序需要与用户交互。用户把信息传给程序的过程称为输入 ,程序把结果展示给用户的过程称为输出。
控制台是最基本的输入输出方式:用户通过控制台输入字符串,程序再通过控制台打印字符串。PyCharm 运行程序时下方弹出的窗口,以及 Windows 自带的 cmd,都可以看作控制台。
图形化界面则是更常见的交互方式,例如 QQ、浏览器和 Steam,用户通过窗口和按钮操作。Python 也可以开发图形化程序,但图形化界面本身是一个较大的话题,这里暂不展开。
4.2 通过控制台输出
Python 使用 print 把内容输出到控制台:
python
print('hello')
除了字符串,print 还可以输出其他类型的变量:
python
a = 10
print(a)
b = True
print(b)
如果输出内容需要混合字符串和变量,可以使用 f-string:
python
num = 10
print(f'num = {num}')
以 f 为前缀的字符串称为 f-string,其中可以使用 {} 嵌入变量或表达式。Python 还支持其他字符串格式化方式,这里先掌握最基本的 f-string 即可。
4.3 通过控制台输入与类型转换
Python 使用 input 从控制台读取用户输入:
python
num = 0
num = input('请输入一个整数: ')
print(f'你输入的整数是 {num}')
input 的参数相当于提示信息,也可以省略。需要特别注意:input 的返回值始终是字符串类型 。因此,下面的程序执行 a + b 时,得到的是两个字符串的拼接结果,而不是整数相加:
python
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
print(f'a + b = {a + b}')
如果要进行算术运算,需要先完成类型转换:
python
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
a = int(a)
b = int(b)
print(f'a + b = {a + b}')
int() 可以把数据转换为 int,类似地,float()、bool() 和 str() 可以完成对应的类型转换。
下面输入四个小数,再计算平均值:
python
a = input('请输入第一个数字: ')
b = input('请输入第二个数字: ')
c = input('请输入第三个数字: ')
d = input('请输入第四个数字: ')
a = float(a)
b = float(b)
c = float(c)
d = float(d)
avg = (a + b + c + d) / 4
print(f'平均值: {avg}')
这段代码为了输入四个数字执行了四次 input。如果要读取任意多个数字,就需要使用循环,后续再介绍。
5. 运算符
5.1 算术运算符
+、-、*、/、%、** 和 // 都属于算术运算符。
| 运算符 | 作用 | 需要注意的地方 |
|---|---|---|
+、-、* |
加、减、乘 | 遵循先乘除后加减的顺序 |
/ |
除法 | 除数不能为 0;整数相除也可能得到小数 |
% |
求余数 | 不是百分号含义 |
** |
乘方 | 可以计算整数次方和小数次方 |
// |
取整除法(地板除) | 舍弃小数并向下取整,不是四舍五入 |
除数为 0 时,程序会抛出异常并停止继续执行:
python
print(10 / 0)
异常是编程语言中的常见机制,表示程序运行过程中出现了意外情况,导致程序无法继续向下执行。
Python 使用 / 时,即使是两个整数相除,结果也可能是小数:
python
print(1 / 2)
% 用于求余数。例如 7 除以 2,商为 3,余数为 1:
python
print(7 % 2)
** 用于乘方,并且可以计算小数次方:
python
print(4 ** 2)
print(4 ** 0.5)
// 是取整除法,也叫地板除。它会向下取整,因此负数计算时尤其值得留意:
python
print(7 // 2)
print(-7 // 2)
5.2 关系运算符
<、<=、>、>=、== 和 != 用于比较操作数之间的关系。关系成立时,表达式返回 True;关系不成立时,返回 False。
| 运算符 | 含义 |
|---|---|
< |
小于 |
<= |
小于等于 |
> |
大于 |
>= |
大于等于 |
== |
等于 |
!= |
不等于 |
关系运算符可以比较整数和浮点数:
python
a = 10
b = 20
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
也可以比较字符串:
python
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
字符串可以直接使用 == 和 != 判断内容是否相等。比较大小时采用字典序:想象一本按字母顺序排列的英文词典,先比较第一个字母;第一个字母相同时,再比较第二个字母。单词在词典中越靠前,就认为越小。
对于浮点数,不要直接使用 == 判断是否相等:
python
print(0.1 + 0.2 == 0.3)
浮点数在计算机中的表示并不精确,计算过程可能产生非常小的误差:
python
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
0.1 + 0.2 的结果会带有一个很小的"尾巴",而 == 会严格比较,所以结果为 False。这不是 Python 独有的问题,而是 IEEE 754 浮点数格式带来的现象。
正确思路是不再要求严格相等,而是判断差值是否处于允许的误差范围内:
python
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.000001)
实际工程中误差在所难免,只要把误差控制在合理范围内即可。
5.3 逻辑运算符
Python 的逻辑运算符包括 and、or 和 not。
| 运算符 | 含义 | 结果规则 |
|---|---|---|
and |
并且 | 两侧都为 True 时才为 True,一假则假 |
or |
或者 | 两侧都为 False 时才为 False,一真则真 |
not |
逻辑取反 | True 变为 False,False 变为 True |
python
a = 10
b = 20
c = 30
print(a < b and b < c)
print(a < b and b > c)
print(a > b or b > c)
print(a < b or b > c)
print(not a < b)
print(not a > b)
Python 还支持连续比较,a < b and b < c 等价于 a < b < c,这一写法与很多编程语言不同。
逻辑运算还存在短路求值:
- 对于
and,如果左侧表达式为False,整体一定为False,右侧表达式不再执行。 - 对于
or,如果左侧表达式为True,整体一定为True,右侧表达式不再执行。
python
print(10 > 20 and 10 / 0 == 1)
print(10 < 20 or 10 / 0 == 1)
两行代码都没有抛出除以零异常,说明右侧的 10 / 0 并未真正执行。
5.4 赋值运算符
= 表示赋值,需要和表示相等的 == 区分。除了最基本的单变量赋值,Python 还支持链式赋值和多元赋值:
python
a = b = 10
python
a, b = 10, 20
交换两个变量时,基础写法需要借助临时变量 tmp:
python
a = 10
b = 20
tmp = a
a = b
b = tmp
使用多元赋值可以直接完成交换:
python
a = 10
b = 20
a, b = b, a
Python 还提供 +=、-=、*=、/=、%= 等复合赋值运算符。a += 1 等价于 a = a + 1,其他复合赋值写法同理:
python
a = 10
a = a + 1
print(a)
b = 10
b += 1
print(b)
与 C++、Java 不同,Python 不支持 ++ 和 -- 自增、自减运算符,需要使用 += 1 或 -= 1。这样也避开了前置和后置写法容易混淆的问题。
除了以上内容,Python 还有身份运算符 is、is not,成员运算符 in、not in,以及位运算符 &、|、~、^、<<、>> 等,这里暂不介绍。
6. 自测练习
完成下面三道题,检验自己是否真正理解了变量、类型和基本运算。建议先独立作答,再回到前文逐项核对。
(1)多选:以下关于变量之间加法运算的说法,正确的是:
- A. Python 中的字符串之间能够相加。
- B. Python 中的字符串可以和整数相加。
- C. Python 中的整数可以和浮点数相加。
- D. Python 中的整数可以和布尔值相加。
(2)单选:以下关于类型的说法,正确的是:
- A. Python 中既有字符串类型,也有字符类型。
- B. Python 中既有
float,也有double。 - C. Python 中既有
int,也有long。 - D. Python 中的整数表示范围无上限。
(3)单选:以下 Python 代码,合法的是:
python
# A
int a = 10
# B
a = 10;
# C
a = true
# D
a = 'aaa' + 10
答案如下:
-
多选:A、C、D
A:字符串之间可以使用 + 拼接。
B:字符串不能直接与整数相加。
C:整数可以与浮点数相加,结果通常是 float。
D:布尔值可参与整数运算,True 相当于 1,False 相当于 0。
-
单选:D
Python 的整数使用 int,其表示范围没有固定上限,主要受可用内存限制。
-
单选:B
a = 10;
这段代码合法,只是末尾的分号没有必要。其他选项分别存在语法错误、名称错误或类型错误。
总结
这一节从常量和表达式起步,认识了变量保存中间结果的作用,以及 int、float、str、bool 四种基本类型。Python 具有动态类型特性,变量类型可以在运行过程中改变;类型既影响数据的内存占用,也约定了数据能够执行的操作。随后,我们学习了注释的两种写法,掌握了通过 print 和 input 完成控制台交互的方法,并明确了 input 返回字符串、参与计算前通常需要类型转换。最后梳理了算术、关系、逻辑和赋值运算符,重点认识了地板除、浮点数误差、短路求值、多元赋值和复合赋值。掌握这些内容后,就具备了继续学习逻辑判断、编写更复杂程序的语法基础。