当前位置: 首页 > web >正文

【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

上述例子的语法虽然简洁又直接,但 非 常 不 推 荐

弊端如下:

  1. 代码可读性和可维护性降低。
value = 42       # 整数
value = "Hello"  # 字符串
value = [1, 2]   # 列表
value = 3.14     # 浮点数

问题:其他开发者(或未来的你)难以理解变量的预期用途。
后果:增加调试难度,代码变得脆弱。

  1. 运行时错误风险增加。
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异常。

  1. 性能影响。

    虽然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倍)
  1. 开发工具(IDE)支持失效。

    • 类型检查器(如mypy)无法提供有效静态检查。
    • IDE自动补全失效(无法推断变量类型)。
    • 文档生成工具无法确定参数/返回类型。
  2. 设计缺陷的信号。

    • 变量被用于多个不相关的目的(违反单一职责)。
    • 缺少合理的抽象(应使用不同变量或类封装)。
    • 数据处理流程设计混乱。

2、变量注解(Variable Annotation)语法

这个语法主要是用来给变量加上类型提示。

推荐语法如下:

# 整型
x: int = 10
# 字符串
name: str = "Tony"
# 布尔值
is_valid: bool = True

在大型项目上,Python语言的维护难度是很高的,有一部分原因是因为变量的类型没有约束,也没有相应的注释导致的。

这个变量注解的语法的优势如下:

  1. 提高代码可读性和可维护性(方便自己也方便他人)
  2. 降低运行时错误风险(不同数据类型交叉赋值)
  3. 性能提高(既定类型变量不需要重新分配内存)

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]
  1. 一致性:
    • 相同概念用相同词汇(如统一用 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 中主要用于:

  1. 科学计算:信号处理、量子力学、傅里叶变换等(需配合 numpy、scipy 等库)。
  2. 工程领域:电路分析、控制系统设计。
  3. 数学建模:求解多项式方程、分形几何(如 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!"'     # 更简洁,无需转义
  1. 字符串内容与可读性
  • 单引号:更适合内容本身不含单引号的短字符串(如代码中的标识符、路径等)。
name = 'Alice'
file_path = '/home/user/data.txt'
  • 双引号:更适合包含自然语言的字符串(如句子、描述),因为英语中经常包含缩写(如 it’s, don’t)。
sentence = "Don't worry, be happy."
  1. PEP 8 风格指南建议
    • 一致性优先:在同一项目中保持统一的引号风格。
    • 自然语言用双引号:包含自然语言的字符串优先使用双引号。
    • 技术内容用单引号:如代码示例、标识符等优先使用单引号。
1.5.3 转义字符
  • 用于表示特殊字符(如换行、制表符、引号等):
    • \n:换行
    • \t:制表符(Tab)
    • ':单引号
    • ":双引号
    • \:反斜杠
print("Hello\nWorld")  # 输出:
# Hello
# World
# 物理路径
path = "C:\\Users\\User\\File.txt"  # 转义反斜杠
1.5.4 字符串操作
  1. 拼接(+)
first_name = "Alice"
last_name = "Smith"
full_name = first_name + " " + last_name  # "Alice Smith"
  1. 重复(*)
separator = "-" * 20  # "--------------------"
print(separator)
  1. 索引与切片
  • 索引:字符串是字符的有序序列,可通过索引访问单个字符(从 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"
  1. 字符串格式化
  • 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"
  1. 字符串方法
方法作用示例
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 列表操作
  1. 索引与切片(与字符串类似)
fruits = ["apple", "banana", "cherry", "date"]
print(fruits[1])       # "banana"
print(fruits[1:3])     # ["banana", "cherry"](左闭右开)
  1. 增删改查
  • 添加元素:

    • 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"
      
  • 修改元素:

    fruits[1] = "blueberry"  # 将索引1的元素改为"blueberry"
    
  • 查询元素:

    • in 关键字:判断元素是否存在。
      print("cherry" in fruits)  # True
      
    • index(value):获取元素的索引(若不存在则报错)。
      print(fruits.index("cherry"))  # 2
      

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. 学习建议

  1. 刻意练习:用不同数据类型编写小程序(如计算器、用户信息管理)。
  2. 类型注解:从现在开始养成给变量添加类型注解的习惯,提升代码健壮性。
  3. 阅读文档:Python官方文档中的 数据类型章节 是最佳参考资料。

四、结语

以上内容部分来自于AI。

为方便大家学习,对于Python中相关问题和细节都整理在本篇博客中。

我之所以坚持写博客,是因为想帮助每一位热爱代码的人。

由衷的希望各位莘莘学子能找到属于各自的归属!

请添加图片描述
愿每一颗在书页间跳动的星辰,都能在时光深处抵达属于自己的璀璨归处。

http://www.xdnf.cn/news/12112.html

相关文章:

  • 【Python指南】离线安装顽固复杂的第三方库指南
  • Transformers生成文本:max_new_tokens揭秘
  • 第二十三章 Shell的基础语法
  • haribote原型系统改进方向
  • 【Day44】
  • 【向量化模型如何私有化部署】一文说清原理、流程与最佳实践
  • 软件工程专业本科毕业论文模板
  • 龙虎榜——20250604
  • ‌RF Choke(射频扼流圈)
  • 2D 写实交互数字人:多终端实时交互,引领数字化浪潮
  • 告别延迟,拥抱速度:存储加速仿真应用的解决方案【1】
  • 【五子棋在线对战】二.项目结构设计 实用工具类模板的实现
  • 分享国外几个好用的ai网站
  • 普中STM32F103ZET6开发攻略(五)
  • 李沐《动手学深度学习》 | 数值稳定性
  • CATIA-CAD 拆图
  • 【优秀三方库研读】quill 开源库中的命名空间为什么要用宏封装
  • 养老实训中心建设规划:新时代养老服务人才实践能力提升工程
  • 【算法训练营Day06】哈希表part2
  • java判断一个字符串(如 str1)是否在给定的一组字符串
  • Python×AI:用LangChain快速搭建LLM应用的全栈方案
  • Vite实战指南
  • Linux容器篇、第一章_02Rocky9.5 系统下 Docker 的持久化操作与 Dockerfile 指令详解
  • SD卡通过读取bin文件替代读取图片格式文件来提高LCD显示速度
  • 半导体制冷片(Thermoelectric Cooler,TEC)
  • 深度学习Sitemap(NuxtSeo)
  • 《Offer来了:Java面试核心知识点精讲》大纲
  • 使用Prometheus实现微服务架构的全面监控
  • 慢SQL调优(二):大表查询
  • (四)docker命令—容器管理命令