news 2026/10/31 2:14:53

Day07 Python数据存储与运算实战全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day07 Python数据存储与运算实战全解

Day07 | Python数据存储与运算技术栈全解:从内存模型到ATM取款机实战

摘要:本文是《AI应用开发筑基》系列的第一篇技术笔记,聚焦Python编程中最底层的两块基石——数据存储(字面量、变量、五大基本类型、内存模型)与数据运算(四种运算符、I/O交互、类型转换机制)。全文采用"概念解析→源码演示→输出验证→踩坑总结"四步分析法,逐层拆解每个知识点的底层逻辑。文末附ATM取款机完整实战,带你从零写出第一个交互式Python程序。适合零基础入门及需要系统梳理Python基础的技术人员阅读。


一、开篇:为什么从"数据存储与运算"开始?

第一阶段我们搞完了AI应用开发入门,Coze拖拉拽搭了个智能体,说实话挺爽的——零代码、可视化、一键部署。但课程进入第二阶段,画风一转,直接让我们手写Python代码。这跳跃不小,但逻辑很清晰。

1.1 从Coze到原生开发的必然性

Coze这类低代码平台本质上是一套通用组件积木。客服问答、内容摘要、标准化报表,这些流程性强的场景它处理得确实漂亮。但一旦遇到下面这些情况:

  • 业务逻辑深度定制(比如金融风控模型的复杂决策树)
  • 需要和企业内部ERP/CRM系统做深度数据交互
  • 对响应速度有极致要求(毫秒级推理优化)
  • 需要自定义模型微调策略

Coze的"黑盒"特性就变成了天花板。接口受限、扩展性差、调试困难——这些问题在企业级项目中是致命的。这时候,代码才是唯一的出路。

1.2 Python的生态垄断地位

那为什么企业级AI开发清一色选Python?看一个简单的技术栈依赖链就明白了:

PyTorch/TensorFlow(底层训练框架)→ LangChain/LangGraph(上层应用框架)→ 数据处理与模型推理生态

这整条链路几乎完全建立在Python之上。选别的语言,意味着你要自己造轮子、自己搭桥,开发成本翻倍不说,社区支持也跟不上。

TIOBE最新的榜单上Python以20.97%的份额继续霸榜第一。从AI大模型开发到Web后端、从数据分析到自动化运维,Python的应用边界还在持续扩张。

1.3 Day01在整个学习路线中的定位

如果把整个Python学习路线比作盖楼,Day01学的东西就是地基中的钢筋:

  • 数据存储(字面量、变量、数据类型)→ 决定了你能在程序里"记住"什么
  • 数据运算(运算符、I/O)→ 决定了你能对数据"做什么"

后面学的流程控制、函数、面向对象,统统建立在这两块之上。地基不牢,后面写再多代码也是空中楼阁。


二、Python语言本质:从解释器到编程范式

2.1 编程语言的"翻译官"角色

要理解Python,得先搞清楚编程语言到底是干嘛的。

人类语言(中文、英文)有一个天然特点:模糊性和情感色彩。比如"你真行"这三个字,用不同的语气说出来,可以是夸赞、可以是讽刺、可以是无奈。这种歧义性对人类沟通来说不是问题,但对计算机来说就是灾难——它只能理解二进制的0和1,需要的是绝对的确定性。

所以编程语言本质上是一套人类和计算机之间的通信协议。它必须满足两个条件:

  1. 人类能读懂、能编写
  2. 能无歧义地翻译成计算机可执行的指令

Python就扮演这个"翻译官"角色。你写Python代码 → Python解释器翻译成字节码 → 虚拟机执行 → 最终变成计算机能懂的二进制指令。

2.2 Python的出身

Python是荷兰人吉多·范罗苏姆(业内叫"龟叔")1991年发布的。名字跟蟒蛇没关系,是他痴迷的英剧《蒙提·蟒蛇的飞行马戏团》(Monty Python’s Flying Circus)。

龟叔设计Python的初衷很朴素:让编程变得简单、有趣。这也是为什么Python语法读起来几乎像英文——"人生苦短,我用Python"不是口号,是设计哲学。

2.3 Python的应用领域矩阵

Python如今的覆盖面有多大?列几个方向感受一下:

领域典型技术栈热度
AI大模型开发PyTorch + LangChain + Transformers极热门
数据分析/可视化Pandas + Matplotlib + Seaborn很热门
网络爬虫Scrapy + BeautifulSoup + Selenium很热门
Web后端Django + Flask + FastAPI热门
办公自动化openpyxl + python-docx + PyPDF2热门
自动化测试Pytest + Selenium + Appium热门

这也是我决定认真学Python的原因——不是"学了可能会用",而是"不学肯定吃亏"。


三、开发环境技术栈:从零搭建Python工作台

3.1 Python解释器的技术原理

前面说了Python需要解释器来翻译代码。具体来说,Python解释器的工作流程分四步:

  1. 词法分析:把你写的Python代码拆成一个一个的token(关键字、标识符、运算符、字面量等)
  2. 语法分析:检查token排列是否符合Python语法规则,生成抽象语法树(AST)
  3. 编译:将AST编译为字节码(.pyc文件),这是一种中间表示
  4. 执行:Python虚拟机逐条执行字节码指令

这就是为什么装Python = 装解释器,而不只是装一个编辑器。

3.2 安装步骤(3.14.4版本)

课程用的是3.14.4版本,不是最新版。原因很实际——生态兼容性。最新版往往很多第三方库还没来得及适配,用次新版本最稳。

关键步骤:

  1. 右键安装包 → “以管理员身份运行”
  2. 必勾选Add python.exe to PATH(不勾后面哭着配环境变量)
  3. 选 Customize installation 自定义安装
  4. 安装路径不要有中文和空格(血的教训:D:\develop\Python 这种路径最佳)

装完后,Win+R → cmd → 输入 python --version,看到 Python 3.14.4 就说明装好了。

3.3 环境变量PATH机制深度解析

这是新手翻车率最高的环节。为什么装了Python,命令行却不认识 python 命令?

PATH环境变量的本质:操作系统在执行命令时,会先在当前目录找,找不到就去PATH列表里的每个路径挨个找。PATH就是一套"搜索目录清单"。

安装时勾选了 Add python.exe to PATH,安装程序会自动把两个目录加进去:

  • Python安装目录(如 D:\develop\Python)—— 里面有 python.exe
  • Scripts目录(如 D:\develop\Python\Scripts)—— 里面有 pip.exe

没勾的话就手动加。右键"此电脑" → 属性 → 高级系统设置 → 环境变量 → 在Path里新建这两条。

3.4 uv:新一代Python包管理器的技术优势

Python自带的pip能用,但慢。uv是Astral团队用Rust写的,快10-100倍不是吹的。

技术对比:

特性pipuv
实现语言PythonRust
依赖解析串行、慢并行、极快
虚拟环境需配合venv内置
锁文件无通用锁文件
Python版本管理无(需pyenv)内置

安装就一行:pip install uv

然后一定要切国内镜像,不然下载依赖等得怀疑人生。推荐清华源。

3.5 PyCharm IDE与虚拟环境机制

IDE选了PyCharm,Python开发的事实标准。

创建项目时选uv作为解释器类型。创建完后你会看到:

  • .venv/ 文件夹 → 项目专属的虚拟环境,里面有独立的Python解释器和依赖库
  • main.py → 入口文件
  • pyproject.toml → 项目配置文件(名称、版本、依赖列表)

虚拟环境的核心价值:项目A用Django 4.2,项目B用Django 5.0,两个项目跑在各自的 .venv 里,谁也不影响谁。这个隔离机制在多人协作和微服务架构中是必须的。


四、数据存储层深度解析:字面量、变量与内存模型

好了,环境搭完了,终于可以写代码了。第一关:搞清楚数据是怎么在程序里"存"的。

4.1 字面量(Literal):程序中的数据表示法

字面量就是代码中直接书写的固定值。这个概念其实你从学数学就在用——你写 10,它就是10本身,不需要通过计算得到。

Python中字面量分为六大类:

4.1.1 整数(int)

Python的整数是任意精度的,不像C/Java那样有32位/64位的上限。理论上你可以写一个几百位的整数,Python照样算。

4.1.2 浮点数(float)

Python的float底层用的是IEEE 754双精度浮点数标准。这意味着不是所有小数都能精确表示。比如 0.1 + 0.7 可能输出 0.7999999999999999,而不是 0.8。这不是Python的bug,是所有语言用二进制存小数都会遇到的问题。高精度场景用 decimal 模块兜底。

4.1.3 字符串(str)

Python不区分单双引号,这点跟JavaScript一样。三引号适合定义多行文本。

4.1.4 布尔值(bool)

关键细节:Python的bool是int的子类,True等于1,False等于0。所以 10 + True 结果是 11,20 + False 结果是 20。

4.1.5 空值(None)

None是NoneType类型的唯一值(单例模式)。用于表示变量尚未赋值、函数没有返回值等场景。

4.1.6 数据容器(概览)

列表 [1,2,3]、元组 (1,2,3)、集合 {1,2,3}、字典 {name: value}——后面会详细展开,Day01先混个脸熟。

4.2 变量(Variable):Python的内存模型

变量是程序中用来存储数据的内存空间。你可以把它想象成一个带标签的盒子——标签是变量名,盒子里装的是数据。

4.2.1 变量的定义与本质

Python赋值语句的底层操作:

  1. 在内存中创建数据对象(如459.3这个float对象)
  2. 将变量名绑定到这个对象上(本质上是指向对象的引用)
4.2.2 Python的动态类型机制

Python是动态类型语言——变量本身没有固定类型,类型信息存在数据对象上。同一个变量x,前后可以指向int对象和str对象。这在Java/C++里是不允许的,但在Python里完全没问题。好处是灵活,代价是IDE的类型提示不够精准(所以现在有了类型注解来弥补)。

4.2.3 变量值的更新机制

每次 count = count + 100 的执行过程:

  1. 取出count当前指向的值(459.3)
  2. 计算 459.3 + 100 = 559.3
  3. 创建一个新的float对象 559.3
  4. 将count重新绑定到这个新对象上
  5. 旧对象459.3如果没有其他引用,等待垃圾回收

4.3 标识符(Identifier)命名规范

硬规矩(违反就报错):

  • 只能由字母(a-z/A-Z)、数字(0-9)、下划线(_)组成
  • 不能以数字开头(6num 报错,num6 可以)
  • 不能是Python关键字(and、if、for、while、True、False、None等)
  • 严格区分大小写(age、Age、AGE 是三个不同的变量)

软规范(PEP8建议,不遵守也能跑但会被同事吐槽):

  • 见名知意:user_name 比 a 好一万倍
  • 蛇形命名法(snake_case):多个单词用下划线连接,全小写
  • 不要用拼音(除非是中国人自己维护的内部项目)

4.4 变量交换:两种实现方式的技术对比

经典面试题:不借助第三个变量,怎么交换a和b的值?

a=10b=20# 方式一:中间变量法(最直观)c=a# c=10a=b# a=20b=c# b=10# 方式二:Python解包语法(最优雅)a,b=b,a# 一行搞定

方式二的底层原理:等号右边 b, a 先构建一个元组 (20, 10),然后解包赋值给左边的 a, b。实际上还是创建了一个临时元组对象,只是语法层面更简洁。


五、类型系统技术分析:五大基本类型逐一拆解

5.1 type() vs isinstance():类型检测的双重武器

Python定义变量时不写类型声明,但不代表数据没类型。type() 可以随时查看:

num=10print(type(num))# <class 'int'>score=98.5print(type(score))# <class 'float'>name="Python"print(type(name))# <class 'str'>is_ok=Trueprint(type(is_ok))# <class 'bool'>color=Noneprint(type(color))# <class 'NoneType'>

type() 和 isinstance() 的选择:

score=89.5# type() 精确匹配print(type(score)==float)# Trueprint(type(score)==int)# False# isinstance() 考虑继承关系print(isinstance(score,float))# Trueprint(isinstance(score,int))# False# bool是int的子类,所以:print(isinstance(True,int))# True!这就是为什么True+1=2

经验法则:一般场景用 isinstance(),因为它尊重继承关系。需要严格类型匹对时用 type()。判断None用 x is None 而不是 x == None。

5.2 字符串类型深度剖析

字符串是入门阶段用得最多的类型,单独拿出来细讲。

5.2.1 三种定义方式的适用场景
# 单引号:适合短字符串s1='It is very interesting'# 双引号:适合字符串里包含单引号的情况s2="It's very interesting"# 不用转义单引号# 三引号:适合多行文本,保留内部格式s3="""尊敬的客户: 感谢您选择我们公司的产品。 我们将会为您竭诚的服务。 祝好 ~"""

选择策略:如果字符串里包含单引号,外层就用双引号;包含双引号,外层就用单引号。两个都不是最优时,用转义符。

5.2.2 转义字符表
# \' 单引号s1='it\'s a cat'# 输出: it's a cat# \" 双引号s2="{\"name\":\"小王\"}"# 输出: {"name":"小王"}# \n 换行s3="床前明月光,\n疑是地上霜."# 输出:# 床前明月光,# 疑是地上霜.# \t 制表符(Tab)s4='*\t*\t*\t*\t*\t*'# 输出: * * * * * *
5.2.3 字符串格式化的演进路线

这是Python字符串处理中最实用的技能。从古至今有三种写法:

第一代:%占位符(老古董,逐渐淘汰)

name="小王"age=18major="软件工程"hobby="Python、Java"greeting="大家好,我是%s,今年%s岁,学习的专业是%s,爱好%s"%(name,age,major,hobby)print(greeting)

缺点:类型对应不灵活,占位符多了眼花缭乱。

第二代:format()(过渡方案)

greeting="大家好,我是{},今年{}岁,学习的专业是{},爱好{}".format(name,age,major,hobby)print(greeting)

比%好一些,但还不够简洁。

第三代:f-string(现代标准,强烈推荐)

greeting=f"大家好,我是{name},今年{age}岁,学习的专业是{major},爱好{hobby}"print(greeting)

f-string不光能放变量,还能放任何表达式:

print(f"10 + 20 ={10+20}")# 运算print(f"名字长度:{len(name)}")# 函数调用print(f"年龄翻倍:{age*2}")# 表达式

5.3 类型转换机制

Python提供了四个内置函数做类型转换,每个都有明确的使用边界:

# str() -> 任意类型转字符串print(str(100))# "100"print(str(True))# "True"print(str(None))# "None"print(str([1,2,3]))# "[1, 2, 3]"# int() -> 转整数(字符串必须是纯数字)print(int("20"))# 20print(int(3.14))# 3(直接截断,不是四舍五入)# print(int("abc")) # 报错!# float() -> 转浮点数print(float("90.5"))# 90.5print(float(10))# 10.0# bool() -> 转布尔值print(bool(1))# True(非0就是True)print(bool(0))# Falseprint(bool("hello"))# True(非空字符串是True)print(bool(""))# False(空字符串是False)print(bool(None))# False

六、I/O交互层技术分析:让程序从"静态"变"动态"

前面写的代码数据都是写死的,真正有用的程序得能和用户对话。这就需要I/O。

6.1 input() 函数的底层行为

name=input("请输入您的姓名: ")print(f"欢迎您,{name}")

执行流程:

  1. 程序执行到 input() 时阻塞,等待用户输入
  2. 用户在控制台输入内容并按回车
  3. input() 将用户输入的内容以字符串形式返回
  4. 程序继续往下执行

最重要的坑:input() 返回的永远是字符串!即使用户输入 123,它也是 “123” 而不是 123。

6.2 print() 函数详解

print() 不只用来打印,有几个参数值得了解:

print("Hello","World",sep=" | ")# sep: 多个值之间的分隔符,默认空格print("Hello",end="!!!")# end: 结尾字符,默认换行

6.3 类型转换 + 输入验证的技术模式

# 输入年龄并计算age=int(input("请输入您的年龄: "))# input返回str,int()转为整数print(f"明年您就{age+1}岁了")# 输入两个数字并计算x=float(input("请输入x的值: "))y=float(input("请输入y的值: "))print(f"x + y ={x+y}")print(f"x - y ={x-y}")

注意浮点数精度问题:输入 0.1 和 0.7,x + y 可能输出 0.7999999999999999。这不是你代码写错了,是IEEE 754的固有限制。高精度场景(如金融计算)用 decimal 模块。

6.4 完整实战:ATM取款机技术实现

现在把前面学的串起来,写一个真正有交互的程序:

# === ATM取款机完整实现 ===# 1. 数据存储:用变量记录余额balance=10000# 2. 输入验证:密码password=input("请输入您的密码: ")print(f"密码验证通过:{password}")# 3. 类型转换 + 输入:取款金额money=int(input("请输入您的取款金额: "))# 4. 数据运算:计算新余额balance=balance-money# 5. 输出结果print(f"恭喜您取款成功,账户余额为:{balance}")

执行示例:

请输入您的密码: 123456 密码验证通过: 123456 请输入您的取款金额: 3000 恭喜您取款成功,账户余额为: 7000

这个程序麻雀虽小,五脏俱全:变量存储、用户输入、类型转换、算术运算、格式化输出——Day01的核心知识点全在里头了。


七、运算引擎:四种运算符技术详解

7.1 算术运算符

运算符含义示例结果备注
+加法10 + 313
-减法10 - 37
*乘法10 * 330
/除法10 / 33.333…结果总是float
//整除10 // 33向下取整,丢弃小数
%取余10 % 3110除以3的余数
**幂指数10 ** 3100010的3次方
num1=10num2=3print(num1+num2)# 13print(num1-num2)# 7print(num1*num2)# 30print(num1/num2)# 3.3333333333333335print(num1//num2)# 3print(num1%num2)# 1print(num1**num2)# 1000

关于 / vs //:/ 的结果始终是float,即使能整除;// 的结果是int(当两个操作数都是int时),直接向下取整,不是四舍五入。

7.2 赋值运算符

num=85num+=10# num = 95 等价于 num = num + 10num-=10# num = 85 等价于 num = num - 10num*=10# num = 850 等价于 num = num * 10num//=10# num = 85 等价于 num = num // 10num%=3# num = 1 等价于 num = num % 3num**=3# num = 1 等价于 num = num ** 3

赋值运算符本质上是语法糖——让你用更少的字符表达同样的运算。除了 = 之外,其他都是"先运算再赋值"两个动作的合并。

7.3 比较运算符

print(100==100)# Trueprint("100"=="100")# True(两个字符串比较)print(100!=100)# Falseprint(100<100)# Falseprint(100<=100)# Trueprint(100>100)# Falseprint(100>=100)# True

比较运算符返回bool值,通常用在if条件判断里。

Python的链式比较(非常实用的语法特性):

# 判断数字是否在10到20之间n=int(input("请输入一个整数: "))print(f"{n}在10-20之间: ",10<=n<=20)# 等价于: n >= 10 and n <= 20

这在大多数语言里是不支持的(会变成 (10 <= n) <= 20 这种奇怪的东西),Python专门做了优化。

7.4 逻辑运算符与短路求值

# and(并且):两边都为True结果才是Truen=int(input("请输入一个整数: "))print(f"{n}在10-20之间: ",n>=10andn<=20)# or(或者):只要有一边为True结果就是Truen=int(input("请输入一个整数: "))print(f"{n}不在10-20之间: ",n<10orn>20)

短路求值是这个知识点的隐藏考点:

# and的短路:左边是False,右边根本不执行Falseandprint("这行不会打印")# or的短路:左边是True,右边根本不执行Trueorprint("这行也不会打印")

实际应用:用 or 给变量设置默认值,用 and 做条件链式判断。这在写健壮的防御性代码时非常常用。

And vs Or 的判断口诀:

  • and:全部满足才过(京东搜手机→价格在范围内并且是华为并且官方旗舰店)
  • or:满足一个就够(登录方式→扫码或者密码或者短信验证码)

八、Day07技术栈总结表

回头看一下今天啃下来的东西:

模块核心内容关键技术点掌握度自检
数据存储字面量六大类型:int/float/str/bool/NoneType/容器□
数据存储变量动态类型、内存模型、命名规范(PEP8)□
数据存储数据类型type()/isinstance()、f-string格式化、类型转换□
I/O交互input/printinput返回永远是str、类型转换+输入验证□
数据运算算术运算符+ - * / // % **、浮点精度问题□
数据运算赋值运算符= += -= *= /=(语法糖)□
数据运算比较运算符== != > < >= <=、链式比较□
数据运算逻辑运算符and/or/not、短路求值机制□

两条主线,八个模块。学一遍是不够的,建议这样复习:

  1. 关掉文章,独立敲一遍ATM取款机程序
  2. 把每种运算符都自己在控制台里试一遍
  3. 故意写错代码看报错信息——报错信息是最好的老师

九、写在最后

Day07作为Python学习的第一天,内容确实不少。但你换个角度想:今天学的东西,后面每一天都会反复用到。变量你会天天定义,f-string你会天天写,运算符更不用说。所以今天花的时间,本质上是在为后面每一天省时间。

下一篇Day02进入流程控制——if条件分支和while/for循环。有了今天的底子,流程控制学起来会轻松很多。毕竟判断条件用的就是比较运算符和逻辑运算符,循环里操作数据用的就是变量和类型转换。

学习编程没有捷径,但可以有方法。看三遍不如敲一遍——这是我从无数个debug的深夜中总结出来的唯一真理。


感谢阅览

如果这篇笔记对你的Python学习有帮助,顺手点个赞、收藏一下,我更新下一期的时候你就能第一时间看到。

有任何问题、建议、或者你也踩过的坑,欢迎在评论区聊聊。学习路上,一起进步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 2:14:53

做方案要街景图?这个工具能下8K原始无水印街景图

做方案、跑外业、搭全景项目的人&#xff0c;大概率都遇到过同一个问题&#xff1a;地图里明明能看到街景&#xff0c;却拿不下来。截图放大就糊&#xff0c;四周还被浏览器窗口切掉&#xff0c;放进文档里一眼就是凑数的。 下面这个工具就是为这件事做的&#xff0c;只需要街…

作者头像 李华
网站建设 2026/10/31 2:13:08

高可用异地组网架构设计:双链路冗余与故障自动切换实践

高可用异地组网的关键&#xff0c;不在“拉两条线”&#xff0c;而在探测、判定、切换、回切、防脑裂五个机制是否可验证、可度量。很多企业已经把专线加宽带、双运营商接入铺到了每个分支&#xff0c;但主链路中断时&#xff0c;备用路径迟迟不接管&#xff0c;或者切换之后业…

作者头像 李华
网站建设 2026/10/31 2:12:33

《羊了个羊:星球》设计拆解

羊了个羊&#xff0c;羊了个羊 加入羊群&#xff0c;通关上榜 看似简单&#xff0c;其实很难 一遍一遍&#xff0c;继续挑战 2026 年 10 月&#xff0c;《羊了个羊&#xff1a;星球》连续 30 天以上占据微信小游戏热玩榜第一&#xff0c;同时是上半年 IAA 百强榜榜首。但同一…

作者头像 李华