【Python实战】零基础实战教程(三) 变量与数据类型
【Python实战】零基础Python实战教程
- 前言
- 一、变量(Variables)
- 1、What is Variables (变量是什么) ?
- 2、变量注解(Variable Annotation)语法
- 3、变量命名规则
- 3.1 核心规则(必须遵守)
- 3.1.1 合法字符
- 3.1.2 保留关键字禁止使用
- 3.1.3 大小写敏感
- 3.2 命名风格规范(PEP 8标准)
- 3.3 命名原则(最佳实践)
- 3.3.1 描述性命名
- 3.3.2 长度平衡
- 3.3.3 避免歧义
- 3.4 特殊场景规范
- 3.4.1 避免内置名称
- 3.4.2 布尔值命名
- 3.4.3 集合类型命名
- 3.4.4 临时变量
- 3.5 常见错误示例与修正
- 3.6 工具支持
- 3.6.1 IDE 检查
- 3.6.2 静态检查工具
- 3.6.3 自动格式化
- 二、数据类型(Data Types)
- 1、数值类型(Numbers)
- 1.1 整数(int)
- 1.2 浮点数(float)
- 1.3 复数(complex)
- 1.3.1 为什么用 j 而不是 i?
- 1.3.2 复数的组成
- 1.3.3 应用场景
- 1.4 布尔值(Boolean)
- 1.5 字符串(String)
- 1.5.1 字符串创建
- 1.5.2 单引号和双引号的区别
- 1.5.3 转义字符
- 1.5.4 字符串操作
- 1.6 列表(List)—— 可变序列
- 1.6.1 创建列表
- 1.6.2 列表操作
- 1.7 列表推导式(List Comprehension)
- 1.8 元组(Tuple)—— 不可变序列
- 1.8.1 创建元组
- 1.8.2 元组特性
- 1.9 类型转换(Type Conversion)
- 1.9.1 常用转换函数
- 1.9.2 注意事项
- 三、总结
- 1. 核心知识点回顾
- 2. 学习建议
- 四、结语

前言
好久没写博客了,还是坚持一下,继续这次关于Python基础的教程。
关于上一章,Python环境管理器pip的使用教程。
如果有同学还需要加深印象的话,可以点击右边传送门:【Python实战】零基础实战教程(二) pip?
今天即将带大家来探索的是Python的 【变量和数据类型】
这个是 Python 中最基础但又最重要的概念,这次带大家深入浅出。
掌握这些内容后,你就能在实战中处理各种数据,并为后续的控制流、函数、面向对象等知识做好铺垫。
基础打好了后,才能用Python来大杀四方!嘿嘿!
一、变量(Variables)
1、What is Variables (变量是什么) ?
变量:是程序运行时用于存储数据的“容器”。
在 Python 中,你不需要显式声明变量的类型,只需给它赋值即可。
# 整型
x = 10
# 字符串
name = "Tony"
# 布尔值
is_valid = True
上述例子的语法虽然简洁又直接,但 非 常 不 推 荐 。
弊端如下:
- 代码可读性和可维护性降低。
value = 42 # 整数
value = "Hello" # 字符串
value = [1, 2] # 列表
value = 3.14 # 浮点数
问题:其他开发者(或未来的你)难以理解变量的预期用途。
后果:增加调试难度,代码变得脆弱。
- 运行时错误风险增加。
total = 0
# for循环
for i in range(10):if i % 2 == 0:total = total + i # 整数加法else:total = str(total) # 突然变成字符串total += "!" # 字符串拼接# 下一行会崩溃!
result = total * 2 # TypeError: 字符串不能和整数相乘
问题:类型相关的操作可能在意外位置崩溃。
后果:难以追踪的TypeError异常。
-
性能影响。
虽然Python本身是动态类型语言,但频繁类型变更会影响:
- 解释器优化:CPython的字节码优化器难以推断类型。
- 内存分配:每次类型变更都需重新分配内存。
- 缓存局部性:不同类型对象内存布局不同,降低CPU缓存命中率。
# 性能测试对比
import timeit# 固定类型
def stable_type():x = 0for i in range(10000):x = i # 始终整数# 动态类型
def dynamic_type():x = 0for i in range(10000):x = i if i % 2 else str(i) # 交替整数/字符串print("固定类型:", timeit.timeit(stable_type, number=1000))
print("动态类型:", timeit.timeit(dynamic_type, number=1000))# 典型结果:
# 固定类型: 0.8秒
# 动态类型: 1.5秒 (慢约2倍)
-
开发工具(IDE)支持失效。
- 类型检查器(如mypy)无法提供有效静态检查。
- IDE自动补全失效(无法推断变量类型)。
- 文档生成工具无法确定参数/返回类型。
-
设计缺陷的信号。
- 变量被用于多个不相关的目的(违反单一职责)。
- 缺少合理的抽象(应使用不同变量或类封装)。
- 数据处理流程设计混乱。
2、变量注解(Variable Annotation)语法
这个语法主要是用来给变量加上类型提示。
推荐语法如下:
# 整型
x: int = 10
# 字符串
name: str = "Tony"
# 布尔值
is_valid: bool = True
在大型项目上,Python语言的维护难度是很高的,有一部分原因是因为变量的类型没有约束,也没有相应的注释导致的。
这个变量注解的语法的优势如下:
- 提高代码可读性和可维护性(方便自己也方便他人)
- 降低运行时错误风险(不同数据类型交叉赋值)
- 性能提高(既定类型变量不需要重新分配内存)
3、变量命名规则
3.1 核心规则(必须遵守)
3.1.1 合法字符
- 首字符:字母(a-z, A-Z)或下划线 _ 。
- 后续字符:字母、数字(0-9)、下划线 _ 。
- 禁止:空格、连字符 -、特殊符号(如 @, $, # 等)。
# 合法
user_name = "Alice"
_count = 10
total2 = 30# 非法
2nd_place = "Bob" # 不能以数字开头
user-name = "Charlie" # 不能包含连字符
$price = 9.99 # 不能包含特殊符号
3.1.2 保留关键字禁止使用
- 不能使用 Python 关键字(如 if, for, while, class 等)。
# 错误示例
class = "Computer Science" # SyntaxError
3.1.3 大小写敏感
- 不同大小写视为不同变量。
name = "Alice"
Name = "Bob" # 这是另一个变量
3.2 命名风格规范(PEP 8标准)
标识符类型 | 命名规范 | 示例 | 说明 |
---|---|---|---|
变量/函数 | 小写蛇形命名 | user_id, calculate_total() | 单词间用下划线连接 |
常量 | 全大写蛇形命名 | MAX_SIZE, PI = 3.14 | 程序运行中不会改变的值 |
类名 | 大驼峰命名 | UserProfile, HttpRequest | 每个单词首字母大写 |
模块/包名 | 简短小写命名 | utils.py, data_processing | 避免使用下划线 |
私有成员 | 单下划线开头 | _internal_data | 提示"仅供内部使用“ |
类私有成员 | 双下划线开头 | __private_method() | 名称修饰(name mangling) |
避免混淆 | 结尾不用下划线 | class_ (代替 class) | 避免与关键字冲突 |
3.3 命名原则(最佳实践)
3.3.1 描述性命名
# 差 - 意义模糊
a = 10
b = get_data()# 好 - 清晰表达意图
max_retries = 10
user_profiles = fetch_user_data()
3.3.2 长度平衡
-
过短:x, tmp(仅限极小作用域)。
-
过长:number_of_active_users_in_current_session(可简化为 active_users)。
3.3.3 避免歧义
# 易混淆
l = [1, 2, 3] # 字母'l' vs 数字'1'# 更清晰
numbers = [1, 2, 3]
- 一致性:
- 相同概念用相同词汇(如统一用 user 或 account,不要混用)。
3.4 特殊场景规范
3.4.1 避免内置名称
# 危险 - 覆盖内置函数/类型
list = [1, 2, 3] # 覆盖了 list 类型
str = "text" # 覆盖了 str 类型
3.4.2 布尔值命名
栗子:
# 使用 is/has/can 前缀
is_active = True
has_permission = False
can_edit = True
3.4.3 集合类型命名
# 使用复数形式
users = ["Alice", "Tony"]
# 或加后缀 _list/_dict
config_dict = {"key": "value"}
3.4.4 临时变量
- 极短作用域可用短名(但需注释)。
# 在 3 行代码内使用
for i in range(10): # i 是可接受的print(i)
3.5 常见错误示例与修正
错误命名 | 问题 | 改进方案 |
---|---|---|
userName | 不符合蛇形命名 | user_name |
GetData() | 函数名应小写开头 | get_data() |
CONSTANTValue | 常量应全大写 | CONSTANT_VALUE |
class_ | 与关键字冲突 | student_class |
data | 过于泛化 | user_emails |
3.6 工具支持
3.6.1 IDE 检查
- VS Code/PyCharm 会提示 PEP 8 违规
3.6.2 静态检查工具
# 安装
pip install flake8 pylint# 运行检查
flake8 your_script.py
pylint your_script.py
flake8静态检查工具可以在VSCode中的插件市场中安装。
3.6.3 自动格式化
pip install black
black your_script.py # 自动格式化代码
black格式化工具可以在VSCode中的插件市场中安装。
二、数据类型(Data Types)
Python 内置了多种常见的数据类型。
本节会重点介绍最基础的几种:数值、字符串、布尔值,以及简单地提到列表和元组。
1、数值类型(Numbers)
Python 中的数值类型主要包括整数(int)、浮点数(float)和复数(complex)。
日常实战中,最常用的是整数和浮点数。
1.1 整数(int)
- 用来表示没有小数部分的数值。
x = 100
y = -42
print(type(x)) # <class 'int'>
- 整数支持任意精度(大整数不会溢出)。
1.2 浮点数(float)
- 用来表示带小数部分的数值(双精度浮点数)。
pi = 3.14159
temperature = -5.0
print(type(pi)) # <class 'float'>
- 在运算过程中可能有精度误差,需要注意:
print(0.1 + 0.2) # 可能输出 0.30000000000000004
1.3 复数(complex)
- 用于表示数学中的复数(实部 + 虚部),格式为 a + bj,其中 a 是实部,b 是虚部。
z = 3 + 4j # 复数
print(type(z)) # <class 'complex'>
print(z.real) # 实部:3.0
print(z.imag) # 虚部:4.0
在 Python 中,z = 3 + 4j 表示一个复数(Complex Number),其中的 j 是虚数单位,对应数学中的 √-1(即数学中通常用 i 表示的虚数单位)。
1.3.1 为什么用 j 而不是 i?
- 数学传统:数学中虚数单位用 i(如 i 2 = − 1 i^2 =−1 i2=−1),但在工程和物理领域(如电路分析)中,i 常代表电流,因此改用 j 避免混淆。
- Python 语法设计:Python 遵循工程领域的习惯,规定虚数单位用 j(或小写 j),写在虚部数字之后。
1.3.2 复数的组成
复数由 实部(Real Part)和虚部(Imaginary Part) 组成:
z = 3 + 4j # 实部是 3,虚部是 4
- 实部:可以是整数、浮点数,例如 1.5 + 3j。
- 虚部:必须以 j 结尾,例如:
- 5j:表示实部为 0 的纯虚数(等价于 0 + 5j)。
- -2j:负虚数(等价于 0 - 2j)。
1.3.3 应用场景
复数在 Python 中主要用于:
- 科学计算:信号处理、量子力学、傅里叶变换等(需配合 numpy、scipy 等库)。
- 工程领域:电路分析、控制系统设计。
- 数学建模:求解多项式方程、分形几何(如 Mandelbrot 集合)。
1.4 布尔值(Boolean)
- 表示逻辑真 / 假,只有两个取值:True 和 False(注意首字母大写)。
is_student = True
has_passed = False
print(type(is_student)) # <class 'bool'>
- 与数值类型的隐式转换:
print(True + 5) # 输出 6(等价于 1 + 5)
print(False * 10) # 输出 0
- 常见用途:条件判断(if 语句)、循环控制(while 循环)、逻辑运算(and, or, not)。
1.5 字符串(String)
- 用于存储文本数据,用单引号 ‘、双引号 " 或三引号 ‘’’/“”" 包裹。
1.5.1 字符串创建
single_quote = 'Hello, World!' # 单引号
double_quote = "I'm a programmer" # 包含单引号的双引号字符串
multi_line = '''第一行
第二行
第三行''' # 三引号支持多行字符串
1.5.2 单引号和双引号的区别
1.引号嵌套与转义
- 优先使用不包含目标引号的方式,减少转义字符(\)的使用。
# 正确(无需转义)
s1 = 'It\'s a beautiful day' # 需要转义单引号
s2 = "It's a beautiful day" # 更简洁,无需转义# 正确(无需转义)
s3 = "He said, \"Hello!\"" # 需要转义双引号
s4 = 'He said, "Hello!"' # 更简洁,无需转义
- 字符串内容与可读性
- 单引号:更适合内容本身不含单引号的短字符串(如代码中的标识符、路径等)。
name = 'Alice'
file_path = '/home/user/data.txt'
- 双引号:更适合包含自然语言的字符串(如句子、描述),因为英语中经常包含缩写(如 it’s, don’t)。
sentence = "Don't worry, be happy."
- PEP 8 风格指南建议
- 一致性优先:在同一项目中保持统一的引号风格。
- 自然语言用双引号:包含自然语言的字符串优先使用双引号。
- 技术内容用单引号:如代码示例、标识符等优先使用单引号。
1.5.3 转义字符
- 用于表示特殊字符(如换行、制表符、引号等):
- \n:换行
- \t:制表符(Tab)
- ':单引号
- ":双引号
- \:反斜杠
print("Hello\nWorld") # 输出:
# Hello
# World
# 物理路径
path = "C:\\Users\\User\\File.txt" # 转义反斜杠
1.5.4 字符串操作
- 拼接(+)
first_name = "Alice"
last_name = "Smith"
full_name = first_name + " " + last_name # "Alice Smith"
- 重复(*)
separator = "-" * 20 # "--------------------"
print(separator)
- 索引与切片
- 索引:字符串是字符的有序序列,可通过索引访问单个字符(从 0 开始)。
s = "Python"
print(s[0]) # "P"
print(s[-1]) # 最后一个字符 "n"(负索引从右往左)
- 切片:提取子字符串,格式为 s[start🔚step](end 不包含在内)。
s = "Hello, World!"
print(s[7:12]) # "World"(从索引7到11)
print(s[::-1]) # 反转字符串 "!dlroW ,olleH"
- 字符串格式化
- f-string(推荐):Python 3.6+ 引入的高效格式化方式。
name = "Bob"
age = 30
print(f"My name is {name}, and I'm {age} years old.")
# 输出:"My name is Bob, and I'm 30 years old."
- 格式化字符串字面值:支持表达式计算。
price = 9.99
discount = 0.2
final_price = f"原价: ${price:.2f}, 折后价: ${price*(1-discount):.2f}"
# 输出:"原价: $9.99, 折后价: $7.99"
- 字符串方法
方法 | 作用 | 示例 |
---|---|---|
strip() | 去除首尾空白字符 | " hello ".strip() → “hello” |
split() | 按分隔符分割字符串 | `“a,b,c”.split(“,”) → [“a”, “b”, “c”] |
upper() | 转换为大写 | “hello”.upper() → “HELLO” |
replace() | 替换子字符串 | “old”.replace(“old”, “new”) → “new” |
count() | 统计子字符串出现次数 | “ababa”.count(“a”) → 3 |
1.6 列表(List)—— 可变序列
- 用于存储有序、可变的元素集合,元素类型可以混合。
1.6.1 创建列表
numbers = [1, 2, 3, 4] # 整数列表
fruits = ["apple", "banana", "cherry"] # 字符串列表
mixed = [1, "hello", True, 3.14] # 混合类型列表
empty_list = [] # 空列表
1.6.2 列表操作
- 索引与切片(与字符串类似)
fruits = ["apple", "banana", "cherry", "date"]
print(fruits[1]) # "banana"
print(fruits[1:3]) # ["banana", "cherry"](左闭右开)
- 增删改查
-
添加元素:
-
append():在末尾添加单个元素。
fruits.append("elderberry") # ["apple", "banana", "cherry", "date", "elderberry"]
-
extend():扩展列表(添加多个元素)。
fruits.extend(["fig", "grape"]) # 添加列表中的元素
-
insert(index, value):在指定位置插入元素。
fruits.insert(0, "avocado") # 在索引0处插入"avocado"
-
-
删除元素:
- del:根据索引删除。
del fruits[0] # 删除索引0的元素("avocado")
- pop():删除并返回指定索引的元素(默认最后一个)。
last_fruit = fruits.pop() # 删除最后一个元素并赋值给last_fruit
- remove(value):根据值删除(只删除第一个匹配项)。
fruits.remove("banana") # 删除第一个"banana"
- del:根据索引删除。
-
修改元素:
fruits[1] = "blueberry" # 将索引1的元素改为"blueberry"
-
查询元素:
- in 关键字:判断元素是否存在。
print("cherry" in fruits) # True
- index(value):获取元素的索引(若不存在则报错)。
print(fruits.index("cherry")) # 2
- in 关键字:判断元素是否存在。
1.7 列表推导式(List Comprehension)
-
快速创建列表的简洁语法。
# 生成1-10的平方列表 squares = [x**2 for x in range(1, 11)] # [1, 4, 9, ..., 100]# 过滤偶数 even_numbers = [x for x in range(20) if x % 2 == 0] # [0, 2, 4, ..., 18]
1.8 元组(Tuple)—— 不可变序列
- 与列表类似,但不可修改(创建后元素不可增删改),用圆括号 () 包裹。
1.8.1 创建元组
point = (3, 4) # 数值元组
person = ("Alice", 30, True) # 混合类型元组
empty_tuple = () # 空元组
single_element = (5,) # 单个元素需加逗号(避免与数学运算符混淆)
1.8.2 元组特性
- 不可变性:
t = (1, 2, 3) # t[0] = 0 # 报错!元组不支持项赋值
- 用途:
- 存储不可变数据(如坐标、配置信息)。
- 作为字典的键(列表不可作为字典键,因为列表可变)。
- 函数返回多个值时,隐式使用元组(无需括号)。
def get_person():return "Bob", 25, "Engineer" # 返回元组 ("Bob", 25, "Engineer")name, age, job = get_person() # 元组解包
1.9 类型转换(Type Conversion)
- 使用内置函数将数据从一种类型转换为另一种类型。
1.9.1 常用转换函数
函数 | 作用 | 示例 |
---|---|---|
int(x) | 将 x 转换为整数 | int(“123”) → 123 |
float(x) | 将 x 转换为浮点数 | float(“3.14”) → 3.14 |
str(x) | 将 x 转换为字符串 | str(100) → “100” |
bool(x) | 将x转换为列表 | bool(0) → False, bool(“abc”) → True |
list(x) | 将x转换为列表 | list(“abc”) → [“a”, “b”, “c”] |
tuple(x) | 将x转换为元组 | tuple([1, 2, 3]) → (1, 2, 3) |
1.9.2 注意事项
-
字符串转换为数值时,必须是合法的数字字符串:
# 正确 num = int("42") # 42 # 错误(包含非数字字符) # num = int("forty-two") # ValueError: invalid literal for int() with base 10: 'forty-two'
-
空值转换为布尔值时,0, “”, None, [], () 等视为 False,其余视为 True。
三、总结
1. 核心知识点回顾
函数 | 作用 | 示例 |
---|---|---|
整数(int) | x = 10 | 任意精度,无小数 |
浮点数(float) | x = 3.14 | 有精度误差,支持科学计数法 |
布尔值(bool) | is_ok = True | 只有True/False,可与数值运算 |
字符串(str) | s = “hello” | 不可变,支持索引、切片、格式化 |
列表(list) | lst = [1, 2, 3] | 可变序列,支持增删改查 |
元组(tuple) | tpl = (1, 2, 3) | 不可变序列,用于固定数据集合 |
2. 学习建议
- 刻意练习:用不同数据类型编写小程序(如计算器、用户信息管理)。
- 类型注解:从现在开始养成给变量添加类型注解的习惯,提升代码健壮性。
- 阅读文档:Python官方文档中的 数据类型章节 是最佳参考资料。
四、结语
以上内容部分来自于AI。
为方便大家学习,对于Python中相关问题和细节都整理在本篇博客中。
我之所以坚持写博客,是因为想帮助每一位热爱代码的人。
由衷的希望各位莘莘学子能找到属于各自的归属!
愿每一颗在书页间跳动的星辰,都能在时光深处抵达属于自己的璀璨归处。