尧图精选

Python数据类型与变量:字符串、数值、绘图与逻辑控制实践

🕒 发布时间:2026/9/2 22:52:36 📁 来源:尧图网络
数据与基本数据类型变量、字符串、数值、绘图与逻辑控制的编程实践很多初学者在学编程时都会遇到一个共同的困惑为什么要区分“数据类型”为什么一个变量可以存数字另一个变量只能存文字明明我在屏幕上看到的是同样的字符“123”为什么程序有时候能计算有时候却报错这个困惑的根源在于没有真正理解数据在程序里是如何被存储和解释的。计算机底层只有 0 和 1所谓的数据类型其实是编程语言为我们提供的一套“解释规则”。整数、浮点数、字符串、布尔值……每一种类型都决定了数据在内存中的存储方式、可执行的操作以及它能参与的运算。如果不搞懂这些后续写逻辑、画图表、做数据分析都会遇到各种莫名其妙的问题。这篇文章以 Python 为例系统梳理数据与基本数据类型的核心知识点从变量定义、字符串与数值的转换到条件判断、循环逻辑再用一个“数据可视化”的小项目把绘图与逻辑串起来。你会发现数据类型不是枯燥的语法规则而是所有实用程序的基石。1. 这篇文章真正要解决的问题先从几个真实的开发痛点说起。第一个痛点类型混乱导致程序崩溃。比如你从文件或接口里读到一个数值但它是字符串类型直接参与加减运算就会报错“TypeError: unsupported operand type(s)”。新手经常花很长时间排查最后发现是类型没转换。第二个痛点不知道选什么数据结构。想保存一组数据什么时候用列表什么时候用元组什么时候用字典如果不理解基本类型的特性很容易写出低效且难以维护的代码。第三个痛点逻辑控制与数据处理脱节。很多初学者会写if会写for但一到实际场景比如“找出数据中大于平均值的部分并绘制成图”就不知道如何组合这些知识。第四个痛点可视化时“有图但不明白”。绘图库只是工具关键是你得先把数据整理成正确的类型和结构。如果类型没处理好画出来的图要么报错要么完全不符合预期。这篇文章要做的就是把这些问题串联起来从变量和基本数据类型入手讲清楚字符串、数值的转换和操作然后引入条件判断和循环让代码具备“决策”和“重复”能力最后用 Matplotlib 做一个完整的数据绘图实践把前面的知识全部应用起来。读完你可以独立完成“读取数据 → 清洗类型 → 逻辑处理 → 可视化”这条最常用的编程路径。2. 核心概念基本数据类型、变量与对象的区别2.1 什么是变量变量是编程中最基础的概念。你可以把变量理解为一个“贴了标签的盒子”。盒子里可以放不同的数据标签则是变量名。在 Python 中变量不需要声明类型赋值即创建。age 18 # 整数 price 9.9 # 浮点数 name Alice # 字符串 is_student True # 布尔值这里有个很重要的知识点Python 的变量名实际上是对对象的“引用”而不是对象本身。当你写a [1, 2, 3]时内存中会创建一个列表对象然后变量a指向这个对象。如果写b a并不是复制了一份数据而是让b也指向同一个列表对象。这一点在后续学习函数参数、修改可变对象时非常关键。对于基本数据类型情况略有不同。整数、浮点数、字符串、布尔值属于“不可变类型”你看起来“修改”了变量实际上是让变量重新指向了一个新的对象。x 10 y x x 20 print(y) # 输出 10y 不受影响2.2 基本数据类型总览Python 中常见的基本数据类型如下表类型名称示例是否可变典型场景int整数42否计数、索引float浮点数3.14否科学计算、价格str字符串hello否文本处理bool布尔值True/False否条件判断list列表[1,2,3]是有序可变集合tuple元组(1,2,3)否不可变序列dict字典{name:Alice}是键值映射set集合{1,2,3}是去重、集合运算一个常见的误区是“字符串是字符的数组所以可变”。在 Python 中字符串是不可变类型你不能像 C 语言那样直接修改某个字符。如果想修改必须创建新字符串。2.3 为什么需要类型转换不同类型的操作规则不同。整数可以和浮点数直接运算但字符串与整数之间不能直接运算。例如s 123 print(s 1) # 报错TypeError必须显式转换s 123 num int(s) print(num 1) # 输出 124数值转字符串也一样n 3.14 text str(n) print(圆周率是 text)Python 中类型转换的核心函数有int()、float()、str()、bool()等。使用时要注意不是所有字符串都能成功转换。int(abc)会抛ValueError所以在转换用户输入或外部数据时最好先验证格式。3. 字符串与数值的深度操作3.1 字符串的基础操作字符串是编程中最常用的数据类型之一。无论是处理日志、用户输入还是生成报告都离不开字符串。常用操作包括text Hello, Python # 切片 print(text[0:5]) # Hello print(text[-6:]) # Python # 拼接 a Hello b World print(a b) # 查找 print(Python in text) # True print(text.find(Python)) # 7 # 替换 print(text.replace(Python, CSDN)) # 大小写转换 print(text.upper()) print(text.lower()) # 拆分与合并 words text.split(,) print(words) # [Hello, Python] new_text -.join(words) print(new_text) # Hello- Python在热搜词里有“字符串逆序输出c”“字符串排序”“字符串判等”等。这些是编程题的常见考点。Python 中字符串逆序可以用切片s abcde print(s[::-1]) # edcba字符串判等直接用注意它比较的是内容而不是内存地址。这在 Python 初学者中很容易混淆因为 Java 中比较引用而 Python 的对字符串已经重载为内容比较。3.2 数值类型与数学运算Python 的数值类型除了int和float还有complex复数类型。日常编程中整数与浮点数的区别要注意10 / 3结果是3.333...浮点数10 // 3结果是3整除10 % 3结果是1取余2 ** 3结果是8幂浮点数有一个经典陷阱——精度问题print(0.1 0.2) # 0.30000000000000004这不是 Python 的 bug而是二进制浮点数存储机制的固有偏差。如果需要高精度计算应使用decimal模块。from decimal import Decimal result Decimal(0.1) Decimal(0.2) print(result) # 0.3在数据分析和绘图中浮点数精度问题一般不会影响视觉效果但在金额计算、比较判断等场景必须注意。3.3 类型转换的常见坑类型转换看起来简单实际使用时却有不少坑。我总结三个高频问题第一int(3.14)会报错因为字符串包含小数点不能直接转为整数。你应该先转float再转int或者使用Decimal。正确写法s 3.14 f float(s) i int(f) print(i) # 3第二布尔值其实是整数的子类。True等于1False等于0。所以True 1结果会是2。在项目里不要依赖这种隐式特性判断时使用is或。第三字符串与数值拼接时忘记转换。新手经常会写age 18 print(I am age years old) # 报错必须写成str(age)。4. 绘图基础用 Matplotlib 让数据可视化当数据类型和变量掌握之后就可以进入“绘图与编程实践”环节。绘图是数据分析和编程实践中最容易获得成就感的产出。掌握 matplotlib 基础既能巩固数据类型知识又能直观感受数据规律。4.1 环境准备与安装在开始绘图之前需要确保环境中安装了 Python 和 Matplotlib。推荐使用 Python 3.8 以上版本并通过 pip 安装pip install matplotlib如果你使用的是 AnacondaMatplotlib 默认已经安装无需额外操作。为了在 Jupyter Notebook 中显示图表可以加一行魔法命令%matplotlib inline4.2 第一个绘图程序我们用最简单的折线图来演示绘图的基本流程创建数据、创建画布、绘制、显示/保存。import matplotlib.pyplot as plt # 准备数据x 轴为月份y 轴为平均气温 months [Jan, Feb, Mar, Apr, May, Jun] temps [3.5, 5.2, 9.8, 15.4, 20.1, 24.6] # 绘图 plt.plot(months, temps, markero, colorblue, labelAverage Temp) # 添加标题和标签 plt.title(Monthly Average Temperature) plt.xlabel(Month) plt.ylabel(Temperature (°C)) plt.legend() plt.grid(True, linestyle--, alpha0.6) # 显示图表 plt.show() # 保存图表 plt.savefig(temperature.png, dpi150)运行这个程序后你会看到一个带有网格线和标注的折线图。这里真正容易踩坑的地方是如果在plt.show()之后再调用plt.savefig()保存的图片可能是一张空白图。所以保存操作应该放在show()之前。另一个常见问题是中文显示乱码因为 Matplotlib 默认字体不支持中文。解决办法是设置中文字体例如plt.rcParams[font.sans-serif] [SimHei] # 或 Microsoft YaHei plt.rcParams[axes.unicode_minus] False # 解决负号显示异常4.3 柱状图与饼图折线图适合展示趋势柱状图适合比较分类数据饼图适合展示占比。它们的数据准备和绘图逻辑非常相似。import matplotlib.pyplot as plt # 柱状图各科目成绩 subjects [Math, English, Physics, CS] scores [88, 76, 92, 98] plt.bar(subjects, scores, color[#4C72B0, #55A868, #C44E52, #8172B2]) plt.title(Subject Scores) plt.ylabel(Score) plt.ylim(0, 100) # 给每个柱子标上数值 for i, v in enumerate(scores): plt.text(i, v 1, str(v), hacenter) plt.show()柱状图里使用enumerate循环给每个柱子加上数据标签这里就用到了循环逻辑。饼图则适合展示比例比如统计某门课程各分数段的人数占比。4.4 绘图时的数据类型意识很多人以为绘图只是调用plt.plot()实际上数据从原始文本变成图表中间要经过多次类型转换和逻辑处理。例如从 CSV 文件读取的数据默认是字符串必须转换为数值才能绘图。规范的流程是读取 → 解析 → 清洗转换类型、处理缺失 → 分析 → 绘图。下面我们用一个完整的实战项目把变量、字符串、数值、逻辑和绘图全部串起来。5. 完整示例学生成绩分析与可视化5.1 项目需求假设我们有一个文本文件scores.txt内容是若干行学生姓名和成绩用逗号分隔但个别行的成绩可能缺失或者包含异常值。我们需要读取文件把每行数据拆分成学生姓名和成绩。将成绩转换为数值类型忽略无效数据。统计全班平均分、最高分、最低分。绘制成绩分布柱状图并标记高于平均分的学生。这个项目虽然简单却涵盖了字符串处理、类型转换、条件判断、循环、列表操作和绘图非常适合作为数据与基本数据类型的综合实践。5.2 编写代码先创建一个示例数据文件Alice,88 Bob,75 Charlie,92 David, Eve,60 Frank,85 Grace,79 Henry,95 Ivy, Jack,70注意David和Ivy的成绩为空Charlie的成绩是 92数据中也可能出现“N/A”之类的字符串但这里先处理空值。完整代码# 文件名score_analysis.py import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False def parse_scores(filename): 读取成绩文件返回姓名列表和有效成绩列表 names [] scores [] with open(filename, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue parts line.split(,) if len(parts) ! 2: continue name parts[0].strip() score_str parts[1].strip() # 尝试转换字符串为数值 try: score float(score_str) except ValueError: # 转换失败跳过该行 print(f跳过无效数据{line}) continue names.append(name) scores.append(score) return names, scores def analyze_scores(scores): 计算平均分、最高分、最低分 if not scores: return None avg sum(scores) / len(scores) max_score max(scores) min_score min(scores) return avg, max_score, min_score def plot_scores(names, scores, avg_score): 绘制柱状图并标记高于平均分的学生 # 创建颜色列表高于平均分用绿色低于用灰色 colors [#2ca02c if s avg_score else #999999 for s in scores] plt.figure(figsize(10, 6)) bars plt.bar(names, scores, colorcolors) plt.axhline(yavg_score, colorred, linestyle--, labelf平均分 {avg_score:.1f}) # 在柱子上方标记分数 for bar, score in zip(bars, scores): plt.text(bar.get_x() bar.get_width() / 2, bar.get_height() 1, f{score:.1f}, hacenter, fontsize9) plt.title(学生成绩分布) plt.ylabel(分数) plt.ylim(0, 105) plt.legend() # 保存图表 plt.tight_layout() plt.savefig(scores_chart.png, dpi150) plt.show() if __name__ __main__: names, scores parse_scores(scores.txt) if not names: print(没有有效数据退出程序。) exit() avg, max_score, min_score analyze_scores(scores) print(有效学生人数, len(names)) print(f平均分{avg:.2f}) print(f最高分{max_score}) print(f最低分{min_score}) plot_scores(names, scores, avg)5.3 代码逻辑解析这个程序的结构是按函数拆分的每个函数负责一个清晰的任务parse_scores()负责文件读取和数据清洗。它按行读取先strip()去掉换行和空格再split(,)把一行拆成姓名和成绩两个字符串。这里最关键的是try...except块当float(score_str)抛出ValueError时说明该行成绩不是合法数值我们就跳过这一行。这就是字符串与数值转换的实战应用。analyze_scores()使用sum()、max()、min()等内置函数完成统计。返回值是一个元组这是 Python 中很常见的多值返回方式。plot_scores()使用了列表推导式[#2ca02c if s avg_score else #999999 for s in scores]这其实是一个条件表达式的循环用来批量生成颜色列表。axhline绘制一条平均分参考线让“哪些学生高于平均分”一目了然。注意zip(bars, scores)同时遍历柱形对象和分数用于标记柱顶数值。这里的bars是BarContainer可以迭代。5.4 运行与验证在命令行中执行python score_analysis.py预期输出如下跳过无效数据David, 跳过无效数据Ivy, 有效学生人数8 平均分80.00 最高分95.0 最低分60.0同时当前目录下会生成scores_chart.png弹出窗口中会看到 8 个柱状条其中高于平均分的是绿色低于平均分的是灰色红色虚线标记平均分。验证成功的标准输出统计结果与手工计算一致。图片中每个柱子的高度与分数对应。无效数据被过滤没有导致程序崩溃。如果程序运行失败第一步先检查scores.txt文件是否与脚本在同一目录且编码是否为 UTF-8。如果文件名不一致FileNotFoundError是最常见的错误。6. 逻辑控制条件判断与循环的组合实践上面的项目已经用到了if、for、try...except但逻辑控制的内容远不止这些。为了避免读者只会“照着写”这里再做一次系统的梳理并指出与数据类型相关的常见误区。6.1 条件判断中的类型陷阱条件判断if的本质是判断一个表达式的布尔值。很多初学者会写成score input(请输入成绩) if score 60: print(及格)这里的问题在于input()返回的是字符串score 60在 Python 3 中会直接报错。所以在条件判断之前必须先做类型转换score int(input(请输入成绩)) if score 60: print(及格) else: print(不及格)另一种情况是判断非空。我们可以利用“空字符串、空列表、0 在布尔语境下为 False”的特性写出更简洁的条件name input(请输入姓名) if name: print(f你好{name}) else: print(姓名不能为空)不过不要过度依赖隐式布尔转换。在关键判断时建议写清楚if name ! 或if score is not None便于他人阅读。6.2 循环与列表推导式for循环是数据处理的核心。比如我们要计算所有成绩的总分可以写total 0 for s in scores: total s但如果只是生成一个新列表更 Pythonic 的写法是列表推导式higher_than_avg [name for name, s in zip(names, scores) if s avg] print(高于平均分的学生, higher_than_avg)这段代码等价于higher_than_avg [] for name, s in zip(names, scores): if s avg: higher_than_avg.append(name)列表推导式更简洁但可读性对新手略差。在实际项目中如果逻辑简单推荐列表推导式如果逻辑复杂建议用普通循环并加上注释。6.3 异常处理和类型安全当数据来自外部文件或网络时异常处理是必须的。类型转换是异常高发区所以try...except通常围绕int()、float()展开。def safe_float(value, defaultNone): try: return float(value) except (ValueError, TypeError): return default这样写的好处是只要转换失败就返回默认值程序不会中断。在数据处理管线中这是一种很安全的设计模式。但你也要注意无脑吞掉异常可能隐藏真正的问题。更稳妥的做法是记录日志或者统计跳过条数方便后续排查。7. 常见问题与排查思路实践过程中读者可能会遇到各种各样的报错。我整理了一张排查表覆盖本文涉及的核心问题问题现象可能原因排查方式解决方案TypeError: unsupported operand type(s)字符串与数值直接进行算术运算打印变量类型type(var)使用int()/float()转换ValueError: invalid literal for int()字符串不是合法数值打印字符串内容先做格式校验或用try...except捕获绘图中文显示为方块Matplotlib 默认字体不支持中文查看当前字体设置设置plt.rcParams[font.sans-serif]为中文字体保存的图片为空白plt.show()后调用plt.savefig()检查代码顺序将savefig()放在show()之前FileNotFoundError文件名或路径不正确查看当前工作目录os.getcwd()使用绝对路径或调整相对路径浮点数计算结果不精确二进制浮点数存储精度问题打印结果观察尾数需要精确时使用Decimal列表索引越界数据行拆分后不足两列打印parts的值在拆分后检查len(parts)条件判断永远为真/假对字符串和数值直接比较或未转换 input 结果打印变量类型和值先转换类型再比较除了表格里的问题还有一类隐蔽问题数据里含有空白字符。比如88\n直接float()是可以的因为float会忽略前后空白但 88 也可以。如果字符串里包含了不可见字符如\xa0不间断空格转换就会失败。这时可以用str.strip()和str.replace()先清洗。排查问题时我建议按照“定位报错行 → 打印变量 → 检查类型 → 检查值 → 检查逻辑”的顺序进行。新手最常见的错误是只看报错信息却不打印中间变量。多个print()调试语句并不可耻等到熟练后再逐步替换为日志模块。8. 最佳实践与工程建议8.1 变量命名规范变量名应该表达数据含义。比如scores比list1好valid_scores比s2好。Python 官方推荐使用小写字母加下划线例如average_score。避免使用l、O、I等容易混淆的单个字母。8.2 类型一致性设计在项目设计阶段就想清楚每个变量应该是什么类型。比如学生姓名str年龄int成绩float是否及格bool所有成绩list[float]函数内部尽量减少类型转换次数。如果从文件读取的数据都是字符串建议在解析阶段一次性转换成目标类型而不是在使用时到处int()。8.3 使用类型注解提升可读性Python 3.5 支持类型注解可以帮助 IDE 做静态检查也让代码更易读。def parse_scores(filename: str) - tuple[list[str], list[float]]: ...类型注解不会改变运行行为但它是一种工程规范。对于团队协作强烈推荐。8.4 数据清洗放在最前端数据清洗应该是最早完成的步骤不要在绘图前临时处理。像上面项目中的parse_scores已经把无效数据过滤掉了后续逻辑就不会被脏数据干扰。如果清洗逻辑分散在多个函数里很容易出现漏网数据。8.5 使用环境隔离管理依赖无论是学习还是项目开发都建议为每个项目创建一个虚拟环境。在命令行中python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate pip install matplotlib这样可以避免不同项目依赖库版本冲突。版本锁定也很重要建议生成requirements.txtpip freeze requirements.txt8.6 绘图的工程建议每个图形都要有标题、坐标轴标签和图例。颜色选择要照顾色弱人群尽量使用高对比度颜色。导出图片时设置合适的dpi一般 150 足够网页展示。在脚本中建议先savefig()再show()避免交互式窗口阻塞脚本运行。不要把图表文件输出到代码目录的根目录可以单独建output/文件夹。9. 总结与后续学习方向这篇文章从“变量与基本数据类型”出发覆盖了字符串的常用操作、数值类型与精度问题、类型转换的陷阱、Matplotlib 绘图基础以及一个完整的成绩分析与可视化项目。核心主线是所有数据处理的第一步都是确保你的数据有正确的类型。字符串只是文本数值才能计算布尔值才能判断列表才能遍历和聚合。类型混乱会导致后续所有操作寸步难行。在实践过程中建议你按以下顺序巩固先独立完成文章中的成绩分析程序并尝试修改代码比如增加“优秀率统计”“分段柱状图60分以下、60-80、80-100”等。把数据来源从文本文件换成 Excel 或 CSV体验csv模块和pandas的异同。练习更多绘图类型散点图、箱线图、直方图思考不同图表的适用场景。然后进入“逻辑进阶”阶段掌握while循环、函数式编程中的map/filter以及logging代替print调试。有一点需要提醒不要以为懂了数据类型和绘图就算真正入门编程的核心能力是“用抽象思维拆解问题”。当你以后面对爬虫、数据分析、Web 开发等方向时会发现这里讲的基础知识仍然是地基。地基牢固的人走多远都不会慌张。如果你在运行过程中遇到本文没有覆盖的问题欢迎在评论区附上报错信息和关键代码社区的力量会让你少走很多弯路。建议先收藏这篇指南等动手实践时再翻出来对照检查。下一篇可以继续深入探讨“列表、元组、字典与 JSON 数据结构的实际应用”敬请关注。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →