前言
Python 之所以能成为最适合初学者的编程语言之一,很大程度上源于它简洁灵活的数据类型系统。与 Java、C++ 等静态类型语言不同,Python 采用动态类型机制,变量不需要声明类型,赋值即定义。这种设计让编程变得更加直观,但你是否真正理解 Python 是如何管理这些数据的?本文将深入讲解变量与数据类型的方方面面。
一、变量:数据的容器
1.1 什么是变量?
变量是编程中最基本的概念之一------它是存储数据的"容器",相当于一个贴了标签的盒子,盒子里放的是什么数据,标签就是变量名。
在 Python 中,创建变量只需要直接赋值:
ini
name = "张三" # 字符串
age = 25 # 整数
height = 1.75 # 浮点数
is_student = True # 布尔值
1.2 变量命名规则
Python 的变量名不是随便写的,必须遵守以下规则:
| 规则 | 正确示例 | 错误示例 | 原因 |
|---|---|---|---|
| 由字母、数字、下划线组成 | user_name |
user-name |
- 不是合法字符 |
| 不能以数字开头 | name2 |
2name |
数字开头非法 |
| 不能使用保留关键字 | class_ |
class |
class 是关键字 |
| 区分大小写 | Name ≠ name |
--- | Python 大小写敏感 |
保留关键字(不能用作变量名):
python
# Python 3.10 保留关键字
False, None, True, and, as, assert, async, await,
break, class, continue, def, del, elif, else, except,
finally, for, from, global, if, import, in, is,
lambda, nonlocal, not, or, pass, raise, return,
try, while, with, yield
1.3 命名风格规范
Python 官方 PEP8 规范推荐使用 snake_case(蛇形命名法) :
ini
# ✅ 推荐的命名风格
user_name = "张三"
max_value = 100
is_valid = True
calculate_area = lambda r: 3.14 * r * r
# ❌ 不推荐的风格(驼峰命名在 Python 中不常见)
userName = "张三" # 驼峰式
MaxValue = 100 # 大驼峰(通常用于类名)
1.4 动态类型特性
Python 是动态类型语言,这意味着:
bash
# 同一个变量可以赋不同类型的值
x = 10 # int
print(type(x)) # <class 'int'>
x = "hello" # 重新赋值为 str
print(type(x)) # <class 'str'>
x = [1, 2, 3] # 又变成 list
print(type(x)) # <class 'list'>
⚠️ 注意:虽然 Python 允许变量类型变化,但这不代表变量没有类型。每次赋值都会改变变量的类型,建议保持变量用途的一致性,避免不必要的混淆。
二、基本数据类型
Python 的数据类型分为"基本类型"和"复杂类型"。基本类型是 Python 内置的原子级别类型,复杂类型则是由基本类型组合而成。
2.1 整数 int
整数是不带小数部分的数字,在 Python 中没有长度限制(取决于内存大小)。
ini
a = 100 # 十进制
b = 0b1100100 # 二进制(前缀 0b)
c = 0o144 # 八进制(前缀 0o)
d = 0x64 # 十六进制(前缀 0x)
print(a, b, c, d) # 全部输出:100
# 大整数
big_num = 1_000_000_000 # 使用下划线分隔,便于阅读
print(big_num) # 1000000000
# 任意进制转换
print(bin(255)) # 0b11111111
print(oct(255)) # 0o377
print(hex(255)) # 0xff
使用场景:
- 计数、索引、循环变量
- 数学运算(加减乘除、幂运算)
- 位操作(掩码、权限控制)
2.2 浮点数 float
浮点数就是带小数点的实数,用于表示精确度要求不高的实数。
ini
price = 19.99
pi = 3.14159
scientific = 1.23e-5 # 科学计数法 = 0.0000123
# 精度问题(所有语言浮点数的通病)
a = 0.1 + 0.2
print(a) # 0.30000000000000004
# 解决方案:使用 decimal 模块
from decimal import Decimal
result = Decimal('0.1') + Decimal('0.2')
print(result) # 0.3
使用场景:
- 货币计算(建议用 Decimal)
- 科学计算
- 物理模拟、游戏坐标
2.3 布尔值 bool
布尔值只有两个:True 和 False(注意首字母大写)。
python
is_active = True
is_deleted = False
# 布尔值可以参与数学运算(True=1, False=0)
print(True + True) # 2
print(True + False) # 1
# 布尔转换
bool(1) # True
bool(0) # False
bool("") # False
bool("abc") # True
bool([]) # False
bool(None) # False
使用场景:
- 条件判断
- 标志位
- 状态控制
2.4 字符串 str
字符串是由零个或多个字符组成的有序序列,用单引号 ' 或双引号 " 包裹。
ini
# 基本创建
name = "张三"
address = '北京市朝阳区'
# 三引号:多行字符串
poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
# 原始字符串(转义字符不生效)
path = r"C:\new folder\file.txt"
# 字符串拼接
first = "Hello"
second = "World"
print(first + " " + second) # Hello World
print(first * 3) # HelloHelloHello
2.5 NoneType
None 表示"空"或"无",是一种特殊的数据类型。
python
result = None
print(result is None) # True
# 区分 None 和空值
empty_list = []
empty_str = ""
zero = 0
print(empty_list is None) # False(是空列表,不是 None)
print(empty_str is None) # False
print(zero is None) # False
使用场景:
- 函数默认返回值
- 占位符(表示尚未赋值)
- 可选参数的默认值
三、查看数据类型
3.1 type() 函数
ini
x = 42
print(type(x)) # <class 'int'>
name = "Alice"
print(type(name)) # <class 'str'>
is_valid = False
print(type(is_valid)) # <class 'bool'>
3.2 isinstance() 函数
python
x = 42
# 判断是否是整数
print(isinstance(x, int)) # True
print(isinstance(x, (int, float))) # True(int 或 float)
# 判断是否是正数
print(isinstance(x, int) and x > 0) # True
type() vs isinstance() :
python
# type() 不会考虑继承关系
class Animal:
pass
class Dog(Animal):
pass
d = Dog()
print(type(d) == Animal) # False(type() 不认继承)
print(isinstance(d, Animal)) # True(isinstance() 认继承)
四、数据类型转换
Python 提供了显式的类型转换函数:
4.1 隐式转换(自动发生)
sql
# int + float → float
result = 10 + 3.14
print(result) # 13.14
print(type(result)) # <class 'float'>
# bool + int → int
result = True + 5
print(result) # 6
4.2 显式转换
python
# 转换为整数
int(3.14) # 3(截断,不四舍五入)
int("42") # 42
int("1010", 2) # 10(二进制转十进制)
# 转换为浮点数
float(3) # 3.0
float("3.14") # 3.14
# 转换为字符串
str(42) # "42"
str(3.14) # "3.14"
# 转换为布尔值
bool(0) # False
bool(1) # True
bool("") # False
bool("abc") # True
bool([]) # False
bool(None) # False
4.3 转换注意事项
bash
# 字符串转数字可能失败
python
try:
num = int("abc") # ValueError
except ValueError:
print("转换失败:不是有效的数字字符串")
# 安全转换方法
def safe_int(s, default=0):
try:
return int(s)
except ValueError:
return default
print(safe_int("100")) # 100
print(safe_int("abc")) # 0
五、实战案例
案例1:简单的学生信息管理系统
python
"""
学生信息记录系统
演示变量与基本数据类型的综合使用
"""
# 学生信息(使用变量存储)
name = "李四"
age = 20
height = 1.78
weight = 70.5
is_enrolled = True
major = "计算机科学与技术"
# 输出学生信息
print("=" * 40)
print(" 📋 学生档案")
print("=" * 40)
print(f" 姓名:{name}")
print(f" 年龄:{age} 岁")
print(f" 身高:{height} 米")
print(f" 体重:{weight} 公斤")
print(f" 专业:{major}")
print(f" 在籍状态:{'是' if is_enrolled else '否'}")
print("=" * 40)
# 计算 BMI 指数
bmi = weight / (height ** 2)
print(f"\n 📊 BMI 指数:{bmi:.2f}")
# 判断 BMI 范围
if bmi < 18.5:
category = "偏瘦"
elif bmi < 24:
category = "正常"
elif bmi < 28:
category = "偏胖"
else:
category = "肥胖"
print(f" 📌 BMI 分类:{category}")
运行结果:
markdown
========================================
📋 学生档案
========================================
姓名:李四
年龄:20 岁
身高:1.78 米
体重:70.5 公斤
专业:计算机科学与技术
在籍状态:是
========================================
📊 BMI 指数:22.26
📌 BMI 分类:正常
案例2:温度单位转换器
python
"""
温度单位转换器
演示数值类型的转换与计算
"""
def celsius_to_fahrenheit(celsius):
"""摄氏度转华氏度"""
return celsius * 9/5 + 32
def celsius_to_kelvin(celsius):
"""摄氏度转开尔文"""
return celsius + 273.15
def fahrenheit_to_celsius(fahrenheit):
"""华氏度转摄氏度"""
return (fahrenheit - 32) * 5/9
def kelvin_to_celsius(kelvin):
"""开尔文转摄氏度"""
return kelvin - 273.15
# 测试用例
print("🌡️ 温度转换示例")
print("-" * 40)
c = 25
print(f"摄氏度 {c}°C = 华氏度 {celsius_to_fahrenheit(c):.2f}°F")
print(f"摄氏度 {c}°C = 开尔文 {celsius_to_kelvin(c):.2f}K")
f = 98.6 # 人体正常体温
print(f"\n华氏度 {f}°F = 摄氏度 {fahrenheit_to_celsius(f):.2f}°C")
k = 300
print(f"开尔文 {k}K = 摄氏度 {kelvin_to_celsius(k):.2f}°C")
# 温度转换表
print("\n📊 0°C 到 100°C 转换表:")
print("-" * 40)
print(f"{'°C':>6} | {'°F':>8} | {'K':>8}")
print("-" * 40)
for c_temp in range(0, 101, 10):
f_temp = celsius_to_fahrenheit(c_temp)
k_temp = celsius_to_kelvin(c_temp)
print(f"{c_temp:>6} | {f_temp:>8.2f} | {k_temp:>8.2f}")
运行结果:
markdown
🌡️ 温度转换示例
----------------------------------------
摄氏度 25°C = 华氏度 77.00°F
摄氏度 25°C = 开尔文 298.15K
华氏度 98.6°F = 摄氏度 37.00°C
开尔文 300K = 摄氏度 26.85°C
📊 0°C 到 100°C 转换表:
----------------------------------------
°C | °F | K
--------------------------------------
0 | 32.00 | 273.15
10 | 50.00 | 283.15
20 | 68.00 | 293.15
30 | 86.00 | 303.15
40 | 104.00 | 313.15
50 | 122.00 | 323.15
60 | 140.00 | 333.15
70 | 158.00 | 343.15
80 | 176.00 | 353.15
90 | 194.00 | 373.15
100 | 212.00 | 373.15
案例3:布尔值与条件判断
python
"""
用户登录验证
演示布尔值与条件判断
"""
def validate_login(username, password):
"""验证登录信息"""
# 预设的用户数据(实际项目中应从数据库读取)
valid_users = {
"admin": "123456",
"user1": "password",
"test": "test123"
}
# 检查用户是否存在
if username not in valid_users:
return False, "用户不存在"
# 检查密码是否正确
if valid_users[username] != password:
return False, "密码错误"
return True, "登录成功"
# 测试登录
print("🔐 登录验证系统")
print("=" * 40)
test_cases = [
("admin", "123456"), # 正确密码
("admin", "wrong"), # 错误密码
("unknown", "123"), # 不存在的用户
("test", "test123"), # 正确
]
for username, password in test_cases:
success, message = validate_login(username, password)
status = "✅" if success else "❌"
print(f"{status} {username}: {message}")
# 布尔运算演示
print("\n🔧 布尔运算示例")
print("-" * 40)
print(f"True and False = {True and False}") # False
print(f"True or False = {True or False}") # True
print(f"not True = {not True}") # False
print(f"True and not False = {True and not False}") # True
运行结果:
yaml
🔐 登录验证系统
========================================
✅ admin: 登录成功
❌ admin: 密码错误
❌ unknown: 用户不存在
✅ test: 登录成功
🔧 布尔运算示例
----------------------------------------
True and False = False
True or False = True
not True = False
True and not False = True
六、常见面试题
面试题1:Python 中的变量赋值是值拷贝还是引用拷贝?
ini
# 基本类型(int, str, tuple):值拷贝
a = 10
b = a
b = 20
print(a) # 10,a 不受影响
# 复杂类型(list, dict):引用拷贝
list1 = [1, 2, 3]
list2 = list1
list2.append(4)
print(list1) # [1, 2, 3, 4],list1 也被修改了
# 如果想拷贝列表,使用切片或 copy 模块
list3 = list1[:] # 浅拷贝
list4 = list1.copy() # 浅拷贝
import copy
list5 = copy.deepcopy(list1) # 深拷贝
面试题2:== 和 is 的区别?
ini
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True,值相等
print(a is b) # False,不是同一个对象
c = a
print(a is c) # True,是同一个对象
# 小整数池(-5 到 256)
x = 256
y = 256
print(x is y) # True(在池范围内)
x = 257
y = 257
print(x is y) # False(超出池范围)
总结
| 知识点 | 核心内容 |
|---|---|
| 变量 | 存储数据的容器,动态类型,赋值即定义 |
| 命名规则 | 字母数字下划线,不能数字开头,不用关键字 |
| 基本类型 | int / float / bool / str / None |
| 类型查看 | type() / isinstance() |
| 类型转换 | int() / float() / str() / bool() |
| 注意事项 | 浮点数精度问题、is 与 == 的区别 |
下一篇预告:【Python知识详解】运算符与表达式------算术运算、比较运算、逻辑运算的完全指南
如果觉得文章有帮助,欢迎关注、点赞、收藏!有任何问题可以在评论区留言~