跳到主要内容

数据类型与变量

本节定位

这一节让你理解 Python 如何表示和保存数据。变量、数字、字符串、布尔值和类型转换是后面写条件判断、处理表格数据、调用模型 API 的基础,先把这些“最小数据单位”用熟。

学习目标

  • 理解什么是变量,掌握变量的命名规则
  • 掌握 Python 的基本数据类型:整数、浮点数、字符串、布尔值
  • 学会数据类型之间的转换
  • 理解动态类型的含义

什么是变量?

想象变量是一个贴了标签的盒子。你可以把东西放进去,用标签来找到它。

name = "小明"       # 盒子上贴了"name"标签,里面放了"小明"
age = 20 # 盒子上贴了"age"标签,里面放了 20
height = 1.75 # 盒子上贴了"height"标签,里面放了 1.75

= 在 Python 里不是"等于",而是赋值——把右边的值放进左边的盒子里。

# 赋值的方向:从右到左
x = 10 # 把 10 放进 x 这个盒子

# 可以修改盒子里的内容
x = 20 # 现在 x 里面是 20 了(10 被丢掉了)

# 可以用变量的值来计算
y = x + 5 # y = 20 + 5 = 25
print(y) # 输出: 25

变量命名规则

Python 对变量名有一些规定:

规则正确示例错误示例
只能包含字母、数字、下划线user_name, age2user-name, age!
不能以数字开头name11name
不能用 Python 关键字my_classclass, if, for
大小写敏感Namename 是不同变量

命名惯例(不是强制的,但大家都这么做)

# 好的命名 ✅ —— 用小写字母加下划线(snake_case)
student_name = "小明"
learning_rate = 0.001
max_epochs = 100

# 不好的命名 ❌ —— 不是不能用,而是不够清晰
a = "小明" # 看不出来 a 是什么
x1 = 0.001 # x1 代表什么?
SN = "小明" # 缩写太短,别人看不懂
命名的黄金法则

变量名应该让人一眼就知道它是什么。宁可名字长一点(student_count),也不要用看不懂的缩写(sc)。


数字类型

整数(int)

整数就是没有小数点的数字,可以是正数、负数或零。

age = 25
temperature = -10
count = 0
big_number = 1_000_000 # 下划线分隔,方便阅读,等同于 1000000

print(type(age)) # <class 'int'>
type() 函数

type() 可以查看任何值的类型,学习阶段经常会用到,帮你确认变量的类型。

Python 的整数没有大小限制(不像 C/Java 有 int 范围限制):

huge = 99999999999999999999999999999999
print(huge + 1) # 完全没问题

浮点数(float)

浮点数就是带小数点的数字。

pi = 3.14159
weight = 65.5
negative = -0.001

print(type(pi)) # <class 'float'>

注意浮点数的精度问题——这是所有编程语言都有的问题:

>>> 0.1 + 0.2
0.30000000000000004 # 不是精确的 0.3!

这不是 Python 的 bug,而是计算机用二进制存储小数时的固有问题。在 AI 开发中,这个微小的误差通常不影响结果。但如果你做金融计算需要精确结果,可以用 decimal 模块。

整数和浮点数的运算

a = 10
b = 3

print(a + b) # 13 加法
print(a - b) # 7 减法
print(a * b) # 30 乘法
print(a / b) # 3.333... 除法(结果总是 float)
print(a // b) # 3 整除(向下取整)
print(a % b) # 1 取余数
print(a ** b) # 1000 幂运算(10 的 3 次方)

一个常见的坑:

# 除法 / 的结果永远是 float,即使能整除
>>> 10 / 2
5.0 # 不是 5,而是 5.0

# 如果想得到整数结果,用 //
>>> 10 // 2
5

字符串(str)

字符串就是文本——一串字符。用引号包裹。

创建字符串

# 单引号和双引号都可以,效果一样
name = '小明'
greeting = "你好"

# 如果字符串里有引号,用另一种引号包裹
sentence = "他说:'你好'"
sentence2 = '英文名叫 "Tom"'

# 三引号:可以写多行文本
poem = """
静夜思
床前明月光,
疑是地上霜。
"""
print(poem)

print(type(name)) # <class 'str'>

字符串拼接

first_name = "张"
last_name = "三"

# 方法 1:用 + 拼接
full_name = first_name + last_name
print(full_name) # 张三

# 方法 2:用 f-string(推荐!Python 3.6+)
age = 20
intro = f"我叫{full_name},今年{age}岁"
print(intro) # 我叫张三,今年20岁

# 方法 3:用 format()
intro2 = "我叫{},今年{}岁".format(full_name, age)
print(intro2) # 我叫张三,今年20岁
f-string 是最佳实践

f-string(f"...{变量}...")是现代 Python 中最常用的字符串格式化方式,简洁直观。后面的课程中我们会大量使用它。

常用字符串操作

text = "Hello, Python!"

# 获取长度
print(len(text)) # 14

# 大小写转换
print(text.upper()) # HELLO, PYTHON!
print(text.lower()) # hello, python!

# 查找子字符串
print(text.find("Python")) # 7(从第 7 个位置开始)
print("Python" in text) # True

# 替换
print(text.replace("Python", "AI")) # Hello, AI!

# 去除首尾空白
messy = " hello "
print(messy.strip()) # "hello"

# 分割
csv_line = "张三,20,北京"
parts = csv_line.split(",")
print(parts) # ['张三', '20', '北京']

字符串索引和切片

字符串里的每个字符都有一个位置编号(索引),从 0 开始:

text = "Python"
# P y t h o n
# 索引: 0 1 2 3 4 5
# 负索引: -6 -5 -4 -3 -2 -1

print(text[0]) # P(第一个字符)
print(text[5]) # n(第六个字符)
print(text[-1]) # n(最后一个字符)
print(text[-2]) # o(倒数第二个字符)

切片可以取出一段子字符串:

text = "Python"

print(text[0:3]) # Pyt(从索引0到索引3,不包含3)
print(text[2:5]) # tho
print(text[:3]) # Pyt(从头开始,可以省略 0)
print(text[3:]) # hon(到末尾,可以省略结束位置)
print(text[:]) # Python(整个字符串的拷贝)
print(text[::2]) # Pto(每隔一个字符取一个)
print(text[::-1]) # nohtyP(反转字符串!)
切片语法

text[start:stop:step] —— 从 start 开始,到 stop 结束(不包含),每 step 个取一个。记住:左闭右开(包含起始,不包含结束)。

字符串是不可变的

text = "Hello"
# text[0] = "h" # 报错!TypeError: 'str' object does not support item assignment

# 如果想修改,需要创建新字符串
text = "h" + text[1:] # "hello"

布尔值(bool)

布尔值只有两个:True(真)和 False(假)。注意首字母大写。

is_student = True
is_raining = False

print(type(is_student)) # <class 'bool'>

布尔值通常来自比较运算

print(5 > 3)       # True
print(5 < 3) # False
print(5 == 5) # True(注意是两个等号,一个等号是赋值)
print(5 != 3) # True(!= 表示不等于)
print("abc" == "abc") # True

布尔值在后面学习流程控制(if/else)时会大量使用。

真值和假值

在 Python 中,很多东西可以被当作布尔值使用。以下值被认为是"假":

# 以下都是 "假值"(Falsy)
bool(0) # False
bool(0.0) # False
bool("") # False(空字符串)
bool([]) # False(空列表)
bool(None) # False

# 其他都是 "真值"(Truthy)
bool(1) # True
bool(-1) # True(非零就是真)
bool("hello") # True(非空字符串就是真)
bool([1, 2]) # True(非空列表就是真)

None 类型

None 是 Python 中的特殊值,表示**"什么都没有"**。

result = None
print(result) # None
print(type(result)) # <class 'NoneType'>

None 常用来表示"还没有值"或"没有结果":

# 函数没有返回值时,默认返回 None
def say_hello():
print("Hello!")

result = say_hello() # 打印 Hello!
print(result) # None

类型转换

有时候你需要把一种类型转换成另一种。

# 字符串 → 数字
age_str = "25"
age = int(age_str) # 字符串转整数
print(age + 1) # 26

price_str = "99.9"
price = float(price_str) # 字符串转浮点数
print(price) # 99.9

# 数字 → 字符串
score = 95
score_str = str(score) # 整数转字符串
print("分数: " + score_str) # 分数: 95

# 整数 ↔ 浮点数
x = int(3.7) # 3(直接截断小数部分,不是四舍五入)
y = float(5) # 5.0

常见错误:字符串和数字不能直接用 + 拼接

age = 20
# print("年龄: " + age) # 报错!TypeError

# 正确做法 1:转成字符串
print("年龄: " + str(age))

# 正确做法 2:用 f-string(推荐)
print(f"年龄: {age}")

# 正确做法 3:用逗号分隔(print 会自动加空格)
print("年龄:", age)

类型转换速查表

转换函数示例结果
→ 整数int()int("25")25
→ 浮点数float()float("3.14")3.14
→ 字符串str()str(100)"100"
→ 布尔值bool()bool(0)False

动态类型

Python 是动态类型语言——变量不需要提前声明类型,而且同一个变量可以随时换类型。

x = 10          # x 是整数
print(type(x)) # <class 'int'>

x = "hello" # 现在 x 变成字符串了
print(type(x)) # <class 'str'>

x = True # 现在 x 又变成布尔值了
print(type(x)) # <class 'bool'>

这很灵活,但也要小心——别把一个本来存数字的变量意外改成了字符串。

对比一下 Java(静态类型语言):

int x = 10;       // 声明 x 是整数
x = "hello"; // 报错!Java 不允许改变类型

多重赋值

Python 支持一些便捷的赋值方式:

# 同时给多个变量赋值
a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3

# 交换两个变量的值(Python 独有的简洁写法)
a, b = b, a
print(a, b) # 2 1

# 多个变量赋同一个值
x = y = z = 0
print(x, y, z) # 0 0 0

交换变量这个写法非常 Pythonic(Python 风格),在其他语言里通常需要一个临时变量:

# 其他语言的写法
temp = a
a = b
b = temp

# Python 的写法
a, b = b, a # 一行搞定!

动手练习

练习 1:个人信息卡

创建变量存储你的信息,然后用 f-string 打印出来:

name = "你的名字"
age = 25
city = "你的城市"
is_student = True

print(f"姓名: {name}")
print(f"年龄: {age}")
print(f"城市: {city}")
print(f"是否学生: {is_student}")
print(f"明年我就 {age + 1} 岁了")

练习 2:温度转换器

摄氏度转华氏度的公式:F = C × 9/5 + 32

celsius = 37.5
fahrenheit = celsius * 9 / 5 + 32
print(f"{celsius}°C = {fahrenheit}°F")

试着修改 celsius 的值,算几个不同温度的结果。

练习 3:字符串操作

email = "  [email protected]  "

# 1. 去掉首尾空格
# 2. 转成小写
# 3. 找出 @ 的位置
# 4. 取出用户名部分(@ 前面的部分)

提示:可以组合使用 .strip().lower().find()、切片。

练习 4:类型侦探

type() 检查以下每个值的类型,先猜再验证:

print(type(42))
print(type(3.14))
print(type("3.14"))
print(type(True))
print(type(None))
print(type(1 + 2))
print(type(1 + 2.0)) # 整数 + 浮点数 = ?
print(type("1" + "2")) # 字符串 + 字符串 = ?

小结

类型关键字示例用途
整数int42, -10, 0计数、索引
浮点数float3.14, -0.5精确数值、科学计算
字符串str"hello", 'world'文本数据
布尔值boolTrue, False条件判断
空值NoneTypeNone表示"没有值"
核心理解

Python 中一切皆对象。数字是对象,字符串是对象,甚至 TrueNone 也是对象。每个对象都有一个类型(type),类型决定了你能对它做什么操作。