尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【基础篇 05】Python 零基础也能跟上:把第一份代码一行一行读明白
YOLO从零到论文模型改进与科研实战全攻略YOLO基础篇 · A05作者迪菲赫尔曼大家好我是迪菲赫尔曼。前面我们把文件放好了也认识了 VS Code 和终端。这一篇咱们回到中间的编辑区读一点真正的 Python 代码。如果你之前没有学过编程看到这里可能又有点犹豫是不是得先找一本 Python 教材从第一页学到最后一页才有资格继续做 YOLO一想到后面还有深度学习、模型和论文眼前这条路好像突然又长了很多。咱们先把这一步走小一点。先分清引号里的文字找到代码中的图片路径和参数再试着自己改一处。这样回到训练脚本时你就能认出一些熟悉的写法知道自己动了什么。后面用到的新知识我们会接着补。现在先把手里这几行看明白也是在认真学编程。今天就从下面几个问题开始引号里的文字是什么 等号在代码里是什么意思 方括号和圆括号分别在干什么 import 是不是在安装软件 函数写好了为什么还需要调用我们用同一份小练习逐步解释最后留下一个完整的practice.py。这一篇的必做任务是读懂、修改和保存。接下来先完成 A06—A09 的服务器连接再从 A10 准备 Python 环境后面的运行课再统一执行。你现在没有解释器不影响跟着做。文中的预期输出是给你对照代码含义的不需要为了看到它先去碰运气点运行按钮。这一篇内容多可以分两次学先看第 1—5 节把字符串、变量和列表读懂再看第 6—12 节把导入、函数和完整练习接起来。每次都保留自己的文件不需要一次记住所有术语。1. 从我们已经保存的两行代码开始打开自己的yolo-study再从左侧打开hello.py。第三篇保存的是print(大家好我开始学习 YOLO 了。)print(这是我保存的第一份 Python 代码。)我们先只看第一行print(大家好我开始学习 YOLO 了。)把它拆开部分在这里的作用printPython 提供的输出函数名称(与)表示调用这个函数大家好我开始学习 YOLO 了。传给函数的一段文字调用你先理解成“让它实际做一次事情”。这里是让print输出这段文字。正常运行这两行时对应输出是大家好我开始学习 YOLO 了。 这是我保存的第一份 Python 代码。输出里的双引号不见了。因为引号主要是在代码里告诉 Python中间这些内容是一段文字不是变量名、命令或者其他代码。这段文字在 Python 里叫作字符串英文是 string。1.1 为什么中文可以写引号却不能随便换因为引号内部是我们要表达的内容外部符号承担的是语法结构。下面这种英文双引号可以print(你好YOLO)成对的英文单引号也可以print(你好YOLO)但本篇统一使用英文双引号先减少变化。不要把输入法自动产生的中文弯引号和代码要求的引号混在一起。以下只是错误示例不要复制到程序里print“你好YOLO”如果你发现自己总打出这种符号先把输入法切到英文再输入构成代码的括号和引号文字内容仍然可以写中文。1.2 代码和输出不能一起粘进去文章里展示的输出不需要放进.py。你要保存的是print(...)这些代码。运行后Python 才会产生对应的显示内容。如果把“大家好我开始学习 YOLO 了。”这一行输出也直接粘进文件Python 可能会把它当成代码继续解释就会出问题。2. 新建 practice.py后面都在这一份里练这次保留hello.py方便以后第一次运行时做最简单的检查。在左侧最外层yolo-study上点右键新建文件practice.py最终位置应该是yolo-study ├── images │ └── bus.jpg ├── hello.py ├── notes.txt └── practice.py下面第 3—8 节的小代码块用来逐段理解不要把每一个都不断追加到文件末尾。可以临时替换practice.py的内容练习第 9 节会给出最终完整版本以那一份为准保存。这样不会因为重复粘贴十几个片段最后不知道哪行影响了哪行。3. 变量给一个值起名字后面通过名字使用它先看image_pathimages/bus.jpgprint(image_path)读这两行时从第一行右边看起images/bus.jpg是一个字符串内容是一条相对路径。在这里表示赋值。左侧image_path是变量名。也就是把右边这个值交给左边这个名字来引用。你可以先把变量名想成贴在值上的一个标签。之后写image_path就能使用它当前指向的值。第二行没有给image_path加引号因为我们要读取这个变量而不是输出它的名字。3.1 加引号和不加引号结果不同比较image_pathimages/bus.jpgprint(image_path)print(image_path)对应输出images/bus.jpg image_path第一条print使用变量里的值第二条print使用直接写出来的字符串。先看引号再看这个名字实际指向什么。变量名与同名字符串的区别两种 print 写法对应两种输出。不加引号时取变量当前的值加上引号后得到的就是这几个字母组成的文字。以后你看到sourceimage_path就要警觉这传入的是文字image_path并不是前面那个变量里的图片路径。这个地方单靠看“名字很像”是看不出来的要看有没有引号。3.2 变量名是不是可以随便拼在本篇练习里我们统一使用英文小写字母和下划线例如image_path、task_name。image_path和image_paths不是一个名字大小写也要区分。如果前面定义了image_path后面却写成下面这样就是错误示例print(img_path)这里的img_path没有在前面定义。真正运行时通常会遇到NameError。后面报错课会带大家读完整错误现在先知道要回头核对名字。3.3 再次赋值会使用新的值task_namedetecttask_nameclassifyprint(task_name)输出会是classify因为程序执行到第二次赋值时这个变量已经改为引用新字符串。不过这里只是修改了一个普通变量。仅仅把文字改成 classify不代表已经运行分类模型。还需要后面实际调用相应模型和接口。现在我们只学代码的表达方式。4. 数字、字符串和布尔值别只看长得像不像后面的配置里既有文字也有数字和开关。先看三个例子epochs30confidence0.25use_pretrainedTrue30是整数这里借用训练轮数这个含义帮助理解本篇没有启动训练。0.25是带小数点的数叫浮点数。True是布尔值表示真与它对应的False表示假。布尔值在 Python 中按这个大小写写。不要写成小写true也不要因为它看起来像英文单词就一定加引号。4.1 30 和 “30” 为什么要分print(301)print(301)预期输出31 301第一行对数字做加法第二行把两个字符串连接起来。这就是为什么参数值的类型不能随便改。某个接口需要数字时你传入文字不能指望它永远自动理解你的意思。同样True和True也不是同一种值。后者只是包含四个字母的字符串。现在不要求记所有类型转换先把原则记住看代码时连同引号一起看。4.2 注释写给人看代码才交给解释器执行# 这次练习使用第二篇保存的图片image_pathimages/bus.jpg这里第一行是注释从#开始。可以解释用途也可以提醒以后回来看代码的自己。但如果#在字符串内部它就是文字的一部分print(这是第 #1 次练习)不要把这两种情况混淆。字符串、数字、赋值、注释的基本规则可以对照 Python 官方入门说明。5. 列表把几项内容放在一起我们前面认识了三种任务。现在把它们放到一起task_names[detect,segment,classify]外面的[]是方括号这种写法创建了一个列表。里面有三项每项都是字符串用英文逗号隔开。拆开看列表名字task_names 第 1 项detect 第 2 项segment 第 3 项classify这里仅仅保存了三段文字不会同时运行三个模型。5.1 想取出其中一项怎么写task_names[detect,segment,classify]print(task_names[0])print(task_names[1])print(task_names[2])对应输出detect segment classifyPython 列表的这套下标从0开始。所以第一项对应[0]第二项对应[1]。这个列表只有三项最大有效非负下标是2不是3。如果取[3]就超出范围运行时会遇到IndexError。以后读网络配置或张量维度时还会遇到从零开始的编号咱们到具体场景再展开。长度是三最后一项的非负下标是二。5.2 想知道有几项用 lentask_names[detect,segment,classify]print(len(task_names))输出3len是 Python 提供的内置函数用来取得这里列表的长度。从内往外读这一行先算len(task_names)得到3再把这个结果交给外面的print输出。不要因为嵌了两层括号就跳过。看不懂时像这样拆成两行也可以task_names[detect,segment,classify]number_of_taskslen(task_names)print(number_of_tasks)这两种写法在这个例子里表达的是同一个计算结果。6. import把已有功能引进来不是在安装软件前面的print、len是 Python 内置提供的功能不需要先导入。有些功能需要从模块中引入。模块可以先理解为组织 Python 功能的一种单位。我们这次用一个实际会遇到的例子frompathlibimportPath它的意思是从 Python 标准库的pathlib模块中导入名为Path的功能。标准库先理解成 Python 自带的一组常用模块。本篇使用pathlib不需要为了它额外安装第三方包。Path的作用是帮助我们表示和处理文件路径。6.1 路径字符串和 Path 对象有什么区别frompathlibimportPath image_pathimages/bus.jpgimage_filePath(image_path)第一处image_path保存普通字符串。第二处Path(image_path)根据这段字符串创建一个路径对象再交给image_file这个变量。对象这个词先不要怕。这里把它理解成“能代表一条路径并且提供相关操作的值”就行。更完整的类与对象会在后面的 Python 补充课里讲。创建路径对象并不等于创建了那张图片。即使路径指向的文件不存在代码也可以先表示这条路径。6.2 怎么问“这是不是一个实际存在的文件”frompathlibimportPath image_filePath(images/bus.jpg)print(image_file.is_file())把最后一行拆开部分在这里的含义image_file前面创建的路径对象.访问这个对象提供的成员is_file这个对象提供的一项检查方法()实际调用这项检查is_file()返回布尔值表示这条路径是否指向一个现有的普通文件。文件可访问且路径正确时预期会得到True路径不存在、指向目录等情况下会得到False某些系统访问错误也可能需要具体排查。这里并没有识别图片内容也没有检查它是否真的能被图像库解码。它先回答的是路径层面的文件问题。6.3 相对路径的出发点又回来了Path(images/bus.jpg)使用的是相对路径。做这个文件检查时它依赖程序当前工作目录不会因为practice.py放在外层就自动把外层当作出发点。可以用frompathlibimportPathprint(Path.cwd())查看 Python 程序里的当前工作目录。cwd可以联系 current working directory 来理解。这就和上一节终端里的pwd接上了。以后使用不同运行入口咱们会同时核对 Shell 的位置和 Python 实际看到的位置。有关这些方法见 Python pathlib 官方说明。6.4 import 失败是不是在文件里再写一遍就能解决不一定。导入和安装是不同的过程。后面会用到from ultralytics import YOLO这是提前展示当前不要求写进练习。它要求当前 Python 环境能够找到对应的软件包。如果软件没有装在实际使用的环境里重复写十遍导入也不会自动把安装位置变正确。环境篇会讲安装、解释器和导入位置之间的关系。7. 函数把一小段操作起个名字再调用它我们前面调用了print也可以定义自己的函数defshow_task(task_name):print(本次选择的任务,task_name)show_task(detect)这段代码不要一口气看完分成两部分。7.1 第一部分是定义defshow_task(task_name):print(本次选择的任务,task_name)def表示接下来定义一个函数。show_task是这次给函数取的名字。括号里的task_name是参数调用时用来接收传入的值。行尾的英文冒号:表示后面要开始函数体。下一行向右缩进说明它属于这个函数体。本篇统一使用4 个空格缩进。VS Code 中按 Tab 通常可以按配置插入缩进但要看编辑器状态不要在同一段代码里随意混用 Tab 字符和空格。如果整段代码从文档复制进来缩进也要一起保留。7.2 第二部分才是调用show_task(detect)执行到这一行才会进入前面定义好的函数把detect交给参数task_name再执行函数体里的print。预期输出本次选择的任务 detect注意“定义好”与“执行一遍”不是一件事。只写定义、不调用Python 会准备好这个函数但不会因为函数体里有print就自动把它执行一遍。把执行顺序标在同一段代码上就能看清 print 是什么时候运行的。函数先定义、后调用调用把 detect 传入参数才进入缩进的函数体。只保留 def 这两行不会自动输出读到 show_task(“detect”) 时才进入函数体执行。这和第三篇“打开文件不等于运行文件”类似动作之间要分清。7.3 参数可以按名称传入同一个函数也可以这样调用defshow_task(task_name):print(本次选择的任务,task_name)show_task(task_namedetect)这里task_namedetect表示给名为task_name的参数传入字符串detect。这种写法叫关键字参数。不要把这一处等号简单理解成在外面新建了同名变量。这里是在函数调用中指定参数。而且参数名必须与函数能够接收的名称对应。我们这个函数定义的是task_name你随意改成taskdetect它并不会自动猜成同一个意思。这一点以后看训练参数时很有用参数名称、数值类型、接口版本都要对应起来。7.4 print 和 return有什么区别先用最简单的例子认识defadd_one(number):returnnumber1resultadd_one(3)print(result)add_one(3)会得到返回值4再赋给result最后由print输出。return把结果交回调用处print把内容显示出来。它们不是同一件事。本篇最终练习里的函数只负责显示信息不主动写return调用结束时默认返回None。因此不要把“函数打印了几行”理解成“它返回了一组这些字符串”。函数定义和调用的规则可以参考 Python 官方函数说明。8. 路径写进 Python为什么又要注意引号和斜杠第二篇我们复制过 Windows 路径。现在它要成为 Python 字符串就多了一层语法规则。反斜杠\在普通 Python 字符串中可以引入转义例如\n常用于表示换行。所以直接把一条带反斜杠的 Windows 路径塞进普通引号可能出现你没预料到的解释方式。本篇最简单的相对路径统一写image_pathimages/bus.jpg如果以后确实需要 Windows 绝对路径可以使用下面两种常见写法。这里只展示语法用户名和位置都必须换成实际存在的文件位置image_path C:/Users/XiaoMing/Documents/yolo-study/images/bus.jpg image_path rC:\Users\XiaoMing\Documents\yolo-study\images\bus.jpg第一种使用正斜杠第二种前面加r表示原始字符串在这种路径场景里让反斜杠保留原本的含义。原始字符串也有语法限制例如不能以单个未配对的反斜杠结束不要无限推广到任何写法。当前练习不需要把用户名抄进来继续使用images/bus.jpg然后在运行课里确保工作目录正确。还有一点文章里代码块外围那三枚反引号是 Markdown 的排版标记不属于 Python 文件内容。9. 把前面的内容连起来最终版 practice.py先把practice.py的临时片段替换成下面的完整内容再保存。不要复制后面展示的输出。frompathlibimportPathdefshow_learning_plan(task_name,image_path,task_names):print(本次练习任务,task_name)print(图片相对路径,image_path)print(认识的任务数量,len(task_names))print(列表中的第一项,task_names[0])task_names[detect,segment,classify]task_namedetectimage_pathimages/bus.jpgshow_learning_plan(task_nametask_name,image_pathimage_path,task_namestask_names,)image_filePath(image_path)print(当前工作目录,Path.cwd())print(图片文件是否存在,image_file.is_file())9.1 多了几行空行会不会改变含义这里的空行帮助我们把导入、函数定义、参数设置和执行过程分开便于阅读。但函数体前面的缩进有实际语法作用不能把“空行可以调整”理解成“每行前面的空格都随便删”。9.2 调用怎么分成了好几行这部分仍然只是在调用一次函数show_learning_plan(task_nametask_name,image_pathimage_path,task_namestask_names,)括号还没有闭合所以参数可以分行写。每个参数后面有英文逗号最后一项保留逗号也允许。task_nametask_name看起来左右一样其实左右角色不同左边 task_name函数接收的参数名称 右边 task_name调用时读取的那个变量右边变量当前保存的是detect所以把这个值传给了左边指定的参数。9.3 整份文件按什么顺序读导入 Path ↓ 定义显示信息的函数这时还没有调用函数体 ↓ 设置列表、任务名称和图片路径 ↓ 调用函数输出四行学习信息 ↓ 创建路径对象 ↓ 输出当前目录再检查图片文件这样看比从头逐字符硬背更清楚。9.4 之后正确运行时应该看到什么如果程序的工作目录是你自己的yolo-study并且第二篇的图片仍然存在预期格式如下本次练习任务 detect 图片相对路径 images/bus.jpg 认识的任务数量 3 列表中的第一项 detect 当前工作目录 这里会显示自己电脑上的实际路径 图片文件是否存在 True倒数第二行的路径因人而异上面用说明文字代替。前面中文冒号后还有print分隔参数时产生的一个空格。True说明这条路径指向一个存在的文件不说明图片内容已经被模型识别。本篇没有调用 YOLO也没有启动训练。如果以后运行时最后是False先看上一行的当前工作目录再检查images/bus.jpg的文件名与位置。不要先去改网络结构。10. 提前看看这些语法以后怎么接到 YOLO下面只用于读代码当前不要追加进practice.py。安装 Ultralytics、准备对应权重后才进入实际运行。from ultralytics import YOLO model YOLO(yolo26n.pt) results model.predict(sourceimages/bus.jpg, saveTrue)现在你已经能先认出几件事第一行是导入不是安装。yolo26n.pt是字符串这里用来指定模型权重。model是变量名。sourceimages/bus.jpg按参数名称传入字符串。saveTrue传入的是布尔值。再补充一点YOLO在这里是类YOLO(...)创建模型对象model.predict(...)是调用这个对象提供的预测方法。它们虽然都有圆括号具体作用还要看被调用的东西。results用来接收预测返回的结果。它不是因为“有个变量名叫 results”就自动保存成图片保存行为由接口参数和实际实现决定。相关接口和权重以官方预测说明及实战课固定版本为准。这一小段里相对路径、变量、导入、对象、方法、关键字参数全都用上了。我们先把这些基础看懂后面复制训练脚本就不再是一整块陌生符号。11. 自己改三处看看你是不是真的看懂了这一节先做纸面判断和文件修改运行结果留到环境配置完成后验证。11.1 只改 task_name在最终代码的变量赋值处把task_namedetect改成task_nameclassify问第一行“本次练习任务”会变成什么列表第一项会不会跟着改变参考回答任务显示变为classify列表第一项仍然是detect。因为我们只修改了一个变量没有修改列表。再次提醒这只是显示信息的练习没有真的加载分类模型。11.2 只改列表顺序把列表改成task_names[classify,detect,segment]问len(task_names)会变成多少task_names[0]又是什么参考回答长度仍然是3第一项变成classify。顺序改变并不意味着数量改变。这里故意换一次是为了观察列表的顺序含义。11.3 只改路径字符串假设把images/bus.jpg改成images/not_here.jpg并且目录里确实没有这个文件。问创建Path对象会自动生成图片吗is_file()预期返回什么参考回答不会生成图片在这个路径确实不存在且没有其他访问异常的前提下返回False。练完以后把文件恢复成第 9 节完整版本保存。后面统一用这一份继续不然运行课里大家拿到的任务名和路径就不一样了。12. 遇到这些错误先回头看哪一处现象或报错名称本篇先检查什么SyntaxError引号、括号是否成对是否用了中文结构符号冒号是否漏写NameError变量有没有定义前后名称和大小写是否一致IndentationError函数体是否缩进顶层语句是否误加空格IndexError列表下标是否超出范围文件检查得到False实际工作目录、路径、文件名是否对应这些是排查起点不是所有同类报错都只有这一种原因。等实际运行时我们会读完整错误位置和上下文。还有几处保存前就可以检查文件确实叫practice.py不是practice.py.txt。没有把输出示例和提示符复制进去。最后保留的是第 9 节完整版本而不是所有片段堆在一起。按保存关闭标签再从左侧重新打开核对内容仍在。在notes.txt最后补三句话尽量用自己的话字符串为什么需要引号 变量和带引号的同名文字有什么区别 相对路径为什么要检查当前工作目录现在我们已经有了两份保存好的 Python 文件一份只有两行输出一份把变量、列表、函数和路径检查连了起来。接下来先按主线完成 A06—A09 的服务器准备再回到 A10 配置运行环境。咱们会把“编辑器里能看见代码”一步步变成“知道哪个 Python 在执行、知道输出为什么是这样”。上一篇基础篇 04第一次使用终端下一篇A06租赁 GPU 服务器与取得登录信息
RELATED

相关推荐

【计算机类稿件可投 | IEEE出版,EI检索稳定 | 211南京航空航天大学主办,多所高校协办、支持】2026年机器学习与具身智能国际学术会议(ICMLEI 2026)

【计算机类稿件可投 | IEEE出版,EI检索稳定 | 211南京航空航天大学主办,多所高校协办、支持】2026年机器学习与具身智能国际学术会议(ICMLEI 2026)

2026年机器学习与具身智能国际学术会议(ICMLEI 2026) 2026 International Conference on Machine Learning and Embodied Intelligence 2026年12月11日-13日 中国南京(线上线下同步召开) 截稿时间:见官网&#xff…

📅 2026/10/29 20:03:29
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案

超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案

超融合和存算分离到底怎么选? 这两套架构不是替代关系,而是为不同业务形态设计的两种逻辑。今天从性能、可靠性、扩展、成本四个维度,把差异一次讲透。 ​ 四大维度:性能 性能上,超融合的优势是数据本地化——虚拟机…

📅 2026/10/29 20:03:29
从法规问答到流程校验:快消标签 AI 初审场景验证

从法规问答到流程校验:快消标签 AI 初审场景验证

快消食品新品上市,包装标签合规审查是一道绕不开的环节,也是极易拖慢项目进度的卡点。 产品名称措辞、配料表排版、营养成分标注、宣传用语风险、品类对应法规标准,每一项都需要逐条核对。 当企业新品不断上新、SKU 快速迭代、包装版本频繁更…

📅 2026/10/29 19:58:28
MORE NEWS

更多资讯

📰

DDPG在航空冲突解脱中的工程实践与OpenScope仿真落地

简介:本资源是一份面向航空交通管理、智能空管系统研发及强化学习应用研究者的专业技术文档,聚焦于解决高密度空域下航空器实时冲突解脱这一核心安全难题。文档系统阐述了一种基于深度确定性策略梯度(DDPG)的深度强化学习方法&…

📰

从550GB到1MB:HJB方程的牛顿策略迭代与Tensor Train压缩

简介:面向离散控制与最优控制研究者的Matlab代码包,聚焦Hamilton-Jacobi-Bellman方程的牛顿策略迭代求解,并采用Tensor Train格式缓解高维状态空间的计算与存储压力。包内共15个文件,以13个.m函数与脚本为主体,另有REA…

📰

深度学习+蚁群算法:羽毛球战术决策的组合优化实践

简介:PDF文档《深度学习优化蚁群算法的羽毛球项目技战术决策研究》面向体育信息技术、运动训练、机器学习与数据分析方向的读者,聚焦羽毛球比赛中战术选择、执行与调整这一复杂组合优化问题,给出基于深度学习和蚁群算法交叉融合的研究框架与建…

📰

金融风控欺诈检测全流程:从数据预处理到模型部署的避坑指南

简介:这份资源面向金融风控从业者、数据科学家及对机器学习落地感兴趣的开发者,以信用卡欺诈检测为案例,系统讲解从数据预处理到模型部署的完整流程。内容涵盖技术栈选型、类别不平衡处理、特征工程、基线模型训练、XGBoost深度调优、评估指标…

📰

Java openNLP模型训练、保存加载与推断工程避坑

简介:面向具备Java基础、希望快速上手自然语言处理模型训练与实体抽取的开发者,这份openNLP实践包围绕自定义模型创建、模型保存与加载、文本分词和实体推断展开,适合作为NLP入门到小规模落地的参考样例。压缩包共12个文件,约869K…

📰

A股量化分析工具OpenClaw:8大核心功能解析与应用

1. 项目背景与核心价值OpenClaw作为一款面向A股市场的量化分析工具,其"8个分析师技能"功能模块直击散户投资者的核心痛点——专业分析能力不足。在A股这个以散户为主的市场中,普通投资者常面临三大困境:信息过载难以筛选、技术指标…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬