大语言模型能够根据需求生成 Python 代码,但将代码用于实际任务,还需要理解数据怎样表示、操作如何执行,以及结果是否符合要求。学习基础语法,有助于读懂生成的程序、调整处理规则,并发现数据转换和计算中的问题。

从运行环境、代码组成到数据类型与常用容器,这些知识构成了阅读程序的共同基础。将它们与需求描述、运行观察和结果核验结合起来,可以更有效地应用大模型生成的代码,为文件处理、数据分析和后续人工智能应用做好准备。

一、Python 与程序运行

程序从编写到执行,需要编程语言、解释器和开发工具共同配合。理解它们的作用,可以帮助我们选择运行方式,并在出现问题时找到检查方向。

1.1 Python 的特点与应用

Python 由吉多·范罗苏姆(Guido van Rossum)设计,1991 年首次公开发布。它注重代码可读性,语法相对简洁,并提供丰富的数据处理工具。

打开网易新闻 查看精彩图片

图 1-1:Guido van Rossum

Python 的应用包括文件整理、表格处理、科学计算、图像分析和机器学习等。不同任务共享相同的语法基础,再通过相应的模块库获得专门功能。

1.2 源代码与解释器

源代码(Source Code)是使用编程语言编写的程序文本。高级语言源代码需要经过相应软件的处理,才能完成其中规定的操作。

编译(Compilation)将源代码转换为目标代码。目标代码可以是处理器执行的机器代码,也可以是供虚拟机执行的中间形式。

解释(Interpretation)则由解释器读取源代码或中间表示,执行相应操作。

两种方式可以结合使用。

解释器(Interpreter)是运行 Python 程序的软件。

常见的 CPython 实现通常先将源代码编译为字节码(Bytecode),再执行字节码;使用者一般通过运行源文件完成这一过程。

Python 是语言,CPython 是这种语言的一种实现。学习基础语法时,重点是理解源代码表达的规则,以及解释器执行这些规则后产生的结果。

1.3 安装与开发工具

从 Python 下载页(https://www.python.org/downloads/)选择与操作系统及所需程序库兼容的版本,完成安装后检查解释器是否可以启动。

终端(Terminal)提供输入命令和查看结果的界面。终端命令用于启动程序、管理环境等操作,Python 代码则由 Python 解释器执行。

编辑器用于编写和保存代码。集成开发环境(Integrated Development Environment,IDE)进一步整合运行、调试和项目管理等功能。

常用的 Python 开发工具包括:

(Integrated Development and Learning Environment,集成开发与学习环境):适合短程序和基础练习。

:通过扩展提供 Python 编辑、运行与调试支持。

:提供较完整的代码检查、调试和项目管理功能。

:结合编辑器、控制台与变量查看,常用于科学计算。

:将代码、说明文字和运行结果组织在同一文档中,适合分步分析。

初学时选用一种工具即可,也可以使用专为教学开发的轻量级 IDE,如 等。

开发工具需要连接具体的解释器,不同工具或项目可能使用不同的运行环境。

1.4 程序的运行方式

函数(Function)是可调用的处理过程,调用时用圆括号提供参数。

比如,内置函数 用于显示内容, 用于返回长度;返回结果可以交给其他操作继续使用。

1.4.1 交互式运行

交互式运行适合即时计算和短小试验。

REPL(Read–Eval–Print Loop,读取—求值—输出 循环)概括了它的基本过程:接收输入、执行计算、显示结果,再等待下一次输入。

python

1.4.2 命令行运行脚本

脚本(Script)通常是直接执行的程序文件。将代码保存为 .py 文件,可以完整保留处理步骤,并通过命令行重复运行。

脚本通常按照语句顺序执行,普通表达式的结果需要通过输出操作显示。

运行时应确认目标文件和解释器,并根据错误信息检查执行情况。

1.4.3 在 IDE 运行

集成开发环境 IDE 将代码编辑、运行和调试结合在同一界面中。

打开项目或脚本后,选择相应的 Python 解释器,即可通过运行功能执行程序,并在输出窗口查看结果。

打开网易新闻 查看精彩图片

图 1-2:源代码、开发环境与运行结果

不同工具的运行命令和快捷键有所区别。运行前应保存修改,并确认执行的是当前目标文件。

二、Python 代码组成与编程风格

读懂代码,需要先认识程序中的名称、数据与操作,再理解语句之间的组织关系。统一的命名和排版能够清楚地呈现这些关系,降低阅读和修改的难度。

2.1 对象、变量与赋值

对象(Object)是 Python 程序操作的数据实体,具有类型以及相应的值或状态。变量(Variable)可以理解为引用对象的名称。

赋值(Assignment)先计算右侧表达式,再将结果赋给左侧目标。对变量名赋值时,会建立或更新名称与对象之间的绑定关系。

Python 通常不要求先声明变量类型,但每个对象都有具体类型。

普通赋值建立引用关系,不会自动复制对象;可变对象的共享与复制将在后续说明。

2.2 字面量、表达式与语句

字面量(Literal)是在代码中直接写出的值的表示,例如数值和带引号的文本。

表达式(Expression)经过求值产生结果,可以由字面量、变量名、运算符和函数调用等组成。

语句(Statement)用于执行赋值、计算、导入或流程控制等操作。表达式可以成为语句的一部分,也可以单独构成表达式语句。

打开网易新闻 查看精彩图片

图 2-1:变量、表达式与语句的组成关系

区分求值与赋值,有助于理解数据何时被计算、何时被保存,以及后续操作使用的是哪个结果。

2.3 标识符与命名规范

标识符(Identifier)用于命名变量、函数和模块等。常见写法由字母、数字和下划线组成,不能以数字开头,并且区分大小写。Python 也允许符合规则的非英文字符。

变量名和函数名通常采用有意义的小写单词,多个单词之间以下划线连接。

名称应表达数据的用途或含义,便于联系实际任务理解代码。

关键字(Keyword)具有专门的语法用途,不能作为普通变量名。软关键字(Soft Keyword)只在特定语法位置具有特殊意义。

内置名称是 Python 已经提供的功能名称,应避免用普通数据遮蔽它们。关键字与内置名称需要区分:前者受语法限制,后者通常允许重新绑定,但可能影响后续调用。

match_count = 2

2.4 语句、代码块与缩进

顺序、选择和循环等控制结构决定程序的执行过程。多个存在从属关系的语句组成代码块(Code Block),Python 使用缩进(Indentation)表示这种关系。

条件、循环和函数定义等复合语句通常由首部和所属代码块组成。

首部以冒号(:)结束,后续缩进表示哪些操作属于该结构。

每级缩进使用4个空格是推荐风格,正确的缩进层次则属于语法要求。改变缩进可能改变执行范围,因此修改格式时也需要关注程序行为。

打开网易新闻 查看精彩图片

图 2-2:语句、代码块与缩进层次

2.5 可读性与代码布局

PEP(Python Enhancement Proposal,Python 增强提案)是 Python 社区讨论规范和改进建议的文档形式。PEP 8 提供命名、缩进、空格和代码布局等风格建议;《》(The Zen of Python)强调清晰、简洁和可读性。

风格规范帮助读者理解程序。对大模型生成的代码,清楚的名称和适当的分段,也有助于检查计算依据与修改范围。

长表达式通常可以在括号内换行。显式续行也可使用反斜杠(\),但它对行末位置有严格要求,阅读和修改时需要特别留意。

print(total_score)  # 263

2.6 注释与文档字符串

注释(Comment)用于说明处理规则、设计原因或适用条件。Python 注释以 # 开始,延续到当前行末;字符串内部的 # 是普通字符。

好的注释补充代码难以直接表达的信息,并与实际执行保持一致。

文档字符串(Docstring)用于说明模块、类或函数的用途,通常使用三引号(""")书写,并放在相应主体的第一条语句位置。

注释和文档字符串有助于理解用途,但代码的实际行为仍需通过阅读和运行核验。

三、基本数据类型与运算

数据类型(Data Type)决定对象支持哪些操作。

数值、文本、判断结果和缺失信息各有适合的表示方式。理解类型,才能判断代码是在计算、拼接、比较,还是转换数据。

打开网易新闻 查看精彩图片

图 3-1:数据含义与类型选择

3.1 数值类型与算术运算

3.1.1 整数

整数(Integer)使用 int 表示,包括正整数、负整数和零。Python 整数精度不受固定机器字长限制,但计算与存储仍受可用资源约束。

print(0xA)       # 10,十六进制

3.1.2 浮点数与除法

浮点数(Floating-point Number)使用 float 表示,适合表示带小数的数值和科学计数法形式的数值。

常见除法运算包括普通除法(/)和向下取整除法(//)。

向下取整得到不大于商的最大整数,处理负数时需要注意其方向。

浮点数采用有限精度表示,许多十进制小数只能近似存储。数值比较应考虑任务允许的误差,显示位数也应与精度要求相适应。

Python 还提供复数(Complex Number)类型 complex,适用于涉及实部和虚部的计算。

普通登记与成绩汇总通常以整数、浮点数为主。

3.1.3 算术运算符的优先级

运算符优先级决定表达式的结合方式。在常见的二元中,幂运算(**)优先于乘法(*)、除法(/)、向下取整除法(//)和取余(%),后四者优先级相同,均高于加法(+)与减法(-)。括号可以明确计算范围,使规则更容易核对。

print((-2) ** 2)   # 4,底数为 -2

3.2 字符串与文本处理

3.2.1 字符串表示

(String)使用 str 表示文本,是不可变的字符序列。成对的单引号、双引号或三引号都可构成字符串。

文本的含义决定是否需要数值转换。编号即使由数字组成,也可能需要保留前导零等表达形式。

转义(Escape)用反斜杠(\)引入特殊写法。原始字符串(Raw String)便于表示包含反斜杠的文本,多行字符串则可以保留文本中的换行。

# 普通赋值中的三引号字符串表示文本数据。

3.2.2 索引与切片

(Index)用于访问指定位置的元素,序列索引从零开始,负索引从末尾计数。

切片(Slice)用于取得一段序列,可以指定起点、终点和步长,其范围包含起点、不包含终点。

打开网易新闻 查看精彩图片

图 3-2:索引与切片的取值范围

字符串长度按Unicode 码点计数,与编码后的字节数不同,也不总等于视觉上感知的字符数量。

3.2.3 字符串方法

方法(Method)是与对象关联的可调用操作。用于清理、替换、切分和内容判断,返回处理结果,原字符串保持不变。

文本清理应遵循字段约定。空白、单位和标点有时属于有效内容,删除或替换之前需要明确处理目的。

3.3 布尔值与逻辑运算

(Boolean)使用 bool 表示,包含 True 和 False 两个值,适合表示条件判断结果。

(==、!=、>、<、>=、<=)用于判断大小或相等关系,Python 支持链式比较。(and、or、not)用于组合多个条件。

逻辑与(and)、逻辑或(or)采用短路求值(Short-circuit Evaluation):从左向右计算,结果已经确定时停止求值。它们返回所选择的操作数,因此结果也可能是数值、文本或其他对象。

print("" or "未填写")                # 未填写

3.4 缺失值与真假判断

None 是 类型的唯一实例,常用于表示尚未提供的值或没有适用结果。缺失信息的含义应与数值零、空文本等情况分别约定。

(is、is not)用于判断是否为同一个对象;相等比较(==)则依据对象类型规定的规则判断值是否相等。判断缺失标记 None 时,通常使用身份比较。

内置函数 可以用于多种对象的真假判断。

None、数值零和空容器通常为假,非空字符串通常为真。数据是否缺失,应根据字段含义判断。

# 0 分可以是有效成绩,不能仅因其为假就判为缺失。

3.5 运算关系与综合优先级

算术运算产生数值,比较运算判断数值或对象之间的关系,逻辑运算再组合判断结果。对这里涉及的运算,通常按“算术运算、比较运算、逻辑非、逻辑与、逻辑或”的优先关系理解;括号可以明确分组。

优先级决定表达式怎样结合,短路规则决定某些部分是否需要执行。复杂条件应通过括号和有意义的中间名称表达,便于核对业务含义。

print(not math_score >= 60)      # False,相当于 not (math_score >= 60)

3.6 类型判断与转换

类型判断用于确认对象支持哪些操作。则按照目标类型的规则生成结果,并不会自动改变原名称的绑定。

打开网易新闻 查看精彩图片

图 3-3:文本转换与数值计算

具体类型判断与类型关系判断用途不同。Python 的布尔类型是整数类型的子类,处理严格的数值字段时需要考虑这一关系。

转换成功只说明数据满足相应的转换规则,业务有效性还需要另外检查。

# "85" + 10    # TypeError:文本与整数不能直接相加

3.7 输入与格式化输出

输入与输出连接程序和使用者。常使用内置函数 和 。

输入得到的数据通常需要根据用途解释,输出则需要以便于理解和核对的形式呈现。

(Formatted String Literal),也称 f-string,可以把表达式的结果插入文本,并指定显示格式。

输出格式用于组织显示,数据类型和内部数值仍由实际计算决定。补零等操作也需要明确的字段规则。

四、组合数据类型与对象引用

一条记录包含多个字段,一批数据又包含多条记录。容器(Container)把多个对象组织在一起,支持按位置、名称或成员关系访问数据。选择容器时,应结合顺序、修改和查询需求。

4.1 列表:有序数据

(List)使用 [ ] 表示,是有顺序、可修改的序列,适合保存字段顺序、成绩和记录集合。

列表支持索引、切片和成员判断。切片创建新的外层列表;直接索引取得相应元素。

列表修改会改变当前内容,可能同时影响元素位置。阅读连续操作时,应跟踪每一步形成的新状态。

内置函数 和 sort() 都可以用于排序。排序既可以生成新的列表,也可以直接改变原列表。是否保留原顺序,应由任务要求决定。

print(result is None)               # True,sort 返回 None

4.2 元组:固定组合

(Tuple)是不可变序列,适合表达具有固定位置含义的数据组合。非空元组由逗号(,)构成,通常使用圆括号包围;单元素元组也需要逗号,空元组写作 ()。

解包(Unpacking)可以把组合中的元素分别绑定到多个名称。

元组的不可变性针对其元素引用。若元素引用的是可变对象,该对象内部仍可以发生变化。

print(record)        # ('张三', [85, 90, 88])

4.3 字典:键值对应

(Dictionary)使用 { } 表示,通过键(Key)对应值(Value),适合表达字段与内容、编号与记录等关系。

打开网易新闻 查看精彩图片

图 4-1:列表的位置访问与字典的字段访问

字典保留插入顺序,但访问元素的依据是“键”。每个键对应一个值,重复赋值会更新原值。

keys()、values() 和 items() 分别提供键、值和键值对,可用 list() 收集为列表。嵌套字典可以表达多条具有相同字段的记录。

用编号组织记录时,应先确认编号的唯一性,避免后续记录覆盖前面的内容。

4.4 集合:去重与关系比较

(Set)使用 { } 表示,保存不重复的元素,适合成员判断、去重和集合关系比较。集合没有可依赖的位置顺序。

集合元素和字典键需要(Hashable)。这要求对象能够提供稳定的哈希值,且相等对象具有相同哈希值。常见的整数和字符串满足这一要求,列表和字典不能直接用作集合元素或字典键。

集合运算可以比较不同数据范围:交集(&)包含共同元素,并集(|)包含双方所有元素,差集(-)包含仅属于指定一侧的元素。

去重依据是元素相等关系,真实记录是否重复还需要业务规则判断。编号、姓名等字段的识别能力不同,应根据任务选择比较依据。

4.5 共享引用与浅拷贝

列表、字典和集合属于可变对象,可以在原对象上修改内容;字符串和元组属于不可变对象。

当多个名称引用同一个可变对象时,通过任一名称修改对象,其他名称也能观察到变化。这种共享关系是阅读数据处理代码的重要依据。

(Shallow Copy)创建新的外层容器,内部对象仍通过引用共享。嵌套数据是否需要进一步复制,应由后续修改范围决定。

打开网易新闻 查看精彩图片

图 4-2:浅拷贝中的内外层引用

4.6 组合数据类型的选择依据

组合数据类型选择应围绕数据关系展开:

• 列表保留位置顺序,适合连续处理一批元素。

• 元组表达固定组合,适合不需要替换元素的结构。

• 字典建立键值对应,适合按字段或编号查询。

• 集合表达成员关系,适合去重及范围比较。

打开网易新闻 查看精彩图片

图 4-3:组合数据类型的选择依据

同一任务可以使用多种容器,分别承担数据保存、输出排序和字段检查等职责。

print(headers[0], record["学号"])       # 学号 001

五、模块与项目环境

基础语法用于表达数据与操作,模块库则提供可复用的专业功能。阅读大模型生成的程序时,需要认识功能来自哪里,以及运行环境是否具备相应依赖。

5.1 函数调用与模块导入

可以直接调用;使用模块中的功能时,还需要先导入相应名称。

模块(Module)是组织可导入代码的单位,常见形式是 Python 文件。模块可以提供函数、类型和数据等名称。

模块中的代码通常在首次导入时执行,随后在同一解释器进程中复用。导入可能伴随顶层代码的执行,因此检查程序时也要关注被导入模块的来源。

5.2 标准库与第三方库

标准库通常随 Python 提供,覆盖数学、文件路径、日期和系统信息等基础功能。第三方库由其他项目提供,需要安装到当前运行环境中。

安装名与导入名可能不同。模块查找还会受到解释器的搜索路径影响,本地文件与所需模块同名时,可能干扰正常导入。

第三方库的安装在项目环境中进行,创建与使用虚拟环境的命令见下一节。

遇到无法导入模块的问题,应先确认安装与运行是否使用同一解释器,再检查依赖名称和文件重名情况。

5.3 虚拟环境与依赖记录

虚拟环境(Virtual Environment)为项目提供相对独立的 Python 环境,默认隔离其他环境中的第三方包,有助于减少版本冲突。

项目环境应保持明确:解释器、已安装的包和实际运行程序的位置需要相互对应。激活环境会调整当前终端的命令搜索路径,也可以在开发工具中直接选择环境内的解释器。

依赖记录有助于重新建立环境,但它仍受操作系统、解释器和包的兼容条件影响。精确复现还需要保存输入材料、程序及必要的运行说明。

5.4 文件组织与路径

项目(Project)通常包含程序、输入材料、输出结果和依赖记录。将这些内容分开保存,有助于明确程序读取和生成了哪些文件。

打开网易新闻 查看精彩图片

图 5-1:程序、项目环境与数据文件

当前工作目录(Current Working Directory)是多数相对文件路径的参照位置,可能与脚本所在文件夹不同。构造路径、确认文件存在和读取文件内容是不同操作。

# 以上操作不会创建文件,也没有读取文件内容。

六、大模型代码的阅读与应用

应用大模型生成的代码,需要把任务要求与程序行为联系起来。明确输入和输出,追踪关键数据的变化,再用独立确定的预期检查结果,可以逐步判断代码是否适用,以及需要怎样修改。

打开网易新闻 查看精彩图片

图 6-1:大模型代码的阅读与应用流程

6.1 明确需求与生成代码

提出请求时,应说明输入形式、处理规则、预期输出和运行限制。涉及缺失信息、异常输入或文件修改时,还应约定处理方式。可以采用以下提示框架:

请使用 Python 完成[具体任务]。输入为[数据形式与样例],按[处理规则]生成[预期输出]。运行环境与限制为[环境及限制]。请先指出需要确认的条件,再给出能够独立运行的代码,并在注释中说明关键步骤、输入前提和所需依赖。

初次尝试宜选择输入少、结果容易核对的任务。

例如,整理一组数值并计算统计结果,可以使用以下请求:

请将文本成绩 "85"、"90"、"88" 转换为整数,计算总分和平均分,并将平均分显示为一位小数。仅使用 Python 内置功能,在注释中说明处理步骤。当前假定输入均为有效成绩,无须读取或保存文件。

6.2 阅读结构与追踪数据

阅读代码时,可以先辨认输入、处理和输出,再追踪关键数据的类型、取值与变化。需要关注原始数据是否被修改、哪些条件限制处理范围,以及调用返回的结果被如何使用。

名称和注释能够提供阅读线索,实际行为由执行的语句决定。对于不熟悉的操作,可以结合文档和小样例确认其参数、返回结果及对原对象的影响。

6.3 运行与结果核验

运行前,应确认解释器、依赖和输入材料;运行后,按照任务要求检查结果。

核验重点通常包括:

• 完整性:应处理的数据是否遗漏或重复。

• 对应关系:字段、位置与来源是否一致。

• 处理结果:计算、筛选和转换是否符合规则。

• 输出要求:显示格式、保存位置及文件内容是否正确。

预期结果应通过手算、原始材料或其他可靠依据独立确定。程序正常结束,只说明此次执行没有因未处理的异常而中断,仍需逐项检查结果。

6.4 需求变化与代码修改

修改程序前,先明确哪些输入、规则和输出需要变化,再定位相关代码。增加一项数据,可能同时影响数据转换、统计范围与输出内容;只修改其中一处,容易造成遗漏。

向大模型提出修改请求时,可以使用以下框架:

请基于现有代码,将[原要求]调整为[新要求],保留[已有行为]。请说明受影响的部分,给出必要修改,并提供用于核验新旧功能的样例与预期结果。

修订后,既要检查新要求是否实现,也要重新核验原有功能。每次围绕一个明确目标修改,更容易判断变化的原因与影响。

6.5 边界测试与问题定位

测试应覆盖正常输入、边界情况和不符合约定的输入。根据任务,可选择数值上下限、空文本、缺失字段或空列表等样例,先确定预期处理方式,再观察实际结果。

发现差异时,沿输入、转换、处理和输出检查,寻找最先偏离预期的环节。报错信息有助于定位执行问题;输出错误则需要核对规则、数据关系和计算范围。

向大模型反馈时,应提供能够复现问题的必要代码、输入、预期结果,以及实际结果或报错信息。修订后重复相关测试,确认问题已经解决。

小结

Python 的运行环境、名称与赋值、数据类型、运算和容器,共同构成代码阅读基础。统一风格有助于理解结构,明确类型与对象引用有助于追踪变化;结合任务要求和样例核验,可以判断生成代码是否适用。

参考阅读:

“点赞有美意,赞赏是鼓励”