01 Python基础:变量类型、字符串格式化、输入输出与运算符
学习方式:对照黑马 Python+AI 讲义第 2 章第 1 节(数据存储与运算)边看边敲,代码验证文件 01.py。已有 C++/Java 基础,重点记录 Python 与它们的写法差异。
一、变量与动态类型
1.1 变量与字面量
- 字面量:程序中直接书写的固定值,如
10、8.5、"Python"、True、None。
- 变量:存储单个数据的容器,定义格式
变量名 = 值,如 num = 1114.1。
- 动态类型:Python 是动态类型语言,变量不需要声明类型,类型由当前存的值决定,可以反复赋不同类型的值。这是与 C++/Java 静态类型最大的差异。
1 2 3
| a = 10 a = 12.5 a = 'hello'
|
1.2 五大基础数据类型
| 类型 |
说明 |
示例 |
int |
整数 |
10、-5 |
float |
浮点数 |
8.5、3.14 |
str |
字符串 |
"Python" |
bool |
布尔 |
True、False |
NoneType |
空值 |
None |
实际验证(01.py):
1 2 3 4 5 6 7 8 9 10
| a = 10 print(a, type(a)) a = 12.5 print(a, type(a)) a = 'hello' print(a, type(a)) a = True print(a, type(a)) a = None print(a, type(a))
|
注意两点:
- 布尔本质是数字,参与运算时
True 当 1、False 当 0。
- 变量本身没有类型,
type(变量) 输出的是变量中存储的数据的类型。
1.3 类型判断:type() 与 isinstance()
type(数据):返回数据的确切类型(用于调试查看)。
isinstance(数据, 类型):判断数据是否属于某类型,返回布尔,子类也算(面向对象中猫属于动物)。
1 2 3 4
| num = 5.0 print(isinstance(num, int)) print(isinstance(num, float)) print(type(num))
|
写判断逻辑优先用 isinstance,它支持一次判断多个类型(传元组):
1 2
| x = 3.14 print(isinstance(x, (int, float)))
|
两个容易踩的点:
bool 是 int 的子类:isinstance(True, int) 结果为 True。想严格区分布尔,要先 isinstance(x, bool) 或直接用 type(x) == bool。
- 判断 None 不要用
isinstance(x, None)(None 不是类型,会报错),标准写法是 x is None;如果非要用 isinstance,写 isinstance(x, type(None))。判断”非 None 且有内容”用 if x is not None。
二、字符串:定义、拼接与格式化
2.1 三种定义方式
1 2 3 4
| a = 'hello' a = "world" a = """hellowor ld"""
|
2.2 拼接与格式化三种方式
拼接用 +,但只能拼字符串,非字符串必须先 str() 转换;拼接繁琐,实际更常用格式化。
1 2 3 4 5
| name = '小明' age = 21 print(str(name) + "今年" + str(age) + "岁") print('%s 今年 %s 岁' % (name, age)) print(f'{name}今年{age}岁了')
|
三种方式中 f-string 最推荐:直接写 f"{变量}",不用类型转换,可读性最好。
2.3 f-string 进阶格式(组合顺序)
格式说明符完整顺序:对齐 + 宽度 + 千分位 + 精度 + 类型。
1 2 3 4 5 6
| x = 1234.5678 print(f"{x:.2f}") print(f"{x:,.0f}") print(f"{x:>10.1f}") print(f"{x:<10.1f}") print(f"{x:>10,.2f}")
|
| 位置 |
写法 |
示例 |
| 对齐 |
>右、<左、^居中(必须和宽度成对) |
>10 |
| 宽度 |
数字 |
10 |
| 千分位 |
逗号 |
, |
| 精度 |
.数字 |
.2 |
| 类型 |
f 浮点 / d 十进制整数 / % 百分比 / x 十六进制等 |
f |
类型说明符区分:
f 是浮点,可以用精度(:.2f 控制小数位)。
d 是十进制整数,不能用精度(f"{255:.2d}" 会报错),补位用零填充 f"{255:05d}" → 00255,千分位 f"{1234567:,d}" → 1,234,567。
% 也是类型位,排在最后,会自动把值乘 100 再加百分号:f"{0.2567:.1%}" → 25.7%,不要自己再乘一次。
1
| print(f"{1234.5678:>10,.2%}")
|
三、输入输出与类型转换
1 2 3
| name = input('请输入姓名:') age = input('请输入年龄:') print(f'{name}今年{age}岁了')
|
input() 无论键盘输入什么,得到的永远是字符串。要参与数学运算必须先转换类型。
3.2 类型转换
int(数据)、float(数据)、str(数据)、bool(数据)。
实际验证(01.py,输入 50):
1 2 3 4
| a = input() print(a, type(a)) a = int(a) print(a, type(a))
|
3.3 print() 的 sep 与 end
sep 控制多个值之间的分隔符(默认空格),end 控制结尾字符(默认换行):
1
| print(1, 2, 3, sep='~', end='!')
|
3.4 一行输入多个值:split()
1 2 3 4 5 6
| a, b = input().split() print(a, b)
a = '1 2 3 4\n5' print(a.split())
|
四、运算符与表达式
4.1 算术运算符及结果类型
| 运算符 |
含义 |
示例 |
结果 |
/ |
除法,结果永远是浮点 |
5/2 |
2.5(float) |
// |
整除(向下取整) |
5//2 |
2(int) |
% |
取余 |
5%2 |
1 |
** |
幂 |
2**3 |
8 |
实际验证(01.py 的运行结果,注意类型跟随结果变化):
1 2 3 4 5 6
| print("1+2=", 1+2, type(1+2)) print("1+2.3=", 1+2.3, type(1+2.3)) print("5/2=", 5/2, type(5/2)) print("5//2=", 5//2, type(5//2)) print("5%2", 5%2, type(5%2)) print("2**3", 2**3, type(2**3))
|
Python 没有 ++/-- 自增自减,递增写 x += 1。
4.2 浮点精度问题
1 2
| print(0.1+0.2, type(0.1+0.2))
|
二进制无法精确表示所有小数,浮点运算可能损失精度。涉及金额等精确计算不要用 float(见 5.2 Decimal)。
4.3 链式比较
Python 特有(C++/Java 不能这样写),连续比较等价于用 and 连接:
1 2
| print(1 < 2 < 3) print(1 < 2 and 2 < 3)
|
4.4 divmod() 一次拿商和余数
1 2
| q, r = divmod(10, 3) print(q, r)
|
4.5 赋值、比较与逻辑运算符
- 赋值:
= += -= *= /= %= //= **=。
- 比较:
== != > >= < <=,返回布尔。
- 逻辑:
and(与)、or(或)、not(非),对应 C++/Java 的 &&、||、!,是单词不是符号。
判断”在 10-20 之间”:10 <= num <= 20 或 num >= 10 and num <= 20。
五、易踩坑与补充知识点
5.1 round() 是银行家舍入,不是四舍五入
round(x) 取整、round(x, n) 保留 n 位小数,但规则是四舍六入五成双:小数部分正好 .5 时看前一位,偶数舍、奇数进(向偶数靠拢)。
1 2 3 4
| print(round(2.5)) print(round(3.5)) print(round(4.5)) print(round(2.675, 2))
|
f"{2.5:.0f}" 输出也是 2,和 round() 同一套五成双规则,不是真四舍五入。需要四舍五入时:正数用 int(x + 0.5),精确场景用 Decimal 的 ROUND_HALF_UP。
5.2 Decimal:精确十进制,金额计算用它
decimal 模块提供的精确十进制数,解决 float 二进制误差。构造时传字符串,不要传 float(会把误差一起带进来)。
1 2 3 4 5 6 7
| from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))
from decimal import Decimal, ROUND_HALF_UP print(Decimal("2.5").quantize(Decimal("1"), rounding=ROUND_HALF_UP)) print(Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP))
|
5.3 海象运算符 :=(Python 3.8+)
赋值并立即在表达式中使用,省一行:
1 2
| if (n := len("hello")) > 3: print(f"长度是 {n}")
|
5.4 多变量赋值与解包
一条语句给多个变量赋值,交换变量一行搞定,也能把列表元素解包给多个变量:
1 2 3 4 5 6 7
| a, b, c = 100, 200, 300 a, b, c = c, a, b print(a, b, c)
a = [5, 8, 7] z, x, c = a print(z, x, c)
|
今日总结
| 模块 |
核心要点 |
| 变量与类型 |
动态类型不声明;五大类型 int/float/str/bool/NoneType;判断类型用 isinstance(认子类、可多类型),None 用 is None |
| 字符串 |
三引号可多行;格式化首选 f-string;格式顺序=对齐+宽度+千分位+精度+类型;f可设精度、d不能、%自动×100 |
| 输入输出 |
input() 永远是字符串,要转换;print 用 sep/end 控制分隔和结尾;split() 一行取多值 |
| 运算符 |
/ 永远浮点、// 整除、% 取余、** 幂;浮点有精度误差;支持链式比较 1<2<3;divmod() 一次拿商余 |
| 易踩坑 |
round() 五成双不是四舍五入;精确金额用 Decimal(构造传字符串);无 ++/-- 用 += |