在上一篇文章中,我们搭建好了开发环境并成功运行了第一个 Python 程序。从这篇文章开始,我们将正式进入 Python 编程的核心内容。今天要学习的是编程中最基础的概念——变量与数据类型。

变量

变量是用于存储数据的"容器"。你可以把它想象成一个贴了标签的盒子——标签是变量名,盒子里装的是数据。

变量的赋值

Python 中使用 = 进行赋值操作:

# 基本赋值
name = "小明"
age = 25
height = 1.75
is_student = True

# 输出变量
print(name)       # 小明
print(age)        # 25
print(height)     # 1.75
print(is_student) # True

Python 是动态类型语言,变量的类型在赋值时自动确定,且可以随时改变:

# 动态类型示例
x = 10        # x 是整数
print(type(x))  # <class 'int'>

x = "Hello"   # x 现在是字符串
print(type(x))  # <class 'str'>

x = 3.14      # x 现在是浮点数
print(type(x))  # <class 'float'>

多重赋值

Python 支持简洁的多重赋值语法:

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

# 交换两个变量
a, b = b, a
print(a, b)     # 2 1

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

变量命名规则

Python 的变量命名需要遵循一些规则:

# 合法的变量名
name = "小明"       # 字母开头
user_name = "admin" # 下划线连接
name2 = "小红"      # 可以包含数字
_name = "私有"      # 下划线开头(有特殊含义)
PI = 3.14159       # 大写字母

# 非法的变量名
# 123abc = "错误"   # 不能以数字开头
# my-var = "错误"   # 不能包含连字符
# class = "错误"    # 不能使用保留关键字

命名约定

Python 社区有一套通用的命名约定(PEP 8 规范):

# 变量和函数:snake_case(小写+下划线)
user_name = "Alice"

# 常量:UPPER_CASE(全大写+下划线)
MAX_SIZE = 100

# 类名:PascalCase(首字母大写)
class Person:
    pass

Python 保留关键字

import keyword
print(keyword.kwlist)
# ['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']

基本数据类型

Python 有以下几种基本(内置)数据类型:

类型 名称 示例
int 整数 42, -10, 1_000_000
float 浮点数 3.14, -0.5, 1.5e-4
str 字符串 "hello", 'Python'
bool 布尔值 True, False
NoneType 空类型 None
complex 复数 3+4j, 2j

整数(int)

Python 的整数可以任意大,不受固定位数限制:

# 基本整数
age = 25
count = -100
zero = 0

# 使用下划线提高可读性(Python 3.6+)
population = 1_000_000_000  # 10 亿

# 不同进制
hex_num = 0xFF      # 十六进制,255
oct_num = 0o77      # 八进制,63
bin_num = 0b1010    # 二进制,10

print(hex_num, oct_num, bin_num)  # 255 63 10

# 整数运算
print(5 + 3)    # 8
print(5 - 3)    # 2
print(5 * 3)    # 15
print(5 / 3)    # 1.6666666666666667(注意:结果是 float)
print(5 // 3)   # 1(整除)
print(5 % 3)    # 2(取余)
print(5 ** 3)   # 125(幂运算)

# Python 整数可以非常大
big_number = 2 ** 1000
print(len(str(big_number)))  # 302 位数字

浮点数(float)

浮点数用于表示带小数点的数值,但需要注意精度问题:

# 基本浮点数
pi = 3.14159
temperature = -5.5

# 科学计数法
avogadro = 6.022e23    # 6.022 x 10^23
electron = 1.602e-19   # 1.602 x 10^-19

print(avogadro)   # 6.022e+23
print(electron)   # 1.602e-19

# 浮点数精度问题
print(0.1 + 0.2)          # 0.30000000000000004(不是 0.3!)
print(0.1 + 0.2 == 0.3)   # False

# 处理精度:使用 round() 或 decimal 模块
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2'))  # 0.3

# 检查"近似相等"
print(abs(0.1 + 0.2 - 0.3) < 1e-10)    # True

字符串(str)

字符串是使用最频繁的数据类型之一,用单引号或双引号括起来:

# 创建字符串
s1 = 'Hello'          # 单引号
s2 = "World"          # 双引号
s3 = '''多行
字符串'''             # 三引号(多行字符串)
s4 = """也可以
这样写"""

print(s1)    # Hello
print(s2)    # World
print(s3)    # 多行\n字符串

# 字符串操作
greeting = s1 + " " + s2  # 拼接
print(greeting)           # Hello World

repeat = "Ha" * 3
print(repeat)             # HaHaHa

# 获取长度
print(len("Python"))      # 6

# f-string(Python 3.6+)
name = "小明"
age = 18
print(f"我叫{name},今年{age}岁")
# 我叫小明,今年18岁

# f-string 支持表达式
print(f"5年后我{age + 5}岁")  # 5年后我23岁
print(f"圆周率是{pi:.2f}")    # 圆周率是3.14

布尔值(bool)

布尔值只有两个:TrueFalse,常用于条件判断:

# 布尔值
is_active = True
is_finished = False

# 布尔运算
print(True and False)   # False(逻辑与)
print(True or False)    # True(逻辑或)
print(not True)         # False(逻辑非)

# 布尔值实际上是整数(True=1, False=0)
print(True + True)      # 2
print(False * 10)       # 0

# 比较运算返回布尔值
print(5 > 3)            # True
print(5 == 3)           # False
print(5 != 3)           # True

NoneType(None)

None 表示"没有值"或"空",类似于其他语言的 null

# None 的含义
result = None          # 表示还没有结果
user_input = None      # 表示还没有输入

# None 的检查
print(result is None)   # True(推荐使用 is,不要用 ==)

# None 在条件判断中相当于 False
if None:
    print("不会执行")
if not None:
    print("会执行")    # 这行会打印

复数(complex)

复数在科学计算中使用:

z1 = 3 + 4j
z2 = 2 - 1j

print(z1 + z2)     # (5+3j)
print(z1.real)     # 3.0(实部)
print(z1.imag)     # 4.0(虚部)
print(abs(z1))     # 5.0(模长)

类型检查和转换

使用 type() 检查类型

# type() 返回对象的类型
print(type(42))            # <class 'int'>
print(type(3.14))          # <class 'float'>
print(type("Python"))      # <class 'str'>
print(type(True))          # <class 'bool'>
print(type(None))          # <class 'NoneType'>
print(type([1, 2, 3]))     # <class 'list'>

# 直接比较类型
print(type(42) == int)     # True
print(type("hi") == str)   # True

使用 isinstance() 检查类型(推荐)

# isinstance() 是更安全的检查方式
print(isinstance(42, int))           # True
print(isinstance("hi", str))         # True
print(isinstance(3.14, (int, float))) # True(可以是多种类型)

# isinstance 支持继承关系
print(isinstance(True, int))         # True(bool 是 int 的子类)
print(type(True) == int)             # False(注意区别)

类型转换

Python 提供了内置函数进行类型转换:

# 转换为整数
print(int(3.14))         # 3(截断小数)
print(int("42"))         # 42
print(int(True))         # 1
print(int(False))        # 0

# 转换为浮点数
print(float(3))          # 3.0
print(float("3.14"))     # 3.14
print(float("1.5e4"))    # 15000.0

# 转换为字符串
print(str(42))           # "42"
print(str(3.14))         # "3.14"
print(str(True))         # "True"
print(str(None))         # "None"

# 转换为布尔值
print(bool(0))           # False
print(bool(1))           # True
print(bool(""))          # False(空字符串)
print(bool("False"))     # True(非空字符串)
print(bool([]))          # False(空列表)
print(bool([1, 2]))      # True(非空列表)
print(bool(None))        # False

动态类型 vs 静态类型的对比

特性 Python(动态类型) Java/C++(静态类型)
变量声明 不需要声明类型 必须声明类型
类型检查 运行时检查 编译时检查
灵活性 高,变量可改变类型 低,类型固定
开发速度 快,代码更简洁 慢,需更多类型代码
# 动态类型的灵活性
value = 42
print(value)           # 42

value = "现在是字符串"
print(value)           # 现在是字符串

value = [1, 2, 3]
print(value)           # [1, 2, 3]

实践练习:BMI 计算器

让我们用学过的知识写一个 BMI 计算器:

# bmi_calculator.py
print("=" * 30)
print("      BMI 计算器")
print("=" * 30)

# 获取用户输入
weight = float(input("请输入您的体重(kg): "))
height = float(input("请输入您的身高(m): "))

# 计算 BMI
bmi = weight / (height ** 2)

# 输出结果
print(f"\n您的 BMI 指数为: {bmi:.1f}")

# 判断体重状态
if bmi < 18.5:
    print("诊断结果: 体重过轻")
elif 18.5 <= bmi < 24:
    print("诊断结果: 体重正常")
elif 24 <= bmi < 28:
    print("诊断结果: 体重过重")
else:
    print("诊断结果: 肥胖")

# 显示变量类型演示
print("\n--- 变量类型演示 ---")
weight_int = int(weight)
print(f"体重(整数): {weight_int}, 类型: {type(weight_int)}")
print(f"身高: {height}, 类型: {type(height)}")
print(f"BMI: {bmi:.2f}, 类型: {type(bmi)}")
print(f"是否正常体重: {18.5 <= bmi < 24}, 类型: {type(18.5 <= bmi < 24)}")

Python 之变量内存模型(了解即可)

了解 Python 的变量本质有助于后续学习:

# Python 变量是"引用"而不是"盒子"
a = [1, 2, 3]
b = a           # b 和 a 指向同一个列表
b.append(4)     # 修改 b
print(a)        # [1, 2, 3, 4](a 也被修改了!)

# 要创建独立的副本:
c = a.copy()    # 或者使用 a[:]
c.append(5)
print(a)        # [1, 2, 3, 4](不受影响)
print(c)        # [1, 2, 3, 4, 5]

# 可以用 id() 查看对象的内存地址
print(id(a))    # 例如 140234567890
print(id(b))    # 和 a 相同
print(id(c))    # 和 a 不同

常见陷阱

1. 浮点数精度比较

# 错误方式
if 0.1 + 0.2 == 0.3:
    print("相等")  # 不会执行!

# 正确方式
if abs(0.1 + 0.2 - 0.3) < 1e-10:
    print("近似相等")  # 会执行

2. 变量名混淆

# 避免使用容易混淆的变量名
l = 1       # 小写 l 和数字 1 很像
O = 0       # 大写 O 和数字 0 很像

# 更好的命名
length = 1
zero = 0

3. None 比较

# 推荐使用 is 而不是 ==
value = None
if value is None:     # 标准写法
    print("空值")

小结

在这篇文章中,我们学习了:

  1. 变量的概念、赋值和命名规则
  2. Python 的六大基本数据类型:int、float、str、bool、NoneType、complex
  3. 使用 type()isinstance() 检查数据类型
  4. 类型转换的方法和注意事项
  5. 动态类型的特点及其与静态类型的对比
  6. 变量引用的内存模型

下一步

掌握了变量和数据类型之后,接下来我们将学习如何使用运算符和表达式来进行各种计算和操作。这将为你编写有实际功能的程序打下基础。

实践建议:打开你的 Python 交互式解释器,尝试创建不同类型的变量,用 type() 检查它们的类型,练习各种类型转换。特别是要亲自看一下 0.1 + 0.2 的结果!

Summary: 变量与六种基本数据类型详解。