📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Learn Python in 2026 - Full Python Course with Automation Projects & Tutorials

Great Learning9:44:19

Transcription

欢迎来到 Python 的世界,在这里创意与技术相遇。无论您是渴望深入编程的初学者,还是希望拓展技能的经验丰富的程序员,这段旅程都将为您带来惊喜。请注意,我们在描述中添加了本教程涵盖的课程以及时间戳,以便您可以轻松跳转到最令您兴奋的主题。您将掌握 Python 的基础知识,深入研究高级概念,并解锁强大的数据结构和算法的秘密。想象一下,您像专业人士一样分析数据。但这还不是全部。我们还将深入探讨用于自动化的 Python,简化日常任务,并为您的应用程序制作精美的交互式图形用户界面。加入我们,踏上这次全面的 Python 之旅。从基础到卓越,我们都为您准备好了。那么,让我们开始吧,用代码走向精通。在 Python 基础知识中,我们将从基础开始。安装 Python,理解变量、数据类型、运算符和流程控制语句。您还将了解 Python 的核心数据结构,元组、列表、字典和集合。接下来,我们将深入探讨面向对象编程、继承和异常处理等高级主题。您还将学习文件处理技术,以高效地管理您的数据。理解数据结构和算法是关键。我们将涵盖数组、栈、队列、链表以及线性搜索、二分搜索、插入排序、快速排序和归并排序等基本搜索和排序算法。在 Python 自动化中,我们将专注于让您的生活更轻松。您将学习使用 Selenium 进行 Web 自动化。我们还将使用 Tkinter 进行 GUI 开发,让您的应用程序栩栩如生。在此期间,让我们快速开始 Python 基础知识的第一个模块。一切都从这里开始。我们将从介绍 Python 语法和核心概念开始。您将了解变量、数据类型以及像 oops 和条件语句这样的控制结构。在本节结束时,您将能够舒适地编写简单的 Python 程序,并准备好应对更复杂的挑战。>> 我们将从在本机上安装 Python 开始本课程。要安装 Python,我们需要访问这个特定的网站:python.org downloads。我将点击此链接。正如您所见,由于 Python 是平台无关的,无论您使用的是 Windows 系统、Linux 系统还是 Mac,都可以下载适用于这些操作系统的 Python。由于我使用的是 Windows 系统,我只需点击此特定链接,Python 就会被下载。现在,下载 Python 后,我们需要一个 IDE。那么,IDE 到底是什么?IDE 是 Integrated Development Environment(集成开发环境)的缩写。现在,如果您只下载 Python,我们还需要一个能让我们的编码更轻松的环境。因此,如果您曾使用过 C、C++ 或 Java 等其他编程语言,您就会知道您也为这些语言使用过 IDE。因此,如果您使用过 Java,您可能使用过名为 Eclipse 的 IDE。同样,如果您使用过 C 或 C++,您可能使用过 Turbo C++ 或 Dev C++ 等 IDE。同样,Python 有很多 IDE 可供选择。因此,Python 的一个这样的 IDE 是 PyCharm。我们可以从这个特定链接下载 PyCharm:jetbrains.com/pycharm。我将在此处点击。然后我需要点击此下载按钮。正如您所见,我们有专业版和社区版。如果您只需要用于单用户开发,您可以直接下载此社区版。同样,正如您在此处看到的,如果您使用的是 Windows 系统,您可以下载适用于 Windows 的 PyCharm。如果您有 Mac,则可以下载适用于 Mac 的 PyCharm。同样,如果您有 Linux,则可以下载适用于 Linux 的 PyCharm。由于我使用的是 Windows 系统,我将选择此项并下载社区版。接下来,我们有 Anaconda,它实际上是 Python 和 R 的发行版。因此,如果您想进行任何机器学习或数据科学工作,Anaconda 是一个完整的工具包。它为您提供了许多与 Python 相关的工具。它将为您提供一个名为 Jupyter Notebook 的 IDE。不仅仅是 IDE。除了 IDE,它还为您提供了许多库。例如 Mattplot Lib、Seabor、Pandas 和 NumPy。因此,您无需手动安装这些库。一旦您下载并安装了 Anaconda,您就可以从这个特定网站安装 Anaconda。在此处您看到产品选项卡。点击个人版,这是开源版本。然后向下滚动,您会在此处找到下载按钮。同样,由于我使用的是 Windows 系统,我将下载 64 位图形安装程序。由于这是一个大文件,466 MB,而且我不想耗尽我的数据包,我将直接取消它,因为我的系统上已经安装了 Anaconda。现在,一旦我们安装了 Anaconda,正如我之前提到的,Anaconda 自带一个名为 Jupyter Notebook 的 IDE。那么,Jupyter 是什么?它是一个基于浏览器的解释器,允许我们与 Python 进行交互式工作。因此,我们所有的 Python 代码都将在 Jupyter Notebook 中实现。如果您需要打开 Jupyter Notebook,我将向您展示如何操作。因此,如果您在搜索栏中,请键入 Anaconda。然后您需要选择此选项:Anaconda prompt。现在,在 Anaconda prompt 中,您需要键入 Jupyter notebook。让我们等待基于浏览器的解释器打开。您在此处看到的就是 Jupyter Notebook,它是一个基于浏览器的 Python 解释器。我们将在此处编写所有 Python 代码。现在,如果您想打开一个新的 Python Notebook,请点击此选项卡并选择 Python 3。完成此操作后,我们就打开了新的 Notebook。在 Python Notebook 中,您会看到很多选项卡。同样,如果您想创建一个新的 Notebook,请选择文件,然后您会看到新建 Notebook 选项。您也可以选择 Python 3。正如您在此处看到的,这是我们的新 Notebook。我将关闭这个。然后,假设您想下载您编写的代码文件。您有此下载选项。通常,当我们想下载 Jupyter Notebook 时,我们会将其下载为 .ipynb 文件,它基本上代表 Python Notebook 或 IPython Notebook。您也可以将其下载为其他格式。如果您只想将其保存为简单的 Python 文件,您可以选择 .py。您还可以将其保存为 HTML 文档或 LaTeX 文档。如果您想保存,您有另存为选项。同样,您可以重命名您的 Notebook。您可以选择此项,或者直接点击此处。然后您可以重命名它。我将将其命名为 my Python notebook。然后我将重命名此文件。现在,让我们编写我们的第一个 Python 程序。要将内容打印到控制台,我们必须使用 print 命令。然后我将添加括号。我将使用双引号,并在其中键入命令:this is Sparta。然后我将直接点击运行。正如您所见,我们已成功打印出 this is Sparta。我们已在 Jupyter Notebook 中编写了我们的第一个 Python 程序。现在,我们就可以愉快地去黑客攻击 NASA 系统了。所以,这就是我们的基石,各位。我们可以用我们学到的东西做很多事情。现在,您有一个名为 kernel 的东西。那么,kernel 到底是什么?您可以将 kernel 视为程序的执行者。因此,每当您编写一段代码并希望执行它时,您都会点击 kernel,而这实际上会运行您的整个代码。然后,假设您想在此上方添加一个新单元格。您在此处看到的就是单元格。如果您想在此上方添加一个单元格,请点击插入。然后您有插入单元格上方选项。同样,假设我想在此下方插入一个单元格。我点击插入。我选择插入单元格下方,这样我就可以添加另一个单元格。所以,这是对 Jupyter Notebook 的基本介绍。让我们开始理解 Python 中变量到底是什么。现在,当您使用任何编程语言时,您的首要任务就是处理数据,对吧?因此,无论您使用哪种编程语言,您基本上都在处理数据。但问题是,您如何实际存储您正在处理的数据?所以,假设您在一家公司工作,并且想存储所有员工的姓名。所以,我们将开始选取三个员工姓名。所以,假设我们有 John、Sam 和 Matt,我们需要将这些姓名存储在某个地方。那么,我们可以在哪里存储它们?这就是变量的用武之地。因此,您可以将变量视为您的临时存储空间。现在,我们将获取这个字符串值。因此,您在双引号中看到的内容称为字符串。我们将获取这个字符串值,并将其存储在一个名为 student 的变量中。我们可以称之为 student、employee 或任何我们想要的名称。此变量将具有一个特定的地址与之关联。由于此变量是临时存储空间,因此其中存储的值可以一遍又一遍地更改。所以,起初我们是将 John 的值存储在这个变量中,无论它被称为 employee 还是 student。然后,过一段时间后,我们可以用 Sam 替换 John 的值。同样,过一段时间后,我们将值从 Sam 改为 Matt。这就是变量在 Python 中的工作方式。现在,让我们转到 Jupyter Notebook,我将在此处向您展示一个正确的示例。我将创建一个名为 var1 的变量。我使用等号,然后将 John 的值存储在其中。让我点击运行。现在,让我打印 var1,看看结果是什么。因此,我们已成功将 John 的值存储在 var1 中,并且能够打印出来。由于 var1 是一个变量,它是一个临时存储空间。这就是为什么我们可以更改其中存储的值。所以,现在我不想存储 John 的值,而是想存储 Sam 的值。我将再次点击运行。我将使用 print,然后打印出 var1 的值。正如您所见,起初我们有 John,我们能够将其更改为 Sam。现在,过一段时间后,我将再次将此值更改为 Matt。现在,让我在此处打印 var1。打印 var1。正如您所见,起初我们有 John,然后我们将其更改为 Sam,最后我们将其更改为 Matt。所以,这是对变量的基本介绍。现在,需要记住的另一件事是,每个变量都有一个与之关联的数据类型。因此,当您处理数据时,该数据可以是任何格式。因此,当您处理像 10、500、-100、-323 这样的数字时,它们称为整数。当您处理小数时,例如 3.14、15.97、-1.92,这些都称为浮点数。然后我们有一些布尔值。因此,布尔值基本上意味着您只有 0 和 1,或者您可以将它们标记为 true 和 false。因此,您只有两个值,这两个值是 true 和 false,或者您也可以将它们标记为 0 和 1。然后我们有字符串。因此,字符串是您放在单引号、双引号或三引号中的内容。所以,这是 Python 的四种主要数据类型。现在,让我们看一个每个数据类型的示例。现在,我将开始创建一个整数变量。我将此整数变量命名为 num one。我将值 10 存储在其中。为了检查它的数据类型,我使用 type 方法。在 type 方法中,我传入 num one。正如您所见,这告诉我们这个特定变量的数据类型是整数。然后我将传入一个浮点数或小数。我将其命名为 decimal,并在 decimal 中存储值 3.14。现在,让我检查 decimal 的类型。因此,在此内部,我传入 decimal。当我点击运行时,您可以看到它是浮点类型。然后我们有下一个数据类型,即布尔类型。所以,这里我可能有另一个变量,名为 log one。在 log one 中,我将存储值 true。让我再次点击运行,然后检查 log one 的类型。因此,在 type 中,我传入变量 log one,正如您所看到的,这告诉我们它是 bool 类型。bool 基本上意味着这是一个布尔或逻辑类型,然后我们有字符或字符串。所以,这次我的变量将是 char 1,并且在此内部,我将存储名称。假设我在这里存储名称 Arjun。然后,让我检查 char 1 的类型。当我点击运行时,您会看到这告诉我们这是一个字符串类型变量。我们这里还有另一个变量,或者另一个数据类型,即复数类型。因此,复数基本上是一种数据类型,其中有一个实部和一个虚部。所以,假设我写了类似 3 + 5J 的内容。3 将是您的实部,5J 将是您的虚部。您可能在小学或中学学过复数。所以,通常在数学中,这个 J 用 I 表示。所以,您会得到类似 3 + 5I 的内容,其中 3 是您的实部,5 是您的虚部。所以在 Python 中,这个 I 用 J 而不是 I 来表示。所以,现在我将把它存储在一个名为 comp 1 的变量中。现在,让我检查一下它的类型。所以,comp 1 的类型。我看到它是复数类型。因此,我们已成功理解了变量是什么,并且我们还查看了变量可以拥有的不同数据类型。现在,我们将转到 Python 中的下一个概念,即运算符。顾名思义,运算符帮助我们对这些数据执行简单操作。我们有算术运算符、关系运算符和逻辑运算符。所以,我们将从第一组运算符开始,即算术运算符。让我打开这个 Jupiter Notebook。我将清除控制台中当前的所有内容。您在此处看到的剪刀图标。如果您点击剪刀符号,您就可以剪掉所有这些单元格。现在,让我添加一个注释。那么,注释是什么?注释是 Python 解释器不执行的内容。您可以使用此哈希符号添加注释。所以,在这个哈希符号之后,我将继续编写算术运算符。我将点击运行。正如您所看到的,这里没有执行。因此,每当您在此处添加哈希符号时,Python 解释器会自动将哈希符号之后的内容识别为注释。现在,如果我删除此哈希符号然后点击运行,您会看到我们得到这个箭头,它告诉我们这是无效语法,因为如果我们不在此处添加哈希符号,Python 解释器就会将其视为。这两个实际上被视为两个独立的变量,由于我们没有声明名为 arithmetic 或 operator 的变量,因此我们收到此错误。所以我将在此处添加此哈希。现在,在此之后,由于我们必须执行算术运算,而算术运算符基本上包括加号,我们有加号,然后是减号,然后是乘法,然后是除法。现在,我将创建两个变量。我将第一个变量命名为 num one,并将值 10 存储在其中。然后我将第二个变量命名为 num two,并将值 20 存储在其中。现在,创建这两个变量后,让我执行基本的算术运算。所以,我将开始将 num one 和 num two 相加。所以我将键入 num 1 + num two。当我执行 num 1 + num two 时,我得到结果 30。所以,基本上,如果您想将两个数字相加,您必须在这两个操作数之间使用加号。由于 10 存储在 num 1 中,20 存储在 num 2 中,我们得到结果 30。然后,同样,我将执行减法运算。所以,这里我将有 num one - num two。当我键入 num one - num two 时,我得到结果 -10,因为 10 - 20 是 -10。继续,我还会执行乘法。要执行乘法,我必须键入 num 1 * num 2。当我在这里有 num 1 * num 2 时,也就是 10 * 20,我得到结果 200。然后我们只剩下除法。要执行除法,我将有 num one。然后我将使用正斜杠符号,它代表除法。然后我将在这里有第二个操作数,即 num two,然后我将点击运行。正如您所看到的,当我们用 20 除以 10 时,我们得到结果 0.5。所以,这些是一些基本的算术运算。现在,我们将处理关系运算符。我也会在这里添加另一个注释,并将其标记为关系运算符。那么,关系运算符是什么?它们帮助我们确定两个操作数之间的关系。因此,我们可以看到一个操作数的值是否小于另一个操作数,或者一个操作数的值是否大于另一个操作数。所以,我们将有小于符号、大于符号、等于符号和不等于符号。现在,同样,我们将使用相同的变量 num one 和 num two。让我在这里为您打印出 num one 和 num two。正如您所看到的,num one 中存储了 10,num two 中存储了 20。现在,我想检查 num one 中的值是否小于 num two 中的值。所以我将键入 num one,使用小于符号,然后在此处键入 num two 并点击运行。正如您所看到的,我得到结果 true,这意味着 num 1 小于 20,这是有道理的,因为 10 显然小于 20。现在,我想检查 num one 中的值是否大于 num two 中的值。当我点击运行时,我得到 false 值,因为 10 显然不大于 20。继续,我想检查 num one 中的值是否等于 num two 中的值。所以,您在此处看到的是双等于运算符。您需要理解双等于运算符和单等于运算符之间的区别。这是单等于运算符。借助单等于运算符,我们将值赋给变量。但是当我们使用双等于运算符时,它有助于我们确定这两个值,左侧的操作数和右侧的操作数是否相等。当我点击运行时,我得到 false 值,因为 10 显然不等于 20。继续,我有不等于运算符。所以我将使用 num one。不等于运算符表示如下。我将有一个感叹号,然后是等号。然后我在这里将有 num two,我得到 true 结果,因为 10 显然不等于 20。所以,这些是一些关系运算符。继续,我们将处理逻辑运算符。所以我将在这里添加一个注释,它将是逻辑运算符,我们有两个逻辑运算符:and 和 or。让我们从 and 开始。所以,and 是一个逻辑运算符,只有当两个操作数都为 true 时,它才会给出 true 结果。但是 or 是一个逻辑运算符,当任一操作数为 true 时,它都会给出 true 结果。所以,让我们详细了解一下。这次我将在这里创建两个布尔变量。我将有一个 log one,在 log one 中我将存储值 true。然后我将有一个 log two,在 log two 中我将存储值 false。所以,现在我这里有 log one 和 log two。现在,我将对这两个变量执行 and 运算符。所以,让我继续键入 log one and log two。当我点击运行时,我得到 false 值,因为 log one 是 true,log two 是 false。True and false 将给出 false 结果。现在,让我看看当我有 log two 时会发生什么。log one。我再次得到 false 结果,因为 false and true 也为 false。现在,让我检查 log two and log two。log two and log two 也将给出 false,因为 false and false 也为 false。最后,我将检查 log one and log one。log one and log one 将给出 true 结果,因为 and 运算符只有在两个操作数都为 true 时才给出 true 结果。现在,我们将转向 or 运算符。所以,这次我将有 log one or log two。现在,true or false 将给出 true 结果,因为 or 在任一操作数为 true 时给出 true 结果。然后我将有 log two or log one,这再次给出 true 结果,因为 false or true 也是 true。然后我将有 log one or log two,这再次……让我实际上将其更改为 log one or log one,这将给出 true 结果,因为 true or true 也为 true。最后,我们将有 log two or log two,这是唯一一种我们将得到 false 结果的情况,即 false or false。所以,只有当您的两个操作数都为 false 时,您在使用 or 运算符时才会得到 false 结果。所以,这就是关于 Python 中不同类型运算符的所有内容。现在,我们将理解 Python 标记到底是什么。因此,Python 标记是程序中最小的有意义的组成部分。因此,当您将所有这些 Python 标记组合在一起时,您就会得到最终的 Python 代码。因此,基本的 Python 标记是关键字、标识符、字面量和运算符。所以,我们已经处理了运算符,它们是 Python 中的一种标记。现在,我们将继续理解关键字、标识符和字面量是什么。所以,我们将从 Python 关键字开始。Python 关键字,顾名思义,是特殊的保留字。所以,当我说是特殊的保留字时,这意味着您不能将这些特殊的保留字用于任何其他目的。这意味着您不能将它们用作 Python 中变量的名称、函数名称,甚至类名称。这里有一些保留关键字。If、def、del、true、false、while、not、or、return。所以,这些是一些 Python 关键字。现在,我将向您展示如何使用它们。所以,假设我键入 defaf。正如您在此处看到的,当我键入 defaf 时,它会自动变成绿色。所以,Python 解释器将 deaf 这个词识别为关键字。现在,假设我尝试将某项分配给 def,例如 def = 10。我得到一个错误,因为这是一个关键字。我不能将其用作变量。同样,如果我使用 if,if 也是一个关键字,这就是为什么它变成绿色。然后我们有一些称为标识符的东西。所以,标识符基本上是用于变量、函数或对象的名称。所以,到目前为止,我们已经创建了一些名为 var1、num one 或 log one 的变量。所以,所有这些都是标识符。因此,您为变量、函数或对象起的名称称为标识符。例如,如果您有一个人,他们的名字是 Arjun、Sam 或 Matt。所以,这里这些人的名字就是标识符。同样,就像您需要一个名字来识别一个人一样,您也需要一个标识符来理解、调用或调用一个变量、函数或对象。这就是现实生活与这些 Python 标识符之间的简单类比。并且在使用这些标识符时有一些基本规则。所以,第一条规则是,标识符可以包含特殊字符。您可以使用下划线,但除了下划线之外,您不能在标识符名称中包含任何其他特殊字符。并且标识符是区分大小写的。所以,假设您创建一个名为 var1 的变量,其中 v 是小写的。然后您创建一个名为 var1 的另一个变量,其中 V 是大写的。那么,两者都将被视为不同的变量。然后这里还有另一个规则,即第一个字母不能是数字。所以,这些是 Python 编码员通常会记住的一些基本规则。所以,让我们在 Python 中学习这些规则。我告诉过您特殊字符不能在名称中使用。所以,假设我有一个名为 J person 的变量,并且我在这里有一个。如果我尝试将值 10 存储在其中,让我点击运行。所以,您看到我们有一个语法错误。同样,我将这样做,我有一个名为 N1 的变量。在 n1 中,我将存储值 10。然后我将有一个名为 capital N1 的变量。在此内部,我将存储值 20。现在,让我打印出这两个。N1(小写 n)和 n1(大写 N)。正如您所看到的,这两个值是不同的,因为这两个变量是不同的。所以,这就是关于 Python 标识符的内容。然后我们有一些称为字面量的东西。而字面量只是 Python 中的常量。所以,常量是不会改变的值。因此,您存储在变量中的任何值都称为字面量。因此,当您将 10 存储到 n1 中时,10 将是一个字面量。同样,当您将值 20 存储到 n1 中时,20 将是您的字面量。然后在这里,当您将像 10 这样的值存储到 num one 中,将 20 存储到 num two 中时。同样,那些是您的字面量。现在,我们将转到 Python 中的一个有趣主题,我们将在此处学习 Python 中的字符串。那么,字符串是什么?字符串基本上是包含在单引号、双引号或三引号中的字符序列。我们已经知道了,并且已经看到了 Python 字符串的示例。所以,让我给您一个所有三种情况的示例,我将创建一个带有单引号、双引号和三引号的字符串。让我删除这里的所有内容,因为我喜欢保持整洁。让我清除这里的所有内容。现在,我将创建一个名为 str1 的新字符串变量。我将使用单引号为其赋值。在此内部,我将键入 hello world。我将打印出 string one。我已成功创建了带有 hello world 的字符串 str1。接下来,我将有 str2。对于 str2,我将使用双引号创建它。我将键入 this is Sparta,然后在此处打印 str2。继续,我将创建另一个名为 string 3 的变量。这次我将创建一个多行字符串。如果您想创建多行字符串,可以使用三引号。所以我将在这里使用三引号。在此内部,我将键入 I am going to France tomorrow。让我运行此并立即打印出 string three。正如您所看到的,我已成功创建了一个字符串,内容为 I am going to France tomorrow。您看到的反斜杠表示换行。所以,在 I am 之后,我们有 \n,这意味着 going to 出现在新的一行。同样,在 France tomorrow 之前还有一个 \n,这意味着那部分也在新的一行。所以,这给了我们关于 Python 中字符串的基本概念。现在我们知道了这一点,让我们实际看看如何从字符串中提取单个字符。这里我们创建了一个名为 my string 的字符串。所以,变量的名称是 my string,这是存储在其中的值。字符串是 my name is John。现在,如果我们想提取单个字符,我们需要理解索引的概念。这里这些字符位于特定的索引处,索引值从零开始。例如,M 位于索引零。Y 位于索引一,空格位于索引二。同样,这些字符中的每一个都有一个特定的索引与之关联,并且索引值从零开始。如果您想提取一个特定字符或字符串中的第一个字符,您需要指定字符串的名称。您还需要使用括号。在括号内,您放入要提取的字符的索引值。由于我想提取第一个字符,我需要使用索引零。这就是我们如何提取它的方法。同样,如果我想提取最后一个字符,最后一个字符的索引将是 -1。如果您愿意,您可以手动计算最后一个值,但这基本上是耗时的。而不是计算索引,如果您只想直接提取最后一个字符,您可以简单地使用 -1,它会自动为您提供字符串中的最后一个字符。所以,让我们在 Jupyter Notebook 中执行这些操作。让我添加一个新单元格。插入单元格下方,我将在此处创建一个名为 my_string 的字符串。假设我有一个字符串 my name is John。如果您不介意,请让我在这里打印一下 my string。在此之后,我想提取第一个字符。所以,如果我想提取第一个字符,我将键入 my_string。我将把它放在括号里。我将在这里写一。但实际上我需要写零,因为第一个字符的索引是零。所以,这一点很重要。您必须记住,在 Python 中,索引从零开始。所以,这就是我提取第一个字符的方式。同样,如果我想提取最后一个字符,即 n,那么我将在这里放入 -1。正如您所看到的,我能够提取最后一个字符。同样,假设我想提取这个 a。所以,它在索引 0、1、2、3 和 4。它在索引号 4。所以,让我在这里放入 4。正如您所看到的,我已成功从整个字符串中提取了此特定元素。现在,我们将处理一些字符串函数。所以,第一个字符串函数是 len,它将给出字符串的长度或其中包含的字符数。所以,我们所要做的就是使用 len,并在其中传入字符串的名称。所以,当我们传入 my string 时,这告诉我们字符串的长度是 15。同样,假设我想将字符串中的所有字符转换为小写。我们为此有一个 lower 方法。所以,我所要做的就是键入 my_string.lower,这将把所有字符转换为小写。与 lower 类似的方法是 upper 方法。所以我将键入 my string.upper。通过这个,我将能够将所有字符转换为大写,正如您在此处结果中看到的。所以,我准备好了 my string,现在我想检查它的长度。在 len 中,我传入 my string,这将告诉我们字符串的长度是 15。同样,正如您在此处看到的,我们有两个大写字符,M 是大写的,J 是大写的。我想将它们转换为小写。为此,首先我需要提供字符串名称,即 my_string。我将使用点运算符。然后,我将使用 lower 方法。当我点击运行时,您会看到所有字符都已转换为小写。同样,如果我想将所有字符转换为大写,我将继续键入 my string,使用点运算符,然后在此处写 upper。我将点击运行,正如您所看到的,我已经将所有字符转换为大写。现在,我们将查看更多函数。所以,我们有 replace 方法和 count 方法。所以,如果我想用另一个字符串替换一个特定字符或一个特定字符串,那么我们可以使用 replace 方法。所以,同样,首先我们必须提供字符串的名称,即 my_string。我将使用点运算符,然后我将使用 replace 方法,它接受两个参数。第一个参数基本上是我想要替换的字符。所以,正如您在此处看到的,最初我们有 y。我想用 a 替换它。所以,最初的句子是 my name is John,但我将其更改为 my name is John。所以,一个相当有趣的方法,不是吗?然后我们有 count 方法。所以,这里我们创建了一个新字符串,其中存储了 hello world 的值。如果我想检查一个单词出现的次数或一个特定子字符串出现的次数,那么我们可以将子字符串传递到此方法中。所以,如果我想知道子字符串 hello 在整个字符串中出现的次数。如果我传入 hello,这告诉我子字符串 hello 在整个字符串中出现了两次。所以,让我们使用这个 replace 方法和 count 方法。所以,我们已经有了这个 my string 变量。假设我想更改这里的名称。所以,我想将 my name is John 更改为 my name is Sam。所以我将有 my_。然后,我将使用这里的 replace 方法。我们已经知道它接受两个参数。第一个参数是我想要替换的子字符串。所以,我想替换 John。我想用……让我实际上就这样保留。我想用 Sam 替换它。当我点击运行时,您会看到我已成功将子字符串从 John 更改为 Sam。然后我们有 count 方法。让我在这里创建一个新的字符串变量。我将有一个 new string,并在其中存储 hello world。现在我们有了这个,我将继续使用 count 方法。所以我将有一个 new string,并使用 count 方法。在此内部,我将传入 hello。当我传入 hello 时,这告诉我子字符串 hello 出现了两次。现在我们还有两个字符串函数。所以,现在我们有 find 函数。所以,find 函数帮助我们找到一个特定子字符串的索引或起始索引。正如您在此处看到的,如果我想知道这个子字符串 spot up 的起始索引值,我将把这个整个子字符串传递到 find 方法中。这给了我们值 8。所以,让我们来理解一下。所以,现在如果我计算索引,将是 0、1、2、3、4、5、6、7 和 8。所以,正如您所看到的,这个 s 位于索引号 8。这就是 find 方法给我们的。所以,同样,如果我将 s 传递到这个 find 方法中,它将给出 0、1、2、3、4 和 5 的结果。然后我们有另一个方法叫做 split。split 方法帮助我们将这个字符串分成一个子字符串列表,基于一个单独的分隔标准。所以,这里我们有整个字符串 I like apples, mangoes and bananas。我想将整个字符串分成多个子字符串,基于逗号。所以,每当这个方法遇到逗号时,它就会将其分离或分割成一个子字符串。所以,I like apples 变成一个子字符串,mangoes 变成第二个子字符串,bananas 变成第三个子字符串。让我们来实现这两个的示例。让我写 string one。我将在这里分配一个新值。我将键入 I love pizza。我想知道子字符串 pizza 的起始索引。所以我将使用 string 1.find。find,并在其中我将传入 pizza,我们得到结果七。所以,让我们来验证一下:0、1、2、3、4、5、6 和 7。现在,我们将处理 split 方法。为此,我们必须创建一个新的字符串值,我将其命名为 fruit。在这里,我将键入 I like apples, guavas, and bananas。例如。我还会写……也许为了确保……strawberries。然后我将使用 split 方法。Fruit.split。在此内部,我将给出一个分隔符,即逗号。我得到一个子字符串列表。I like apples 变成一个子字符串。Guavas 变成下一个。Bananas 是下一个子字符串。然后 strawberries 是最后一个子字符串。现在,我们将处理 Python 中的下一个数据结构,即列表。所以,当涉及到元组时,它是一个由圆括号括起来的有序元素集合。但是列表是一个由方括号括起来的有序元素集合。这还不是唯一的区别。所以,元组是不可变的。这意味着当您创建元组中的元素时,之后就不能更改它们。但是当您创建列表时,您可以实际更改其中存在的元素。这就是我们创建列表的方式。所以,L1 是我正在创建的列表的名称。我将使用方括号并将这些不同的元素存储在其中。让我删除这里的所有内容,然后重新开始。对于列表,我将在这里添加一个新注释,它将是 list。在此内部,我将对象命名为 L1。我将在这里使用方括号。我将放入 one、uh 和 true。让我打印出 L1。这是我们的新列表。现在,让我使用 type 来检查它的类型。我将传入 L1。正如大家所看到的,这告诉我们这是一个列表。现在,就像我们从元组中提取单个元素一样,我们也可以从列表中提取单个元素,并且过程相同。所以,这里我们有了所有这些元素,并且索引从零开始。所以,这一点非常重要。各位,请记住这一点。因此,列表或您在 Python 中使用的任何数据结构的索引都从零开始。如果我想提取第二个元素,第二个元素的索引将是 1,因为这是索引号零。这是索引号一,当我传入 L1 方括号一闭方括号时,我将能够从整个列表中提取这个特定元素。同样,如果我想提取一系列元素,我有了所有这些,并且我想从索引号二开始,这将是索引号二。所以,我们有 0、1 和 2,这将一直持续到索引号四。所以,正如我之前告诉您的,当涉及到 Python 时,上限是排他的。所以,当我们指定到 5 时,我们只能提取到索引号四。这就是为什么在这里我们将提取 2、B 和 3。让我在这里创建 L2 并添加一些元素。我将有一个 1A,然后我将有一个 2,然后我将有一个 B。之后,我将有一个 3,并且继续,我将有一个 C。我已成功创建 L。让我打印出来。现在,如果我想提取,比如说 B,让我们看看索引会是什么。它将是零、一、二和三。所以我必须使用 L2,在方括号内。我必须放入三,我能够从中提取这个特定元素。同样,如果我想提取最后一个元素,我将使用 L2。我在这里放入 -1,我能够提取最后一个元素。如果我想提取一系列元素,那么在这种情况下,我所要做的就是使用 L2。正如我们在示例中看到的,如果我想提取 2、B 和 3,这些的索引是 0、1 和 2。我将在这里放入 2。如果我想提取到 3,那就是 2、3 和 4。所以,这就是为什么我还需要包含索引号五。这就是我们如何从整个列表中提取 2、B 和 3。现在,让我们看看如何修改列表。所以,我们这里有相同的列表。最初,索引号零处的元素是 1。但是,如果我想将其更改为其他元素,我所要做的就是提供索引号并将新值赋给该特定索引。所以,正如您所看到的,我将值 100 赋给这个特定索引,并且我能够将值从 1 更改为 100。现在,我们也可以在末尾附加一个新元素或弹出最后一个元素。要添加一个新元素到末尾,我们将使用 append 方法。所以,我们必须提供列表的名称,使用点运算符,然后使用 append 方法。我们将输入我们想要附加的值。所以,当我在这里键入 Sparta 时,它会被附加到列表的末尾。同样,我们可以继续弹出最后一个元素。所以,如果我们必须弹出最后一个元素,弹出基本上意味着删除最后一个元素。所以,我们将不得不使用 L1.pop,它会自动删除最后一个元素。所以,正如大家所看到的,我们添加了 Sparta,但在使用 pop 方法后,这个 Sparta 值已从列表中删除。现在,我们这里有相同的列表,即 L1。实际上,让我使用 L2 而不是 L1。让我为您打印出 L2。我想更改,比如说,这个特定值。所以,假设我想将 A 更改为 Z。所以我将使用 L2。它的索引是 1。并且我想在其中存储 Z 而不是 A。让我再次打印出 L2。所以,最初我们有……但是更改后,我们有了 Z。现在,现在,让我们看看如何在列表末尾附加一个元素。所以,我们将使用 L2,我将使用点运算符。然后,我将使用 append 方法,并在其中我将添加单词 Python。让我为您打印 L2。现在,我在末尾添加了 Python。如果我想将其弹出,我必须写 L2.pop。当我点击运行时,我们看到它已被弹出。让我再次为您打印 L2 作为参考。我们看到最后一个元素已被删除。现在,我们可以对列表执行更多修改。所以,假设我们想反转列表中存在的元素。正如您在 L1 中看到的,我们有所有这些元素。如果我想反转这些元素的顺序,我所要做的就是使用 reverse 方法。所以我将键入 L1.reverse。当我打印出来时,我们看到元素以反转的顺序打印。然后,如果我们想在特定索引值处插入一个元素。所以,当我们使用 append 方法时,我们能够将元素添加到列表的末尾。但是,而不是将元素添加到列表的末尾,如果我们想在特定索引处插入一个元素,那么我们可以这样做。我将使用 L1.insert,然后我将指定我要插入的索引位置。所以,最初在索引号一处,我们有值 a,但现在在索引号一处,我想插入 Sparta。所以,这个方法接受两个参数。第一个参数是我想要插入的索引,第二个参数是我想要插入的值。正如您所看到的,我在索引号一处插入了 Sparta。现在,正如您所看到的,其余元素都已向右移动了一个索引。所以,最初位于索引号一处的 a 现在位于索引号二。最初位于索引号二处的 2 现在已移至索引号三。所以,每个元素都向右移动一个索引。然后我们也可以对列表进行排序。所以,我们这里有所有这些元素。现在,如果您想按字母顺序对这些元素进行排序,那么我们只需使用 sort 方法。这个 sort 方法将所有这些元素按字母顺序排列。所以,我们有 apple,然后是 banana,然后是 guava,最后是 mango。所以,让我们在 Jupyter Notebook 中使用 reverse 方法、insert 方法和 sort 方法。所以,我们这里有相同的 L2。现在,如果我想反转它,我将键入 L2.reverse。当我点击运行时,它已执行。现在,让我打印 L2。正如您所看到的,最初我们有这个特定的序列,即 1 Z 2 B 3 和 C。在使用 reverse 方法后,元素已被反转。现在,我们将转到在特定索引处添加元素。所以,如果我想在索引号三处添加一些东西。所以,现在我们有 0、1、2、3。所以,我们有 2,它位于索引号三处。但是现在,假设我将有 L2.insert。并且在索引号三处,我想插入。Great learning。让我点击运行并打印出 L2。正如大家所看到的,在索引号三处,我插入了 Great learning,并且

那些之后出现的元素向右移动了一个索引值。现在,我们终于将看到如何对列表进行排序。所以,我将有一个 L3,在这个列表里,我将有一些元素。我将有一个“苹果”。之后,我将有一个“芒果”。然后,让我实际上改变一下这里的顺序。所以,让我先从“芒果”开始,因为它是一种如此甜美多汁的水果,我真的很喜欢。然后我将有“苹果”,它总是清脆爽口。之后,我将添加“番石榴”,它以其独特的异国风味而闻名,如果我仍然想吃更多的话,我可能会在那之后吃“荔枝”,它带有这种细腻的甜味。现在,这就是这个列表中的顺序。如果我想对它进行排序,我只需要使用 sort 方法。所以,当我输入 L3.sort 时,这必须是一个列表,而不是一个元组。所以,它必须是方括号。你们必须记住这一点。让我在这里改变一下。让我把所有这些剪切并粘贴到这里。正如你们所看到的,这个方法已经被执行了。当我点击运行,我们改变了顺序。所以,现在我们有了苹果,接着是番石榴,然后是荔枝,而芒果则在最后。现在,我们也可以对列表执行相同的连接和重复操作。所以,这里我们有 L1,它包含元素 1、2 和 3。然后我们有 L2,它包含元素 A、B 和 C。如果我想将 L2 连接到 L1 的末尾,我只需要使用加号运算符。当我使用 L1 加 L2 时,我得到这个结果。我将得到 1 2 3 A、B 和 C。如果我想重复列表中存在的元素,我只需要将列表的名称乘以一个特定的标量数。所以,正如你们所看到的,我将 L1 乘以三,我重复了这些元素三次。所以,这里我只是连接一个列表。我将在这里创建两个列表。在 L1 中,我将有 1、2 和 3。在 L2 中,我将有 A、B,我也会有 C。现在我将执行 L1 加 L2。我们将 L2 附加到 L1 的末尾。所以,你们需要理解 L1 加 L2 和 L2 加 L1 会得到不同的结果。现在,当我实际输入 L2 加 L1 时,你们会看到我们将 L1 附加到了 L2 的末尾。所以,当你们在这里使用加号运算符改变顺序时,这个顺序也会改变。现在,让我们继续重复这些元素。所以,我将重复这个列表。假设我想重复 L2 中存在的元素,我将把 L2 乘以,比如说五,因为我想让这些元素重复五次。所以,我有 a、b 和 c 重复了五次。现在,我们将进入主要部分,即 Python 中的不同数据结构。所以,我们有元组、列表、字典和集合。让我们从第一个数据结构开始,即元组。到目前为止,当我们处理单个变量时,你们只能在一个变量中存储一个值或单个值。但是,借助这些不同的数据结构,如元组、列表、集合和字典,我们将能够在一个数据结构中存储多个元素。而且,并非只能存储单个数据类型的多个元素。我们也可以在这个数据结构中存储不同类或不同类型元素的。所以,让我们从元组开始。元组到底是什么?它是一个由括号括起来的有序元素集合,并且元组是不可变的。当我说是元组不可变时,是什么意思?这基本上意味着,如果你创建了一个元组,你就不能回头去改变它里面的任何值。元组一旦创建就不能被修改。这里有一个元组的例子。所以,我们有括号,在括号里我存储了元素 1、a 和 True。正如你们所看到的,我有不同类型的数据。所以,我们可以在元组中存储不同类型的数据。所以,让我在 Jupyter notebook 中创建我的第一个元组。我将输入,让我实际上在一个新的空间里做这个。我将在上面添加注释“元组”。我将输入 TU one。我将在这里使用括号。所以,第一个元素是 1。然后我将有 Sparta。然后我将在这里有 True。然后,让我打印出 TU one。所以,我创建了这个元组。现在,让我检查它的类型。我将使用 type。在这个里面,我将传入 TU one。这告诉我们这是一个元组。现在,如果我想从元组中提取单个元素,我该怎么做?嗯,这个过程与字符串几乎相同。所以,如果我们想提取第一个元素,正如你们在这里看到的,我创建了一个包含所有这些元素 1、a、True、2、b、False 的元组。如果我想提取第一个元素,因为第一个元素在索引号为零的位置,我必须使用元组的名称,并在括号内提供索引值,即零。我从整个元组中提取了这个特定的元素。类似地,如果我想提取最后一个元素,所以,如果我想得到最后一个元素,我只需要使用 minus one。所以在 TU one 中,我将使用 minus one。通过这个,我能够提取最后一个元素。现在,如果我想提取一个连续的元素序列,所以,如果我想提取 True 和 2,它们是一个连续的元素序列,我必须这样做。所以,在括号内,我将放入 1:4。这是起始索引值。这是结束索引值。现在,当涉及到 Python 时,你们必须记住,结束值是排他的,而起始值是包含的。所以,当你把 1 作为起始索引值时,对吧,我们有 1,我们提取了那个元素。但是,当你把 4 作为结束索引值时,它只到索引号三。这就是为什么我们只提取了 a、True 和 2。2 在索引号三的位置。所以,我们提取了 a、True 和 2。但是在索引号四的位置,我们有值 b,但它没有被提取,因为索引号四是排他的。所以,让我们创建一个新的元组并从中提取一些元素。所以,我现在将创建一个名为 tup 2 的新元组,让我往里面放一些随机值。我将放入 1、a、True,然后是 2、b,然后我将添加 False。所以,我创建了 t two。现在,如果我想提取第一个元素,它显然在索引号零的位置,我将输入 T 2,并在括号内给出索引值零,正如你们所看到的,我能够从整个元组中提取这个特定的元素。现在,类似地,如果我想提取最后一个元素,我必须输入 two,把它放在括号里,要提取最后一个元素,我必须使用 minus one。如果我想提取一系列元素,假设我想提取 True、2 和 B。所以,这里 True 在索引号二的位置。所以,我将有 top two。起始索引值是二。然后是 2、3、4、5。因为这会到五,而且五也包含在内,我必须放六。所以,0、1、2、3、4、5。这会到六。让我点击运行。正如你们所看到的,我包含了 True、2、B 和 False。如果我,比如说,只想要到 B,那么那就是 2、3、4。因为这必须包含在内,我将在这里放五。我只提取了 True、2 和 B。现在,我们将尝试修改一个元组。所以,我最初告诉你们,元组是不可变的。现在,当我说是元组不可变时,我基本上意味着,无论你们往里面存储什么,都不能被改变。所以,这里我实际上正在尝试改变我存储在元组中的值。所以,正如你们在这里看到的,在 up one 中,无论哪个元素在索引号二的位置,我都在尝试改变它,但我们得到了一个错误,错误是“元组对象不支持项赋值”。所以,让我打印出 up two。我将点击运行,然后,比如说,我想改变这个特定的值。所以,我有这个值在索引 0、1、2 和 3 的位置,索引号三。所以在 TU 2 的索引号三,我想把它从 2 改成 20。让我们看看我们会得到什么。我们得到同样的错误。“元组对象不支持项赋值”,因为元组是一个不可变对象,这就是为什么你们不能去改变元组中存储的任何东西。所以,我们已经看到元组不能被修改。现在,让我们对元组执行一些基本操作。所以,这里我们有相同的元组,其中包含所有这些元素 1、a、True、2、b 和 False。现在,如果你想找出元组的长度,换句话说,如果你想知道元组中有多少个元素,你只需要使用 len 方法。这将告诉我们这个元组中存在的元素数量。正如你们在这里看到的,我们有六个元素。这就是结果。接下来,我们也可以连接两个元组。也就是说,我们可以将一个元组的元素附加到另一个元组的末尾。所以,这里我们有 tub one,它包含元素 1、2 和 3。然后我们有 tub two,它包含元素 4、5 和 6。现在,当我们想连接时,我们只需要使用加号或加号运算符。当我们使用 tub 1 加 tub 2 时,我们得到结果 1 2 3 4 5 6。所以,让我们在 Jupyter notebook 中执行这些操作。所以,我将再次创建元组。这里我有一个 t one,让我添加一些元素。所以我将有 1、a、True,然后我将有 2、b,然后我将有 also here。所以,我创建了这个元组。现在,如果我想检查它的长度,我只需要使用 len 方法,在这个里面,我将传入对象。正如你们所看到的,我们得到了结果,它告诉我们这个元组中有六个元素。现在,我将创建另外两个元组。我这里有一个 t two,在这个里面,我将有元素 1、2 和 3。接下来,我将创建一个名为 TU three 的另一个元组,在这个里面,我将存储元素 4、5 和 6。现在,我需要执行 TU 2 加 TU 3。让我修正一下拼写。正如你们所看到的,我们已经将这些元素附加到了 TU 2 的末尾。所以,这是一个非常简单的操作。现在,如果我们想重复元组中存在的元素,这也是我们可以做的事情。所以,在这个元组中,我们只有两个元素,即 Sparta 和 300。现在,如果我们想重复这些元素一定的次数,我们需要将元组乘以一个标量数。所以,当我将 tup 1 乘以三时,我得到 sparta 300 sparta 300 和 sparta 300,这基本上意味着我将这些元素重复了三次。现在,我们也可以同时执行重复和连接。所以,这里我们有 tub one 和 tub two。所以,首先我做的是重复 TU 1 中存在的元素。所以,当我使用 TU 1 * 3 时,元素被重复了三次。所以,我有 sparta 300 重复了三次。然后我将 TU 2 附加到这个末尾。所以,让我在这里添加一个注释。我将写“重复”。这些是元组中的元素。例如,数字或字符串。现在,我这里有一个 TU one。让我打印出 tub one。如果我想把这些元素重复三次,我只需要输入 TU 1 * 3。让我们看看。所以,正如你们所看到的,1 A True 2 B 出现了。我们有一次,然后同样的事情重复了第二次,然后是第三次。现在,类似地,如果我想让整个东西重复五次,我只需要乘以五。所以,正如你们所看到的,我将所有元素重复了五次。现在,我们将同时进行重复和连接。我将在这里添加一个新的注释。“重复和连接”。我将在这里有两个元组。我将有一个 tup one,我将放入,比如说,a 和 b。然后我将有 c,然后我将创建一个新的元组,它将是 tup 2。在这个里面,我将有 x、y,然后我将有 z。现在,这是一个有趣的操作。我将执行 tup 1 * 3 + t 2。让我们看看结果。所以,正如你们所看到的,我将 TU one 中的元素重复了三次。所以,我有 ABC ABC 和 ABC。然后我将这个添加到末尾,我得到 X Y 和 Z。所以,这是另一个简单的操作。现在,我们也有一些简单的元组函数。所以,如果你有一个元组,你想找出其中的最小值和最大值,你只需要使用 min 方法和 max 方法。所以,这里我们有这些元素,如果你想找出这里存在的最小值,你只需要使用 min 方法,并将 top one 对象传入其中。正如你所看到的,这个方法告诉我们,这个元组中的最小值是 1。类似地,继续前进,我们使用 max 方法,当我们传入 t one 时,它告诉我们,这个元组中的最大值是 5。所以,我将有一个 tup one,让我添加一些数值。我将以随机顺序添加一些随机数。所以我将有 8 2 5 1 07。现在,如果我想,我必须删除这里的 C。现在,如果我想找出其中存在的最小值,我只需要使用 min 方法,在这个里面,我将传入 top,正如你们所看到的,这个方法告诉我们,这个元组中存在的最小值是零。类似地,如果你想找到最大值,我将使用 max 方法,再次传入 T one,我们得到结果八。这让我们结束了关于 Python 中元组的教程。所以,字典是一个由花括号括起来的键值对的无序集合,而字典又是可变的。所以,键值对到底是什么?让我们看一个例子。所以,这里我们正在创建一个字典,其中有两个键值对。所以,第一个键是 apple。第二个键是 orange。第一个值是 10,第二个值是 20。所以,你们也可以这样想。假设我们有水果的名称和水果的成本,或者水果的数量。所以,我们有 apple,假设有 10 个 apple。然后我们有 orange,假设有 20 个 orange。你们将用这个冒号将键与值分开。现在,让我删除所有这些,让我们从字典开始。所以,而不是列表,我将输入“字典”。让我们说,我将这样创建这个字典。让我们说,我的第一个水果是 mango,我有 10 个 mangoes。然后我将有 apple,假设我有 20 个 apples。然后我将有 luchi,我有 30 个 liuches。最后,我将有 strawberry,我有 40 个 strawberries。让我在这里打印出结果。所以,这是我们刚刚创建的第一个字典。为了确保我们确实创建了一个字典,让我检查它的类型。所以,fruit 的类型将告诉我们这是 dick 类型,这基本上意味着它是一个字典。现在,一旦我们创建了一个字典,我们就可以提取其中的单个键和值。所以,这是我们的字典。如果你只想提取键。所以,你们在冒号左边看到的是我们的键。如果你只想提取键,你只需要使用字典的名称,后面跟着 keys 方法,你就会得到这个字典中存在的所有键。类似地,如果你想提取所有值,你将使用 values 方法。所以,当我输入 fruit values 时,我能够提取这里存在的所有值。所以,我有一个 fruit,它是一个已经存在的字典。如果你想提取所有键,我将直接使用 keys 方法。正如你所看到的,我能够提取所有存在的键。类似地,如果你想提取值,我将输入 fruit.values,我提取了所有存在的值。现在,因为字典是可变的,我们可以修改它。这意味着我们可以添加一个新元素或更改一个现有元素。所以,这里我们只有四个元素,但如果我想添加第五个元素。所以,这里我们一开始没有 mango,但如果我想添加 mango,我只需要使用字典的名称,然后在括号内添加新的键。所以,你们在括号内看到的是我添加的新键值对。正如你所看到的,我将这个新的键值对附加到了字典的末尾。类似地,如果我想更改一个现有元素。所以,最初 apple 的值是 10。但如果我想改变那个值,那么在括号内,我将提供键并为其分配一个新值。所以,最初我们有 10。现在我们将其修改为 100。现在,让我们看看如何添加一个新元素。所以,我这里有一个 fruit。让我打印出来。我们有四个元素。现在,让我添加一个新元素。所以我将有 fruit。我将使用方括号。让我们说,我添加的新水果是 guava。假设我有 50 个 guavas。让我现在打印出 fruit。让我们检查结果。正如你所看到的,我们将这个新的键值对附加到了字典的末尾。最后,让我们看看如何修改一个现有元素。所以,假设我想修改这个特定的键值对。我有 liy,liyi 的值是 30。所以我将有 fruit,在这个里面,我将提供键 liyi,我想将 30 改为 300。我将把 300 分配给它,然后让我打印出来。正如你所看到的,最初的值是 30,我已成功将其更改为 300。现在,我们将使用一些字典函数。所以,假设我们这里有两个字典。Fruit one 和 fruit two。在 fruit one 中,我们有 apple 和 orange。在 fruit two 中,我们有 banana 和 guava。如果我想将 fruit 2 的元素附加到 fruit one,或者换句话说,如果你想将 fruit 2 的值连接到 fruit 1,你只需要使用 update 方法。所以,我有一个 fruit one,我将使用 update 方法,并将 fruit 2 传入其中。正如你所看到的,我们已将 banana 和 guava 附加到 fruit one 的末尾。类似地,我们可以从字典中弹出元素。所以,如果我们想弹出任何键值对,所以,在 pop 方法中,我们需要提供我们想弹出的键。例如,我们有 orange,但我不喜欢 orange,所以我把它弹出来了。正如你所看到的,orange 在这个列表中不再存在。现在,让我们创建另外两个字典。我有一个 fruit one,我将放入两个水果。我将从 mango 开始,我有 10 个 mangoes。然后我将添加 apple,也许我有 20 个 apples。然后我将有一个 fruit two。在 fruit two 中,假设我将从 guava 开始。我有 30 个 guavas。然后,我将添加 lichi,我将有 40 个 lichies。所以,我创建了这两个字典。看起来我们犯了一个错误。让我们实际检查一下错误是什么。所以,而不是等号,我需要使用冒号。这很重要。所以我创建了 fruit one 和 fruit two。让我为你们打印出 fruit one 和 fruit two。一旦我们打印出这两个,让我实际将 fruit 2 的值附加到 fruit one。为此,我需要使用 fruit one。然后我将在这里使用点运算符。之后,我将使用 update 方法。在 update 方法中,我将传入 fruit 2。让我打印出来。让我先关闭这个。现在,让我打印出 fruit one。正如你所看到的,我已经将 fruit two 的值附加到了 fruit one。现在,我们已经有了 fruit one。但假设我想从中弹出一些东西。所以,假设我想从中弹出 luchi 的值。我将使用 fruit one。然后我将使用 pop 方法。所以,fruit one.pop。所以,我们有一个错误,因为我们实际上必须在里面给出一个键。所以,因为我想弹出 Liy,我将在这里输入 lii。我们已经成功地从这里弹出了 lii。现在,我们将进入 Python 中的最后一个数据结构,即 set。所以,set 是一个由方括号括起来的无序和无索引的元素集合。所以,当我们说无序时,这意味着无论你们以什么顺序将元素插入集合,那个特定的顺序都不会保持不变。而且,当我们说它没有索引时,你们不能使用特定的索引值从集合中提取元素,因为没有正确的排序。此外,你们必须记住,在集合中不允许重复。所以,你们不能有两个相同的元素。但是,如果你实际上输入了相同的元素两次,会发生什么呢?集合只取一次。我们在这里创建一个特定的集合。如果你想向其中添加一个新元素,所以,一开始我们创建这个集合,其中包含所有这些元素 1、a、True、2、b 和 False。如果我想在末尾或集合中的某个地方添加一个新元素,我只需要使用 s1.add。这就是我们如何插入一个新元素。现在,假设而不是只添加一个元素,如果你想一次添加多个元素,而不是使用 add 方法,我们将使用 update 方法。使用 update 方法,我传入了这个值列表,即 10、20 和 30。正如你们所看到的,我将 10、20 和 30 插入了这个集合。但再次,你们必须记住,集合中不保持顺序。所以,这些是随机插入的。如果你想删除一个特定的元素,你只需要使用 remove 方法,并传入你想删除的元素。再次,因为没有索引,你们不能按索引值删除元素。你们必须明确给出你们想删除的值。所以,让我们创建我们的第一个集合。我将有一个 S1。我将在这里添加一些元素。我将有 A、B、C、D 和 F。让我为你们打印出 S1 作为参考。这就是我们拥有的。现在,假设我在这里添加一些重复项。让我们看看会发生什么。所以我将有 A 重复三次。然后我将有 B 也重复两次。然后我将有 C 重复两次。现在,如果我打印出来,正如你们所看到的,我们只有 A、B、C、D 和 F。即使 A 重复了三次,我们也只有一个唯一的 A 值。类似地,即使 B 和 C 重复了两次,我们也只有一个唯一的 B 值。现在,如果我想继续向其中添加一个新元素,我将使用 add 方法。所以,s1.add,在这个里面,我将添加 sparta。所以,当我使用 s1 add 开括号引号 sparta 闭括号,然后打印 s1 时,我们已经插入了 sparta。类似地,如果你想弹出或删除一些东西,我们将不得不使用 remove 方法。所以我将在这里有一个 s1 remove,在这个里面,假设我想删除元素 e。我将在这里传入 e,然后让我再次打印出 s1。所以,我们已经成功地从这个整个集合中删除了元素 E。现在,我们将使用一些集合函数。所以,这里我们有两个集合 S1 和 S2。在 S1 中,我们有元素 1、2 和 3。在 S2 中,我们有元素 A、B 和 C。现在,如果我们想组合 S_sub_1 和 sub2 中存在的所有元素,那么我们可以使用 union 运算符。所以,s_ub_1.un Union S2 将给出 S1 和 S2 的并集,正如你们在结果中看到的,我们有 1、2、3、A 和 C。类似地,我们有两个集合,如果你只想要两个集合中存在的共同元素。所以,这里我们有 1 到 6,这里我们有 5 到 9。如果你想要共同元素,我将使用 intersection 方法。所以,当我使用 S1 intersection 时,你们会看到我们有 5 和 6 在 S1 和 S2 之间是共同的。这就是我们得到的结果。这里我有一个 s1,在这个里面,我将有 1、2 和 3。我将有一个 s2,在这个里面,我将存储 4、5 和 6。现在,让我使用 union 运算符。所以我将有一个 s1.un,在这个里面,我将传入 s2。正如你所看到的,我已经将 456 附加到了 s1 的末尾。现在,类似地,如果你想找出共同元素,让我对 s1 做一些修改。所以,在 S1 中,假设我有 1、2、3、4 和 5。在 S2 中,假设我有元素 4、5、6、7 和 8。现在,如果你想找出 S1 和 S2 中存在的共同元素,我将使用 S1.insection,在这个里面,我将传入 S2。看起来我们这里有一个错误。所以,这必须是 intersection 而不是 intersect。让我点击右键。所以,正如你们所看到的,通过使用 intersection 运算符,我们得到了共同元素,即 4 和 5。现在,我们将学习 Python 中的流程控制语句,在流程控制语句中,我们将涵盖决策语句和循环语句。我们将从决策语句开始。正如你们从名称本身可以看出的,决策语句帮助我们根据条件做出决定。我们这里有一个很好的例子。所以,假设你想踢足球,但外面实际上在下雨。所以,这里的条件是,如果外面在下雨,那么你就不能踢。你必须待在室内。另一方面,如果外面没有下雨,否则,如果外面没有下雨,那么你就可以出去踢足球。所以,这是一个 if else 语句的绝佳例子。现在,让我们看另一个例子。假设你有一个期末考试,你去参加了一个模拟考试。在那个模拟考试中,如果你得分超过 70 分,那么你的父母会告诉你,他们会给你买冰淇淋。但另一方面,如果你得分低于 70 分,那么你将不得不参加另一个模拟测试。所以,这再次是一个 if else 语句的例子。所以,既然我们已经理解了 if else 语句是如何工作的,让我们去 Jupyter notebook 并实现它们。所以,这里我们有两个变量 A 和 B。我们将值 10 存储在 A 中,将 20 存储在 B 中。我们正在尝试检查 B 的值是否大于 B 的值。也就是说,我们正在检查 20 是否大于 10。如果这个求值为真,我们将直接打印出 B 大于 A。这就是语法。正如你所看到的,你使用关键字 if,后面跟着条件。在条件中,我们正在检查 B 是否大于 A。所以,20 是否大于 10?这求值为真。因为是这种情况,当我点击运行时,我将得到这个结果。B 大于 A。现在,让我改变这里的条件。所以,而不是检查 B 是否大于 A,我想检查 A 中的值是否大于 B 中的值。所以,我基本上在检查 10 是否大于 20。显然,这求值为假。因为是这种情况,这个 if 语句体内的任何内容都将被跳过。当我点击运行时,你们会看到我不会得到任何结果,因为这求值为假。所以,每当 if 语句求值为假时,你们就需要别的东西。这就是为什么我们这里有 else 关键字。所以,这里我们正在检查 A 是否大于 B。因为这被求值为假,我将在这里添加一个 else 关键字并打印出应该发生的事情。因为这是假的,我将不得不打印出 B 大于 A。当我运行时,你们会看到我得到 B 大于 A,这实际上是正确的。所以,这就是关于 if else 条件。然后我们有 if else 的另一个变体,即 if L if else。所以,通过这个,我们可以一次比较多个变量,或者我们可以有多个条件。这次我想找出三个值中最大的值。所以,我有三个变量 A、B 和 C。我将值 10 分配给 A,20 分配给 B,30 分配给 C。一旦我这样做了,使用 if,我开始检查 A 的值是否大于 B,并且 A 的值是否大于 C。所以,正如你们在这里看到的,我给出了两个条件,这两个条件是用 and 运算符连接的。如果 A 大于 B 并且 A 大于 C,如果情况是这样,我将打印出 A 是最大的。如果其中任何一个求值为假,那么通过 and 运算符,你们知道,如果其中一个为假或两者都为假,这一部分将被跳过。所以,这里如果 A 大于 B,我们正在检查 10 是否大于 20,这显然是假的。这里我们正在检查 A 是否大于 C。所以,10 是否大于 30?这也为假。所以,假和假将被求值为假,这就是为什么我们将跳过这一行。然后我们将移到 LF,这次我们正在检查 B 是否大于 A 并且 B 是否大于 C。所以,B 大于 A。20 大于 10。这求值为真。之后,我们正在检查 20 是否大于 30。这求值为假。所以,真和假再次为假。这就是为什么我们也将跳过这个。最后,我们将到达最后的 else 语句,然后打印出 C 是最大的。所以,这就是关于 if、L if 和 else 的内容。接下来,我们也可以将 if 语句与元组一起使用。所以,这里我们创建了一个包含三个元素 A、B 和 C 的元组。一旦我们创建了这个元组,我正在尝试检查元素 A 是否存在于这个元组中。所以,这里,如果 A 在 TU one 中,那么我将打印出 A 存在于 TU one 中。正如你所看到的,因为这求值为真,换句话说,因为这个元素存在于元组中,我能够打印出 A 存在于 top one 中。现在,另一方面,如果我想检查元素 z 是否存在于这个元组中。所以,这里我有一个 if z in top one print z is present in top one。正如你所看到的,我没有得到任何输出,因为这个元素不存在。所以,这里我将为代码添加一个 else 语句,然后打印出消息 Z 不存在于 tub 1 中。这次我将得到一个结果,因为条件求值为假,因此它将打印 else 块内的任何内容。这次我们将使用 if 语句与列表一起使用。所以,我们再次在这里创建一个列表 L1。我们有这三个元素 A、B 和 C。这次我们要做的是检查这个列表的零索引处的值是否等于 a。如果该值为 a,我想将其更改为 100。所以,我检查 if l1 at zero is equal to a。如果是,我将分配一个新值,即 100。运行此后,你们会看到最初的值是 a,我已将其更改为 100。现在,假设我再次执行此操作。如果我想将此值从 A 更改为 Z,我将在此处放入 Z。你们会看到最初的值是 A。这次我已将其更改为 Z。最后,我们将把 if 语句应用于字典。所以,这里我们创建了一个字典 D1,其中我们有三个键值对 K1、K2 和 K3。K1 的值为 10,K2 的值为 20,K3 的值为 30。通过 if 语句,我将为第一个键添加 100。所以,条件是 if D1 of K1 is equal to 10。我正在检查键 K1 的值是否等于 10,然后我将通过此条件为其添加 100。所以,D1 of K1 equals D1 of K1 + 100。所以,我这里有一个错误。我需要初始化 D1。正如你所看到的,初始值是 10、20 和 30。在使用 if 条件后,我为第一个键的第一个值添加了 100。所以,这些是决策语句。现在,我们将进入循环语句,它们用于将任务重复一定的次数。再次,我们这里有一个非常好的例子。假设你有一个水桶,你想用一杯水把它装满。现在,想象一下,杯子和水桶此时都是空的。首先,你将杯子装满水,然后将水倒入水桶。然后,你将检查水桶是否已满。之后,你将再拿一杯水,再次倒入水桶。再次,你将检查水桶是否已满。然后,你将再次拿一杯水,倒入水桶。然后,你将再次检查水桶是否已满。这个过程将一直持续到水桶完全装满水为止。只有当水桶装满时才会停止。所以,你在这里做的是循环或重复相同的任务一次又一次,直到满足一个条件。我们这里有另一个例子。假设你正在听你最喜欢的歌曲,并将其设置为重复播放。所以,这里的条件是,同一首歌将一直播放,直到你关闭应用程序或关闭手机。所以,这就是这里的条件。歌曲将一直循环播放,直到你关闭应用程序、停止歌曲或关闭手机。然后,我们有一个非常有趣的例子。所以,每个月月底,你的工资金额都会存入你的账户。所以,这里发生的是,如果日期是 30 号或 31 号,并且是本月的最后一天,你的工资将存入你的银行账户。这也会在一个循环中发生。所以,这些是循环语句的一些例子。在 Python 中,我们有两种类型的循环语句:for 和 while。我们将同时使用它们。所以,让我们开始使用 for 循环。这里我们创建了一个名为 fruits 的列表,其中包含这三种水果:apple、mango 和 banana。现在,使用这个 for 循环,我想打印出这里存在的每个单独的元素。所以我将写 for i and fruits print i。所以,这里发生的是,最初 i 的值将是 apple。然后 i 的值将是 mango。然后 i 的值将是 banana,一旦它到达列表中的最后一个元素,它就会结束。这就是我们打印出列表中存在的每个元素的方式。所以,这是一个如何使用 for 循环的非常简单的例子。然后我们也可以有一个嵌套的 for 循环,其中一个 for 循环在另一个里面。这里我们再次有两个列表。我们有一个由不同颜色组成的列表,另一个由不同物品组成的列表。所以,颜色是蓝色、绿色和黄色。物品是书、球和椅子。我所做的是,我有一个外部 for 循环,它帮助我选择一种颜色。所以,这里是 for i and color。然后,在外部 for 循环内部,我有一个内部 for 循环,它用于 J an item,它帮助我选择一个物品,我打印出 I J。让我们理解这个 for 循环是如何工作的。所以,最初 I 的值是蓝色,我们进入 for 循环,J 的值将是 book。所以,当我打印出 I J 时,它将是 blue book。然后 J 的值递增,它变成 ball,我打印出 blue ball。再次,J 的值递增,它变成 chair。然后我打印出 blue chair。然后我回到外部循环,蓝色递增。所以,颜色变成绿色。然后我有 green book、green ball、green chair。在此之后,绿色值变成黄色。然后我打印出 yellow book、yellow ball 和 yellow chair。这就是如何使用嵌套的 for 循环。在 for 循环之后,我们有 while 循环。所以,while 循环再次帮助我们重复一个特定的任务。这个任务是根据一个条件重复的。这里我试图使用 while 循环打印出前 10 个数字。这里我初始化了一个名为 i 的变量,并将值 1 分配给这个变量。之后,我正在检查 i 的值是否小于或等于 10。如果 i 的值小于或等于 10,我进入这个 while 循环并打印出 i。然后我递增 i 的值。所以,让我们理解这个 while 循环中发生了什么。最初 i 的值等于 1。所以,条件是 1 是否小于或等于 10?因为这是真的,我进入 for 循环,打印出 1,然后 i 的值递增并变成 2。然后我回去检查 2 是否小于或等于 10。这再次是真的。我回去,打印出 2,然后递增 i 的值,它变成 3。然后我检查 3 是否小于或等于 10。这再次是真的。我回到 while 循环,打印出 3,然后 i 的值递增并变成 4。然后我再次检查 4 是否小于或等于 10。这是真的。我回到 while 循环。我打印出 4。然后我递增 f 的值。它变成 5。然后我们继续以同样的方式,直到 i 的值等于 10。当 i 为 10 时,我检查 10 是否小于或等于 10。这个条件是真的。我在这里打印出 10。之后,我有 i + 1。i 的值变成 11。这次当我检查 11 是否小于或等于 10 时,这个条件失败了。那时我退出这个 while 循环。这就是我得到的结果。类似地,如果我想要前 15 个数字而不是前 10 个,我只需要改变这里的值。你们会看到我打印出了前 15 个数字。现在,使用 while 循环,我也可以打印出两倍表。这里我有了。我将值 1 分配给 i。然后我有一个名为 n 的新变量,我将值 2 分配给这个新变量。在 while 循环中,条件是 while i is less than or equal to 10。当这个条件为真时,我将打印出 n * i equals n * i。然后我递增 i 的值。所以,让我们再次理解 while 循环中发生了什么。最初 i 的值是 1。所以,条件将是 while 1 is less than or equal to 10,这是真的。我回到这里并打印出 n * i,这将是 2 * 1 = 2。所以我打印出来,然后我递增 i 的值,它变成 2。2 是否小于或等于 10?是的,这是真的。所以,我进去。这次我将打印出 2 * 2 = 4。然后 i 的值递增并变成 3。所以,3 是否小于或等于 10?这也为真。所以,这次我将有 2 * 3,等于 6。我打印出来。这个过程将继续,直到 i 的值等于 10。当 i 为 10 时,10 是否小于或等于 10?这是真的。所以,这里将是 2 * 10 = 20,我们将打印出来。之后,当我们递增 i 的值时,它变成 11。所以,11 是否小于或等于 10?这是假的。那时我们退出这个 while 循环。所以,这些是使用 while 循环的一些例子。现在,我们还将看到如何将这个 while 循环应用于列表。这里我们有这个列表 L1,其中包含所有这些数字 1、2、3、4 和 5。我想在列表的每个单独元素上加 100。所以,我开始初始化这个变量 I。我给它零值,这个 while 循环将继续,直到它达到列表的长度,或者换句话说,列表中的元素数量。所以,长度是多少?它将是 1、2、3、4 和 5。最初 I 的值是零。所以,我们正在检查 0 是否小于 5,这是真的。我们进入 while 循环。它将是 L1 at index 0 equals L1 at index 0 + 100。所以,它将是 1 + 100。我们将打印出 1 + 100。然后我们递增 i 的值。它变成 1。所以,它是 1 小于 5。这是真的。所以,这里我们将有 L1 at index 1 equals L1 at index 1 + 100。所以,它将是 2 + 100,将变成 102。这就是我们将继续并打印出或添加到此列表的每个元素上的方式。>> 现在我们已经打下了坚实的基础,让我们将你的技能提升到一个新的水平。是时候学习高级 Python 概念了。准备好深入了解面向对象编程、继承和异常处理,以及高效的文件处理技术。>> 现在,我们将进入 Python 中最重要的概念之一,即面向对象编程。现在,当你环顾四周时,你会注意到你被对象包围着。你面前的笔记本电脑是一个对象。你手中的手机也是一个对象。你旁边的瓶子又是一个对象。现在,如果你想在编程中表示所有这些现实世界中的对象,你需要一种面向对象的编程语言。所以,有很多面向对象的编程语言。Python 也是一种面向对象的编程语言,因为它允许我们在编程世界中表示所有这些现实世界中的实体。现在,要理解面向对象编程的概念,我们需要理解它的两个主要组成部分:类,当然还有对象。所以,让我们从这个叫做类的术语开始。所以,类到底是什么?简单地说,你可以将类看作是现实世界实体的模板或蓝图。我们这里有一个非常简单的例子。让我们以手机为例。现在,当我们谈论手机时,手机又与两个东西相关联。它将有一些属性,并且它们将有一些与之相关的行为。现在,当我说是属性时,手机将有一个与之相关的颜色。手机将有一个与之相关的成本,手机还将有一个相关的电池寿命。并且,除了这些属性之外,当我说是手机将有一些与之相关的行为时。现在,我说的行为是什么意思?我只是意味着,用手机,你可以打电话,你可以在上面看一些视频,有些手机甚至可以让你玩游戏。所以,这个类,这个手机类有与之相关的属性和行为。在 Python 中,类到底是什么?你可以将类看作是用户定义的数据类型。就像我们有整数、浮点数、布尔值和字符串等预定义数据类型一样,我们可以使用类定义自己的数据类型。所以,就像这些。

预定义的 数据类型,我们可以创建 用户定义的 数据类型。而那个 用户定义的 数据类型 被称为 类。所以这里 我们正在做的是 创建这个 类 一个用户定义的 数据类型 叫做 手机。而这个 用户定义的 数据类型 将会有 属性 和 方法 在里面。这些 属性 仅仅是 类的 属性,而这些 方法 仅仅是 类的 行为。现在 既然 这一点 清楚了,让我们 移动到 下一个 组件 对象导向编程 的,那就是 对象。所以 我们已经 知道 类 是什么。现在 对象 仅仅是一个 特定的 实例 一个类。所以 当我们 谈论拥有一个 手机 类时,特定的 实例 这个 手机 类 是 苹果、摩托罗拉 和 三星。所以 苹果、摩托罗拉 和 三星 将会是 对象 这个类,电话 或 手机。而 如果你想要 例子 什么是 对象。所以 就像我们有这些 预定义的 数据类型 像 整数。所以 A 是一个 整数 变量,我将 值 10 存储在里面。类似地,B 是一个 整数 变量,我将 值 20 存储在里面。以同样的方式,如果我们有一个 手机 数据类型,那么对于这个 手机 数据类型,我们有 对象 苹果、摩托罗拉 和 三星。所以 那是一个 简短的 介绍 对象导向编程。现在 让我们看看 我们如何 实际创建 一个类 在 Python 中。所以 创建一个类 在 Python 中,我们需要 开始 使用 关键字 class。然后 继续前进,我们将给 类 一个名字。而 按照惯例,你应该 记住 类名 应该以 大写字母 开头,第一个字母。它必须是大写的,这就是为什么我们在这里使用了大写的 P。所以 这个类的名字是 phone。而 在里面 我们正在定义两个 方法。所以 借助这些 方法 我们可以定义 这个类的行为。所以我有一个 第一个方法 叫做 make call。而 在这个方法里面 我只是打印 出 正在拨打电话。而 正如你所见 这个方法 接受一个 参数 叫做 self。暂时 只理解 借助这个 self 参数 你将能够 访问 属性 存在于这个类中。暂时 只记住这一点。而 随着我们深入 对象导向编程,它会变得 对你们所有人来说 更清楚。所以 就像我们创建了这个方法一样,我们也将创建 另一个方法 叫做 play game,它再次 接受一个参数 self。而 我在里面所做的就是 打印出 正在玩游戏。现在 我已经创建了我的 蓝图 或我的 类 在这里,我需要创建一个 特定的 实例。或者 换句话说,我需要创建一个 对象 这个 phone 类。所以我将只写 phone 在这里,并将其存储在 这个对象 叫做 P1。而 现在我有了这个类的一个对象,我可以继续 调用 方法 存在于这个类中 使用这个对象。所以 当我输入 P1 call 时,我将能够 调用这个方法,它将打印出 正在拨打电话。类似地,当我调用 P1.play 时,我正在调用这个方法,它打印出 正在玩游戏。所以 这是我们如何创建 一个类 和一个对象 在 Python 中。所以 让我们去 Jupyter notebook 并尝试这个例子。所以 我的任务将是 创建一个类。所以 我将有一个 类。我将给 类命名 phone。我将在这里放一个冒号。而 在这之后我需要创建一个方法。创建方法,我们已经知道我们将使用 defaf 关键字。而 我将给这个方法命名 make call。而 我们知道它只接受一个参数,那就是 self。而 在里面,我将简单地有一个 print 语句说 正在拨打电话。一旦我有了这个方法,我将继续在这里创建另一个方法。我将称这个方法为 play game。所以,deaf play game。而 我将再次以 self 作为参数。我也会在这里添加一个 print 语句。而 我将写 正在玩游戏。所以,我在这里创建了我的 phone 类。而 现在我已经创建了这个 phone 类,我需要创建一个它的对象。所以 我将在这里有 P1 等于 phone。所以 我需要在这里放括号。而 这是我创建这个 phone 类的一个对象的方式。而 现在我有了对象准备好了,我可以使用点运算符来调用这两个方法。所以 我将从调用 make call 方法开始。所以我将写 make call。而 当我点击运行时,你将看到它成功地打印出 正在拨打电话。类似地,现在当我调用 p1.play play game 时。你将看到它打印出 正在玩游戏。所以,我们已经创建了我们的 第一个类,我们也为这个类创建了一个对象。而 现在在之前类中存在的方法中,没有额外的参数。我们只有一个参数叫做 self。而 借助那个 self 参数,我们只是能够访问存在的属性。而 实际上,我们之前没有任何属性。所以,我们将改变这一点。所以 在我们的 phone 类中,或者更确切地说,在我们的 phone 类中存在的方法中,我们将添加一些额外的属性。所以 这里我们添加了一个新方法叫做 set color。而 这个 set color 方法在这里接受两个参数。第一个参数是 self,因为它是必需的。然后我们将有这个新属性叫做 color。而 借助这个 color 参数,我正在做的是创建一个叫做 color 的属性,并将这个 color 分配给我的 phone 类中的 color 属性。类似地,我有一个另一个方法叫做 set cost。它也有两个参数 self,因为再次它是必需的,然后我们有这个额外的参数叫做 cost。我也会有一个叫做 cost 的属性在 phone 类中。而 我正在做的是将 cost 的值分配给我在 phone 类中的 cost 属性。所以 现在我已经将 color 和 cost 的值分配给了我的属性,我需要做的是显示 color 的值并显示 cost 的值。所以 现在我已经设置了这些,我需要两个方法来显示 color 并显示 cost。这就是为什么我将创建一个新方法叫做 show color。而 这个只在这里有一个 self 参数,因为我没有分配任何东西。我只是返回这个值。要返回这个值,我将只使用 return 关键字并写 return self.c color。类似地,如果我需要返回 cost,我将有一个新方法叫做 show cost。它也只接受一个参数,那就是 self,我将在这里返回它。正如你所见,我将有 return self.cost。而 这些是我拥有的额外方法。然后我拥有相同的方法,即 make call 和 play game。而 在 make call 中,我们所做的就是打印出 正在拨打电话。而 在 play game 中,我们所做的就是打印出 正在玩游戏。所以 让我们继续并修改我们之前创建的 phone 类。我将从这里删除这些记录。让我剪切整个东西。或者实际上,我可以直接在这里写。所以 这些是之前存在的方法。我需要在这里添加另外四个方法。所以 创建一个方法,我们需要使用 defaf 关键字,我将需要设置一个 color 属性。所以 我将使用这个叫做 set color 的方法。第一个参数 self 是必需的。然后我将有这个额外的参数叫做 color,我正在将这个 color 的值分配给 color 属性,通过使用我传入的 self 属性或 selfparameter。现在以同样的方式我将在这里有另一个方法。所以 就像我设置了 color 一样,我也需要设置 cost。所以 defaf 我将有一个新方法叫做 set cost。它将接受两个参数。第一个参数将是 self,第二个参数将是 cost。而 在这里我将写 self. Cost 等于 cost。而 这是我分配 cost 值的方式。在这之后要打印出 color 和 cost 的值,我将需要一个叫做 show color 的方法,参数将只有 self,而这个方法的作用是它将只返回 color,所以它将是 self color。然后我将需要另一个叫做 show cost 的方法,它再次只接受一个参数,那就是 self,而我用这个返回 cost。所以 在这里我将有 self.cost。所以 这些是我添加的四个额外方法。所以 似乎这里有一个错误。让我看看到底是什么。所以 这是第 7 行,这是 set.cost。所以 这里我实际上需要放一个逗号而不是一个句号。而 现在我们看到我们已经成功创建了它。现在创建这个类之后我需要创建一个对象。所以 我将有 P1 等于 phone。而 现在我已经创建了这个对象,借助这个对象,我可以访问这些方法并为 color 和 cost 分配值。所以我将只调用 P1 dot set color,我将把这个手机的颜色设置为蓝色。类似地,我也会设置它的成本。所以 我将有 P1 set cost,我将把成本设置为,比如说 999 美元。现在我已经设置了 color 和 cost 的值,我可以打印出这两个值。所以 让我删除这个,我将有 P1.show color。现在当我点击运行时,你将看到颜色是蓝色。类似地,当我使用 P1.show cost 时,你将看到成本是 999。所以 这是我们如何添加额外的属性并为这些属性分配值,这些属性属于一个类,借助这些额外的参数。现在有一个特殊的例子或一个特殊的概念在对象导向编程中,称为构造函数。所以 如果你曾与其他语言如 C++ 或 Java 一起工作过,并且如果你学过继承的概念,你就会知道构造函数。通常在 C++ 或 Java 中,构造函数是一个特殊的方法,它与类同名。而 这有助于我们在对象创建时初始化属性的值。所以 这就是构造函数在 Python 中的作用。只是在 Python 中,构造函数的方法名与类名不同。在 Python 中,构造函数被称为 init 方法。所以 这里,正如你所见,这是我们的构造函数。我们有我们的 init 方法,对吧?而 我有 death。所以 在 in it 中,我们有两个下划线作为前缀,也有两个下划线在 in it 之后。所以 我们的构造函数已经准备好了,正如我所提到的,借助构造函数,我们能够 在对象创建本身时为属性分配值。所以 显然我们将在里面有一些参数,并且借助这些参数,我们将能够为属性分配值。所以 在这个 employee 类中,假设我有四个属性叫做 name, age, salary 和 gender。所以 我有这四个额外的参数在这里,我正在将 name 的值分配给这个属性。类似地,我正在分配 age, salary 和 gender 的值。现在构造函数已经准备好了,我也分配了值,我需要显示这些值,要显示这些值,我有一个叫做 employee details 的新方法。我将像这样创建这个方法。所以 我将有 deaf employee details,我将传入 self 在这里,因为我没有分配任何东西,这是默认的或我们肯定必须包含那个 self 参数。而 在这个方法里面,我只是打印出 员工的名字、年龄、薪水和性别。而 一旦我们创建了这个类,我们将继续从中创建一个对象。所以 这里当我们创建对象时,正如你所看到的,我们有 E1 等于 employee。而 在对象实例化本身时,正如你所看到的,我正在传入所有属性的值。所以 这里我正在分配名字是 Sam。类似地,我正在设置年龄为 32,然后薪水为 85,000,性别为男性。这是我如何分配所有值在对象实例化期间。而 一旦我创建了对象,并且因为我也提供了所有属性的值,我可以直接调用 employee details 方法。而 当我调用 employee details 方法时,你将看到我能够打印出所有细节。员工的名字是 Sam,员工的年龄是 32,员工的薪水是 85,000,员工的性别是男性。所以 让我们去 Jupyter notebook 并实现这个构造函数的概念。所以 我将在这里添加这个注释 constructor,我将创建这个新类。所以 我将有一个叫做 employee 的类,在里面我将继续创建 init 方法 defaf。我将有两个下划线,然后我将写 in it。然后再次我将在这里添加另外两个下划线。所以 我将从在这里添加 self 属性开始。然后我将开始添加 name 属性。然后我将包括它。员工的年龄。在这之后我将添加薪水。然后最后我们有员工的性别。我所要做的就是将这些参数分配给存在的属性。所以 我将有 self.name 等于 name, self.age 等于 age, self salary 等于 salary 和 self gender 等于 gender。所以 我在这里创建了这个构造函数。在这之后我需要创建一个叫做 showc employee details 的新方法。让我写下这个方法的名字。所以 我将有 showcore employee details。而 这个将只有一个参数,那就是 self。而在我将打印出所有存在的不同属性的值。所以 我将从打印名字开始。所以 我将有员工的名字是 我将有 self.name。然后我将有员工的年龄是 这里。我将有 self。然后我将有员工的薪水是 这里。我将有 self.salary salary,最后我将有员工的性别是,而 这里我将有 self.gender。所以 让我点击运行,我已成功创建了这个类,其中有一个构造函数。现在我可以继续创建一个它的对象。所以 我将在这里有 E1,我将要做的是,我将使用这个类的名字,即 employee。第一个值应该是人的名字。所以 让我们说这个员工的名字是 Sam。然后 Sam 28 岁,让我们说 Sam 赚大约 75,000 美元。让我们将其设置为 75,000 美元,Sam 是男性。所以 我在这里创建了这个对象。而 现在我已经分配了所有值,我可以继续调用 show employee details 方法。这里我将使用 E1. Details。而 当我调用它时,你将看到我得到这个结果。员工的名字 san。员工的年龄是 28。员工的薪水是 75,000,员工的性别是男性。现在我们将理解继承的概念。所以 简单地说,继承就是当你从别的东西派生出一些属性时。而 继承的一个现实世界例子是,你从父母那里继承一些特征,而你的父母从你的祖父母那里继承一些特征。或者 换句话说,让我们说你有点像你的父母,而你的父母可能在某种程度上像你的祖父母。所以 你从父母那里继承了一些身体特征。现在 如果我们要将这个继承的概念与 Python 联系起来,它基本上意味着我们将有一个子类和一个父类。而 子类将继承父类的一些或全部特征。而 我们这里有一个继承的例子。所以 我们正在开始创建父类。所以 父类叫做 vehicle。所以 我们将有一个叫做 vehicle 的类。而 在里面我有两个方法。第一个方法是默认构造函数。而 在这个构造函数中,我有两个额外的参数,即 mileage 和 cost。而 我正在分配 mileage 的值。然后我也分配 cost 的值。一旦完成,我将继续创建一个叫做 show under details 的另一个方法。而 在 show details 中,我正在打印出 我是一个 vehicle。然后我将继续打印出 车辆的里程。而 也打印出 车辆的成本。所以 现在父类已经准备好了,我将需要创建一个父类的对象。所以 这里我有 v1 等于 vehicle,我传入 500 和 500。所以 这个 500 将代表这个车辆的里程。所以 这基本上可能意味着每加仑 500 米。然后我们有成本,也是 500。所以 这将意味着这个车辆的成本是 500 美元。所以 现在我们已经创建了这个对象,我们可以直接调用 showc details 方法与这个对象。所以 我有 v1.show details。而 正如你在结果中看到的,我是一个 vehicle。车辆的里程是 500,车辆的成本是 500。让我们去 Jupyter notebook 并实现它。让我从这里删除所有这些以前的例子。让我保持新鲜,我将创建这个新的 vehicle 或新类叫做 vehicle。这里我们将从创建构造函数开始。我需要 init 方法在这里,第一个参数显然是 self。在这之后我需要车辆的里程,我也需要车辆的成本。然后我将继续设置这两个值。所以 我将有 self dosage 等于 mileage。在这之后我将有 self.cost 等于 cost。现在我已经创建了这个构造函数,我需要显示细节。所以 我将在这里有一个 show vehicle。这个方法将只有一个参数,那就是 self,而在我将打印出关于对象的一些基本信息。所以 首先我将打印出消息 我是一个 vehicle。然后我将继续打印出 车辆的里程是,而 这里我将有 self dosage,它指的是对象的 mileage 属性。在这之后我将继续打印出成本。所以 我将有车辆的成本是,而 这里我将有 self cost,它是车辆对象的 cost 属性。而 这就是我如何一步一步地创建这个类。创建这个类之后,我将需要创建一个它的对象。所以 我将有 v1 等于 vehicle,而 在这里我将需要传入里程值。所以 让我们举个例子,这个车辆每加仑给我大约 120 英里,而这个车辆的成本大约是 800 美元。所以 我在这里为对象设置了这些值。然后我就可以直接调用 show vehicle 方法。所以 这里我将有 v1.show vehicle。而 当我运行它时,这里有一个错误。让我们尝试确切地理解这个错误是什么。所以 我们有 self。现在让我们仔细看看可能导致这个错误的原因,看看我们如何在代码中修复它。Mileage 我们有 self cost 在这个 vehicle 对象中没有 mileage 属性。所以 我正在设置 m i l eg。让我把它放在这里。现在当我运行它时,正如你所看到的,我已成功打印出 我是一个 vehicle。车辆的里程是 120,车辆的成本是 800。所以 我们已经创建了我们的父类。现在是时候继续创建我们的子类了。所以 创建子类,我们将再次开始给这个类一个名字,叫做 car。所以 我们将有一个叫做 car 的类。而 要继承某样东西,我们将其放在括号内。所以 正如你所看到的,这个类没有括号。但是对于子类,我们将添加括号。而 在它们里面,我们将传入父类的名字,即 vehicle。而 这个子类将有它自己的方法,即 show car。它只接受一个参数,那就是 self,我正在打印出。我是一个 car 用这个方法。现在一旦我创建了这个子类,我将创建一个它的对象,即 C1。现在这里正如你所看到的,即使我没有这个子类中的构造函数,我仍然传入一些值。这是因为既然这个 car 类继承自 vehicle 类,它将自动拥有这两个方法。所以 这个 car 类将拥有 init 方法,也拥有 show details 方法。所以 这个 car 类将总共有三个方法。父类的构造函数,父类的 show_details 方法,以及这个 show car 方法,它是 car 类特有的。现在因为它也有构造函数,我们需要传入 mileage 和 cost 的值。正如你所看到的,我正在传入 mileage 的值,即 200,以及 cost 的值,即 1,200。然后我将继续使用这个子类的对象调用 show details 方法。所以,正如你所看到的,这个对象来自子类,但是这个方法属于父类。但是因为子类继承自父类,所以我们能够调用这个方法。而 当你查看结果时,我们有一个 vehicle,车辆的里程是 200,车辆的成本是 1,200。而 因为我们也有这个特定的方法,我们可以直接调用它。所以 当我使用 C1.show car 时,我得到结果 我是一个 car。所以 我们已经有了父类。现在让我继续创建子类。所以 我将创建一个叫做 car 的类,我将使用括号,在它们里面我将传入这个 vehicle 类。然后我需要继续创建一个特定于 car 类的特定方法。所以 我将定义一个方法,我将称它为 showc_car。这个方法只接受一个参数,那就是 self。而 在里面我将使用 print 函数并打印出一些东西。我是一个 car。而 当我点击运行时,你将看到我们已成功创建了这个类。所以 创建这个类之后,我需要创建一个它的对象。所以 我将写 C1 等于 car。既然它继承了,它也将有一个构造函数。所以,我需要传入一个 mileage 的值。让我们说这个车每加仑给我大约 300 英里,而这辆车的成本大约是,比如说,10,000 美元。所以,我将在这里传入这两个值。现在我输入了值,让我调用 show_details 方法。这实际上是父类中的 show vehicle 方法。所以,C1.show vehicle。而 正如你所看到的,我得到结果。我是一个 vehicle。车辆的里程是 300,车辆的成本是 10,000 美元。而 因为我们也有这个特定的方法,我可以调用它。我将使用 C1.show car。这个应该是小写的 C。现在,当我点击运行时,你将看到我能够打印出 我是一个 car。现在,我们将看到如何覆盖子类中的 init 方法。所以 在前面的例子中,我们创建了一个子类,其中只有一个方法。但是我们现在要做的是也为这个子类添加一个 init 方法。而 这个 init 方法将接受四个参数。前两个参数将只是父类的两个参数。而 因为 vehicle 类有 mileage 和 cost 参数,我将在这里拥有它们。我也将包括 self 参数。而 我将添加两个专门用于 car 类的新参数。所以 我将有 tires 和 HB。现在要将值传递给 superass 或父类,我需要使用 super 方法。所以 我将写 super.init,这基本上意味着我正在调用 superass 的 init 方法,或者 换句话说,我正在调用父类的 init 方法。而 在里面,我正在传入 mileage 和 cost。所以 这些只是我传入的父类的值。而 在传入父类的值之后,我将继续分配子类的值。所以 这里正如你所看到的 self. tires 等于 tires 我正在将 tires 的值分配给 car 类的属性。类似地,我正在将 HP 的值分配给 car 类的属性。而 一旦我分配了这些值,我需要显示它们。所以 这里我将有一个叫做 show_car details 的函数,我将打印出 我是一个 car,轮胎数量是 self. tires,而 马力值是这个。在我创建了这个子类的模板之后,我可以继续创建一个它的对象。所以 这里,正如你所看到的,我有 C1 等于 car,我给了四个值。第一个值将是 vehicle 类的 mileage,第二个值将是 vehicle 类的 cost。所以 这里,正如你所看到的,我正在使用 vehicle。而 当我调用 C1.show details 时,即使 show details 是父类的一部分,我也能够调用它,因为 car 类继承自 vehicle 类。而 这里我有 vehicle 的 mileage 是 20,vehicle 的成本是 12,000 美元。而 我还有 4 和 300。而 正如你所看到的,当我调用 C1.show car details 时,我得到结果 我是一个 car,轮胎数量是 4,而 马力值是 300。所以 我将再次创建父类和子类。所以 我将有一个叫做 vehicle 的类,它将有一个 init 方法。所以 我将写 deaf 在这里。我将写 in it。而 这肯定会有一个 self 参数在这里。而 它有两个值,即 mileage 和 cost。现在我需要分配这些值。所以 它将是 self.。mileage 的值被设置为等于这里的 mileage 的值。所以 在这种情况下,我将有 self.cost 被设置为等于 cost 的值。而 这是我在此上下文中为 mileage 和 cost 分配值的方式。一旦我完成了这个分配,我需要继续并打印出已分配的值。所以 我将创建一个专门用于此目的的新方法。我将在这里定义一个叫做 showc_car details 的方法。而 这个方法将只接受一个参数,那就是 self。而 我将开始打印短语 IMA 来表示 car details vehicle 的开始。而 在这个步骤完成后,我们需要打印出以下消息。车辆的里程是车辆的里程,而 在这种情况下,它将由 self.mile 表示,这是我们在这里引用的。然后除了这个,我还想打印出成本,这是另一个重要的显示车辆成本的值,这里将是 self.cost,这就是我们创建 vehicle 类模板的方式。现在我还需要创建子类的模板。所以 这里将是 car 类,并且因为它是从 vehicle 类继承的,我需要将 vehicle 作为参数传入。在这之后,我必须覆盖 init 方法,并且因为我需要覆盖它,所以我必须为 car 类本身创建一个 init 方法。我将从提供 self 参数开始。然后它将有父类的 mileage 和 cost,然后它将有 tires 和 HP,它们是 car 类本身独有的。在这之后,我将调用 super 方法。所以 通过这个,我将能够调用 superass 的 init 方法。所以 我将有 super.anit a netit,而 在里面我将只传入 mileage 和 cost。一旦我这样做,我需要分配 tires 和 HP 的值。所以 它将是 self tires 等于 tires,而 selfhp 等于 HP。现在我已经创建或覆盖了这个 init 方法,我需要一个显式的 car 类本身的方法。让我在这里添加一个空格,而 这次它将自然地 deaf show 让我们谈谈 car details,正如你所看到的,我将在这里有 self 作为参数。在这之后,这个方法实际上只会接受 self,而没有其他参数,这意味着它不需要任何额外的参数。然后我需要继续并打印出短语 我是一个 car 来表示对象的身份。在这之后,我需要打印出另一条消息,即轮胎数量是。而 这里将是 self 指代 car 类的实例。这有助于展示方法如何使用 self 来访问对象本身的属性,以引用当前实例 tires。而 在此之后,我还需要打印出 horsepower。所以 这里将是 horsepower 是,而 值将等于 self.hp。而 现在我已经创建了父类和子类,我需要创建一个它的对象。这里将是 C1 等于 car。而 我需要提供 mileage 和 cost 的值。让我们说 mileage 大约是 30。所以 它每加仑大约能跑 30 英里。而 成本,比如说,是 5,000 美元。在这之后,让我们说这辆车有四个轮胎。而 马力将是 499 美元。现在我们已经创建了对象并分配了值,我可以继续调用父类和子类的这两个方法。我将在这里使用 C1.ow car details。而 你将看到它打印出 我是一个 car,轮胎数量是 4,而 马力是 499。所以 这些是来自子类或 car 类的细节。现在我将打印出父类的细节。所以 这里我将使用 C1.show vehicle details。而 当我打印出这些信息时,看起来我覆盖了它。所以 我将在这里将名称保留为 show vehicle details。所以 父类中的方法将是 show vehicle details,而 子类中的方法将是 show car details。而 一旦我完成了,你将看到我得到这个结果。我是一个 vehicle。车辆的里程是 30,车辆的成本是 5,000。继续前进,我们将看到不同类型的继承。到目前为止,我们已经处理了单重继承。现在,我们将看到什么是多重继承和多层继承。我们将从多重继承开始,其中子类继承自一个以上的父类。所以 例如,如果你有一个母亲和一个父亲,显然你都有,你从母亲那里继承一些特征,从父亲那里继承一些特征。这个过程就是我们称之为多重继承。所以 正如你所看到的,如果有一个子类,这个子类将继承 parent one 的一些特征,以及 parent two 的一些特征。而 这就是所谓的多重继承。让我们来看看这里。所以,我们正在开始创建第一个父类叫做 parent one。我有两个方法在这里。在第一个方法中,我正在为 string one 分配一个值。所以,要分配 string one,我有一个 self 在 str1 中。而 借助这个,我正在将值分配给这个 parent one 类中的 str1 属性。然后,一旦我将值分配给 string one,我将继续显示这个值或使用 showcore string one 返回它。所以 在 parent class one 中,我正在为 string one 分配值。然后我有一个 parent class 2,并且借助 parent class 2,我首先分配 str2 的值。然后我将显示 str2 的值。然后我将有一个子类。而 我将称这个子类为 derived class。这个在这里接受两个参数,或者 换句话说,它继承自 parent one 和 parent two。而 它也有两个方法在这里。第一个方法是 assign string 3。而 我在这里分配 string 3 的值。然后我将显示它。正如你所看到的,我正在返回或打印出 self.st strd3。所以 parent class 1, parent class 2 和 child class。而 在此之后,我正在做的是创建一个 derived class 或 child class 的对象。而 这里我有 D1 点 assign string one。所以 即使 assign string one 和 assign string two 属于父类,我也能够调用它们,因为子类继承自这两个父类。所以 这里我正在将值 one 分配给 string one。我正在将值 two 分配给 string 2,我正在将值 three 分配给 string three。一旦我给出了值,我将继续在这里显示它们。所以 d1.show string 1 给我 1。D1.show string 2 给我 2,d1.show string 3 给我 3。现在,在这一点上,这可能有点令人困惑。所以,让我们去我们的 Jupyter notebook 这里,让我们仔细地一步一步地创建我们的两个父类以及一个子类。为此,我需要使用 Python 关键字 class,然后给出第一个父类的名字,叫做 parent one。在这之后,我将使用 death 关键字创建一个方法,我将称这个方法为 assign str1。这个方法将有两个参数。第一个参数将是 self,下一个将是 str1。这里我将简单地写 self.st str1 等于 str1。一旦我分配了值,我将需要打印或显示这个值。所以 为了那个目的,我需要在这里定义另一个方法,它将是 show str1。这个方法将负责显示我们刚刚分配的值,使它在我们运行代码时可见。我在这里所做的是,它将只有 self 属性,我需要返回 string one 的值。所以 这将是 return self.st str1,你可以看到我已经创建了第一个类,第一个父类。类似地,我将继续创建第二个父类。这次它将是 class parent 2。而 在这里我将有 def assign str2,self 和 str2 作为参数。我需要分配值。所以 这将是 self.st str2 等于 str2。然后我将继续创建下一个方法,它将是 show str2,self 作为参数,我需要返回 str2。所以 我也创建了第二个父类。现在我的两个父类都准备好了,我可以继续创建子类。所以 这里我将只称这个子类为 child,因为这更直观。在里面我将传入两个父类。我将有 parent one 以及 parent two。现在我传入了两个父类,我将创建一个独属于子类本身的方法。而 在子类中,我将分配 string three。Assign stir three 在这里。它将有 self 参数,我将有 stir 3。这是我分配值的方式。self.st str3 等于 str3。而 一旦我分配了值,我将不得不继续打印它。所以 这里将是 show string 3。它将是 self 在这里。而 我将返回它。所以 这里我需要记住的是,这是 self.string 2,而 这里再次它将等于 self.string 3。而 正如你所看到的,我已经创建了所有三个类,两个父类和一个继承自这两个父类的子类。现在我可以继续创建一个它的对象。所以 这里我将有 car 1 等于 child。一旦我创建了这个对象,我可以继续调用方法。所以 我将从调用第一个父类 car 1 的方法开始。assign_str1。在里面我将传入值 one。然后我将继续调用第二个父类的方法。这将是 assign str2。在里面我将传入值 two。然后我将继续调用子类本身的方法。Assign_st str。在里面我将传入值 three。一旦我调用了所有这些,然后我可以继续在这里打印它们。所以 我将有 showcase str1,你将看到我打印出了 one。然后我将有 c1.show strr2。然后我将,这里有一个错误。所以 让我们正确检查一下。self.st str 我们在这里分配值,在这里返回它。C1.show str2 name str2 未定义。所以 我将要做的是,我将再次运行所有这些,因为我添加了那些 selfparameters,而 这次我们需要得到结果,而 这次正如你所看到的,当我调用 C1.show str2 时,我得到 two 在这里。现在类似地,我将继续调用第三个字符串。所以 我将有 C1.show str,而 这次当我点击运行时,你将看到我得到结果 three。所以 这是我们如何实现多重继承。继续前进,我们有一些叫做多层继承的东西。而 你可以把多层继承想象成祖父、父亲、孩子关系。就像孙子从父母那里继承特征,而父母从祖父母那里继承特征。所以 这里有多个层次,这就是所谓的多层继承。所以 这里我们有三个类。我们开始先创建父类,在父类中我们分配人的名字,然后显示人的名字。然后在子类中我们分配人的年龄并显示年龄。正如你所看到的,这个子类继承自父类。然后我们有孙子类,在那里我们分配性别并显示性别。这里你可以看到孙子类继承自子类。所以 这里有三个层次。子类继承自父类,而孙子类继承自子类。现在让我们去 Jupyter notebook 并实现这个。但是我必须先创建父类。我将有一个类。我将称它为 parent 在这里。而 在里面我将创建一个新方法叫做 assign name。它将有 self,然后我们将有 name 在这里。在里面我将只写 self.name 等于 name。这是我分配名字的方式。然后我将显示名字,为此我将有 show name。它将只有 self 在这里,我需要返回 self.name,我已经创建了父类。现在在这之后,我将需要创建子类。所以 我将有一个 child class。我将在这里创建一个新方法,我将称这个方法为 assign age。我将有 self。我将有 age 在这里,我需要分配这个 age。所以 这里将是 self.age 等于 age。然后我将显示 age。我将需要创建一个新方法。它将被称为 showc age。我在这里写 self,我需要返回它。所以 这将是 return self。而 这个子类继承自父类。这就是为什么我将 parent class 作为参数传递给 child class。然后最后我将创建 grandchild class。这里我将有一个 grandchild 的类。grandchild class,它是一个子类,将继承 child class 的所有属性和行为。这个 grandchild class 也将有它自己的两个独特的方法。将要定义的第一个方法叫做 assign gender。而 这是我传入两个必需参数的方式。我将有 self 作为第一个参数,gender 作为第二个参数。在这里,在这个方法中,我将通过写 self.gender 等于 gender 来设置属性,它将实例的 gender 值分配给实例。然后在那之后,我将继续在这里创建一个全新的方法 show gender,而 这里我将只有 self。我需要返回它。它将是 like return self.gender。而 现在我已经创建了这三个类,这里有我的父类,子类和孙子类。我可以继续创建一个 grandchild class 的对象。我将称它为 GC。而 我将这样实例化它。而 一旦我创建了这个 grandchild class 对象,我可以分配 name, age, 和 gender。所以 我将有 gc.assign。让我再次写下来。所以 这里是 gc.assign name,而 我正在设置的名字,或者 换句话说,我给这个人的名字是 Bob。然后在那之后,我还需要给他一个年龄。所以 这里将是 gc.assign age,让我们说 Bob 54 岁。我也会给 Bob 分配性别,以确保所有信息都完整。这将是 gc.assign assign gender,而 性别是男性。我已经分配了这三件事。现在我需要继续显示它们。所以 这里将是 gc.showname,我正在设置名字。实际上我不需要在这里提供任何东西。我只需要调用它。而 正如你所看到的,我得到了这个人的名字是 Bob。现在让我也调用这里的年龄。GC.show age。你将看到这个人的年龄是 54。然后我将有 gc.show show gender,而 这里正如你所看到的,这个人的性别是男性。>> 所以 让我带你去下一张幻灯片,这是一个文件处理的介绍。好的。所以 我们是什么意思 文件处理?每当我谈论 文件处理 的主题时,我们看到处理文本文件基本上就是 文件处理。你们都知道 文本文件 对吧?那些扩展名为 txt 的文件,那些特定的文件叫做文本文件。所以 让我们说你写了一些文本到一个文件,并保存了那个文本文件。现在你如何使用 Python 编程来处理那个特定的文本文件?比如,你想写一些东西到那个文件里,或者你想读取那个特定文件里写的东西,或者你想要对那个文件执行任何特定的操作。你如何用 Python 编程做到这一点?这正是 文件处理,对吧?我希望你现在清楚 文件处理 的意思。正如我在定义中提到的,处理文本文件叫做 文件处理。即使在 Python 编程中,我们也有另一个名字叫 文件处理,那就是 IO 函数。那就是输入输出函数。所以 每当你听到 文件处理 或 IO 函数,它们实际上意味着相同的东西,处理文本文件。不要被这些术语搞糊涂。好的。接下来,正如我也提到的,有哪些领域?有哪些事情属于 文件处理,以及你可以执行哪些操作?所以 在 文件处理 中,我们已经有很多内置函数,它们帮助我们执行任务,比如打开一个文件,读取文本以及其中写的东西,向文件中写入一些东西,追加文本,基本上修改文本,删除一些文本,以及所有这些操作,你都可以完全通过 Python 来完成。对吧?所以 正如我提到的,有很多不同的函数特别涉及到这里。现在之后,基本上我还有一件事在这里,那就是基本上我将使用什么 IDE,以及我将使用什么 Python 版本来完成 文件处理 的实践。看,有一件非常重要的事情要告诉你,那就是基本上你拥有的在线 IDE 中,哪些不支持 文件处理 技术,原因是因为借助 py 文件,py py 基本上是你的 python 文件,你在其中写出你的代码。所以 任何在线 IDE,如果那个特定的 IDE 同时支持 py 和 .t 文件,那么绝对你可以使用那个 IDE 来写你的代码开始在线 IDE,否则我建议你下载离线 IDE。现在有很多不同的 IDE,你可以选择,比如你可以使用 PyCharmmer,你可以使用 VS code,你可以使用 Jupyter notebooks,无论你觉得什么都可以。让我告诉你我的具体配置。我将使用 PyCharma IDE,而 我正在使用的 Python 版本是 3.9.1,对吧?如果你有相同的配置,那就太好了,即使你有更新的 Python 版本,那也绝对没问题。不要使用低于 3.7 的 Python 版本。有些函数在那里工作,有些函数在那里不工作。所以 我建议你将你的 Python 版本升级到 3.7 以上。希望你对这个非常清楚,即我们正在处理文本,以及你可以执行哪些函数或操作,以及基本上我将在这里使用什么 IDE 来完成工作,对吧?所以 现在基本上我将带你去下一张幻灯片,在那里我们将讨论我们在 文件处理 中拥有的 open, read 和 write 模式。所以 让我带你去简要讨论这三个主题,即 open, read 和 write 模式。好的,正如名字所暗示的,对于 open 模式,所以 在这个特定的模式下。你可以做什么,你可以打开任何文本文件,借助这个特定的函数,即 open。所以 这个特定的 open 模式用于当你只是想打开一个文本文件进行读取或写入,进行修改或进行任何操作时,你在最开始使用 open 函数。

第一点。现在这里还有一个问题,那就是让我举一个非常生动的例子,但请不要把它当作一个文本文件。假设我有一本书。好的,我想读一本书。那么,我该如何读这本书呢?我会拿出那本书。我会打开它,然后读出我想要的内容,对吧?同样的情况也适用于文本文件。您将把您的文本文件保存在与您的 Python 文件相同的文件夹中。之后,首先要做的就是打开文件。写入、读取、修改,所有这些都是您需要做的次要部分,比如如果您不打开文件,不打开文件您如何执行任何操作,对吧?所以这就是为什么每当我们处理文件时,每当我们处理文本文件时,第一个方法就是我们使用的第一步是打开我们的文本文件,所以这个特定的事情是由我们在 Python 编程语言中拥有的打开模式执行的,希望我已将这一点非常清楚地解释了什么是打开模式以及为什么我们在文件处理中使用它。现在,接下来我将带您进入读取模式。在您打开文件后,假设您只想从该文件中读取一些文本。让我再次使用书籍的例子。当我打开我的书时,打开它可能有两种情况。首先,我可能想从那本书中阅读一些内容,或者我可能想在其中写一些内容,对吧?真的只有这两种可能性。所以,每当您处于第一种情况,想从书中阅读一些内容时,同样,当您想从文本文件中阅读一些内容时,在这种特定情况下,我们会做什么?我们会使用读取模式,对吧?这就是您想要读取文本时使用的模式,该文本已存储在您的文本文件中,所以我们使用这种读取模式,对吧?我希望我也已经清楚地解释了读取模式。接下来,您的第二种情况可能是,您不想阅读,而是想在那本书中写一些东西。所以文件处理也一样,您不想读取文件,而是想写一些东西,您想在文件中添加更多文本。那么在这种情况下,写入模式就派上用场了。所以,每当您愿意写任何东西来在您的文本文件中添加一些额外的材料时。那么在这种情况下,我们使用这种写入模式。所以,当您想在您的 txt 文件中写入文本时,就会使用它。对吧?所以希望我也非常清楚地解释了写入模式,它有什么用,什么时候使用它,以及为什么我们使用这种写入模式,对吧?所以希望这三个特定的模式都非常清楚,它们是什么,我们如何执行功能,我们如何进行操作。现在我将带您到我的 IDE,即我的 PyCharm IDE,然后我将告诉您基本上如何执行实际操作,如何使用 Python 编程语言读取、写入和打开文件。所以,这就是我们实际拥有的 PyCharm IDE。嗯,我将为您提供关于这个特定 IDE 的快速概述。然后我将继续进行实际操作。所以,嗯,这里基本上让我们创建一个文件夹,就是我拥有的那个文件夹。所以,我将要做的是创建一个 Python 文件,我将在其中编写我的代码。为了完成这个特定的任务,我将点击这个文件。好的。现在我将右键单击。所以,一旦右键单击,这个特定的框就会出现。现在我想要第一个选项,即新建。好的。从这个新建选项中,我将转到第四个选项,即 Python 文件。我将点击这里。您需要用任何特定的名称保存您的文件。比如,我将给它命名为文件,然后是文件处理。好的。按回车键。所以,是的,这就是您的笔记本电脑的样子。每当您创建一个 py 文件时,那就是您的 py 文件,它是一个完全的 Python 文件,好的,希望我非常清楚。接下来,所以这里我们处理文本文件,所以有必要创建一个文本文件,看,现在这里有两种情况:要么您创建一个文本文件,要么基本上您已经有一个文本文件并将其放在此处。所以,我将要做的是在这里创建一个新的文本文件,好的,所以再次是相同的过程。转到您的项目。右键单击。转到新建选项。现在在这种情况下,转到第一个选项,即文件。所以,每当您看到这个文件选项时,就将其视为我们的 txt 文件。让我们将我的文本文件命名为 text,然后按回车键。右键单击此文件,然后单击确定。所以,我的文本文件已经创建,并且它具有扩展名,即 txt 文件。好的。希望您能看到这个特定的文件。现在我在这里要做的是,我将放入,好的,让我做一件事。是的,我将把我的文件夹程序放入并编写我的文件夹程序。所以,我将创建一个变量,即 fe,在此之前,好的,不是在这里,而是在文本文件中,在此之前,我将把文本放入这个文件中。所以,我将放入文本,比如,这是主题,这是文件处理的主题。现在这里还有一件事要注意,这是一个您正在写入的文本文件。所以,您不需要输入任何注释,任何井号,或者任何嗯双引号或单引号。根本不需要这些。对吧?希望我非常清楚。让我带您到拥有 Python 文件的文件,然后让我们开始编写代码。比如,我创建一个变量。那就是 L。现在这被称为文件指针。好的,将其视为文件指针。所以 L 等于 open。现在 open 基本上是我的函数。我们将看到的第一个函数,让我在这里输入一个井号,然后让我在这里写下第一个模式。那就是打开模式。好的。所以,这里我们使用内置的 open。嗯,在里面,我们将放入双引号。好的。现在在双引号中,您将写出我们的文本文件名。所以,我的文本文件名是 text.txt。好的。让我抛出一个东西,因为我需要重命名它。所以,好的,一秒钟。就是这样。重命名文件。让我们这样做。不是在这里。所以,输入。好的。让我们取消文件。好的。让我们继续处理这个特定的事情。让我们看看会发生什么。所以,打开 text.txt。好的。那是我的文件名。转到新的一行。这就是您打开您的特定文本文件的方式。您只需要写一个变量。那就是我们写的。我只是写了一个 ver,因为我们称之为文件指针。这就是我提到 f 的原因。除此之外,它不是强制性的。您可以放入任何您选择的变量。我们放入赋值运算符,然后我们使用 open 函数来打开这个特定的文件。对吧?所以,一旦文件打开完成,接下来就是您想以什么模式打开它。您想以读取模式打开还是以写入模式打开?所以,每当您想打开读取模式时,在这种情况下,我们在这里写 R。每当您想以写入模式打开它时,在这种情况下,我们写 W。好的。所以,那就是 X.T. txt。好的,再次在此处放置逗号并使用双引号。现在在这里,您指定要打开文件的模式。比如,我想使用读取模式。所以我在这里写 r。它会自动理解您想以读取模式继续,这意味着您想读取您的文件。您正在打开文件以供读取。让我们移到新的一行,我将创建一个变量,我们将要做的是那个特定的变量将为我读取文本。所以,比如我的变量是 content。Content content 等于,而我的 f 是我以读取模式打开文件的变量。现在,这里是我的 read 函数。Content 等于 f readad。转到新的一行。然后我将简单地写 print。并在括号内,我将放入变量 content,因为 content 是我文件被读取的唯一变量。它被读取并存储。看?好的。在此之前,让我快速运行程序。然后我将告诉您我刚才试图解释的是什么。好的。实际上,没有这样的文件。我只是希望它能起作用。让我创建一个新文件。点击新建。嗯,转到文件。在此处输入名称。比如,就是这样。按回车键。是的。现在我想要文本文件,然后点击确定。好的。在这里。所以,让我从这里关闭文件。现在点击这里这个特定的文件。类似嗯嗯好的就是这样。让我快速再做一件事。让我再创建一个。所以,那是 file_demo.txt。按回车键。所以,是的,现在这是已创建的完整正确的文件。请。是的。这里还有一件事要注意。不要忘记您想添加的扩展名。好的。所以,一旦您添加文本,现在这就是您创建的正确文件。所以,我将再次添加一些文本。这是嗯,这是文件处理主题。比如,这是我的文本。好的,主题。现在,让我们回到这里。现在我将更改我的文件名,即 demo.txt,然后我将注释掉第一行,因为现在它完全不需要了。让我们暂时将文件放在这里。所以,好的,它正在索引。基本上,它正在设置您在这里写的所有内容。所以,它正在设置所有这些,所有这些特定的东西。所以,这是 PyCharm IDE 出现的一个问题。好的,我将点击上面的运行按钮。所以,现在让我带您上去。所以,现在您有了输出。这是文件处理主题。这就是我们在 demo.txt 文件中写的文本,对吧?这就是我们写的相同文本。并且借助 read 函数,我们能够在此特定上下文中在我的 PyCharm IDE 的控制台中显示此特定文本。我能够获得此文本输出。所以,这就是我们执行读取模式的方式。这就是您使用文件处理技术读取文本的方式。对吧?我希望您对第一个完整的 read 函数非常清楚。现在我将要做的是带您进入下一个模式,即写入模式。我将要做的是注释掉上面的所有三行,因为现在我希望我的文件以 W 模式打开,即写入模式。所以,比如 f 等于这里是 open 函数。好的,一秒钟,让我来到这里,我的文件名是 write,在此处放置逗号,我想以 w 模式打开它。现在,在以写入模式打开它之后,我将使用 write 函数来指定您想写入文本文件的文本。所以,比如我只想写关于主题的内容。写下我正在学习文件处理的文本。让我向下滚动一下。好的。所以,这就是我想写的文本。是的,完成了。现在,这里有一个非常重要的事情要提,我上面没有提到,我现在提到的是,每当您打开一个文件时,关闭该文件也很重要。好的。我认为这是一个好习惯。看,当我将它与我之前使用的关于书的例子联系起来时,我们当时在做什么?我们有一本书,所以我们打开了它,无论您想在其中读取还是写入,这取决于。所以,一旦您打开了它,在执行完您想要的所有操作后,您也会关闭那本书,对吧?同样的情况也适用于文本文件,每当您打开任何文本文件时,您都应该关闭它,对吧?这就是为什么我使用了 f.close()。现在我将运行我的文件。在这里,我不会在我的 Python IDE 的控制台中获得任何输出。原因是我直接将文本写入了我的 demo.txt。在这里。我正在学习文件处理。对吧?我正在学习文件处理。这就是我们写的文本。那是正确的句子。所以,我在这里的 demo.txt 文件中看到了这句话。对吧?所以,我希望您现在对这个函数也非常清楚。写入函数是如何工作的。所以,我希望您现在对 open 函数、read 函数和 write 函数都非常清楚。对吧?所以,现在我们还有一些其他主题,一些其他模式要学习。所以,我将立即带您到演示文稿,然后让我们讨论其余的主题。现在让我们谈谈如何向该文本文件添加文本,以及如何计算我们添加到该特定文本文件中的字符数。所以,让我带您到下一张幻灯片,在那里我们有添加文本和计算字符。所以,首先让我们谈谈添加文本。所以,每当我想向 txt 文件添加任何文本时,我们都有一个名为 append 的函数。那就是 append。这是我们用于向您的文本文件添加数据或文本的特定 append 函数。对吧?所以,基本上每当您想添加这些行或添加特定行时,我们都使用 append 函数。我们在这里写入的模式是双引号中的小写 a。对于读取和写入,我们使用 r 和 w。但对于 append 函数,我们使用小写 a。对吧?所以,每当您看到小写 a 时,您应该立即理解,这是正在向文本文件添加或写入内容的地方。现在,假设您有一个特定的情况,您正在添加的任何文本,您只想将该特定文本转移或添加到新行。要将文本添加到新行,我们使用运算符反斜杠 n。所以,反斜杠 n 是另一个用于将您的文本移到新行然后添加任何所需文本的运算符。对吧?所以,append 函数基本上帮助我们向您的 txt 文件添加文本。正如我提到的,它用于向 txt 文件添加您的文本。接下来,使用的模式是 a,用于追加,这意味着添加或写入一些文本到文件。所以,每当您使用 a 时,就意味着您正在使用追加模式。它意味着向文件添加或写入一些文本。然后要将文本添加到文件的新行上,我们在写入要添加的句子之前使用反斜杠 n。所以,这是出现的另一种情况。我已经提到了。但有一件事我漏掉了,那就是每当您想要您写的所有内容都出现在新行上时,我的意思是像一个新句子出现在新行上。您想将内容追加到新行上。那么在这种情况下,请在句子的开头使用那个反斜杠 n,而不是在结尾。好的?在句子的开头使用它,然后它将专门将您移到新行并在新行上显示您的句子。对吧?所以,我希望我非常清楚 append 函数,它的用途,我们如何使用它,它的规格是什么,以及我们在这里使用的模式。现在我们有下一个主题,即计算字符。现在让我们看看如何计算字符。这是通过 len 函数 len 完成的。好的?所以,len 是基本上用于计算字符的函数,意思是您文件中的总字符数。那个特定的操作,那个事情可以借助 len 函数完成。所以,您基本上要做什么?首先,您打开您的文件并使用我们已经有的 open 和 read 函数来读取它。在读取文件以及文件中写的所有内容之后,您只需应用 len 函数。好的,您只需应用 len 函数,然后将该 len 函数应用于一个变量。我的意思是您将其分配给一个变量,该变量是您以读取模式打开文件的变量,借助那个特定的变量,您使用 len 函数,一旦所有事情都完成,您只需获得文本文件中字符的总数。对吧?所以,我希望我关于 len 函数也非常清楚。所以,让我再回顾一遍,以确保一切都绝对清楚,没有任何混淆。当您想计算文件中字符数时,您首先使用 open 函数打开文件。然后您使用 read 函数读取文件内容。在将内容存储在变量中之后,您在该变量上使用 len 函数。len 函数将返回文件中存在的字符总数,包括空格、标点符号以及可能存在的任何特殊字符。当您需要知道文件中文本的确切长度以进行处理或分析时,这是一个非常有用的函数。请记住,len 函数易于使用,并且对于此任务非常有效。所以,总结一下,打开文件,读取内容,将它们存储在变量中,然后将 len 函数应用于该变量以获得总字符数。我希望这个解释能帮助您理解如何使用 Python 计算文件中的字符。如果您有任何问题或需要进一步澄清,请随时提问。它完全用于计算或查找您在文本文件中使用的总字符数。对吧?首先,您打开您的文件。然后您执行您想使用的任何操作。之后,您只需使用您的 len 函数。所以,我希望我非常清楚 append 和 len 函数,这两个函数是什么,它们基本上有什么用,以及如何使用它们。所以,我希望您对这些事情非常清楚。现在,我将带您到 PyCharm IDE,在那里我们将看到 append 和 len 函数的实际示例。现在让我们看看我们如何实际实现 append 模式和 len 函数。所以,append 模式基本上用于向您的文件添加一些字符,而 len 函数用于计算您有多少字符。对吧?所以,好的。所以,好的,我将要做的是首先向我的 demo 文件添加一些文本,因为它被删除了,因为我注释掉了所有内容。所以,比如我将在这里写我正在学习。我正在学习,这里是,比如文件处理。文件处理。好的,没问题。这是我这里已经有的一些文本。现在,我将使用 append 模式向这个特定位置添加更多文本。我们使用的简写是 a。我将要做的第一步是打开我的相关文件,我想要追加文本的文件。所以,对我来说,那是 demo.txt。我将放一个逗号,然后是模式的双引号,模式是 a。所以我将放进去。移到新的一行。好的。现在在这里,我可以随便取一个变量。比如,将其称为我的一个变量。我将使用 fright 函数来写入或添加任何内容到我的笔记本电脑或我的文件。在里面,我将写下。好的,在我们已经写过的上面,已经有的东西。我正在学习文件处理。让我们写下这是追加模式,就像这样。对,让我们移到新的一行。在此处打印添加的文本。最后,我将关闭我的文件。所以,f.clo 带括号,就像这样。嗯,我也会在这里添加一个反斜杠 n。所以,无论接下来出现什么都会出现在新行上。现在是运行程序的时候了。所以,好的,这基本上是因为我在这里写了 add text。所以,它基本上是在计算我添加的简单字符数。所以,是的,这实际上是好的。让我们去 demo.txt 看看发生了什么。This is append mode 已添加。基本上我得到的是这里添加了一个新行。This is append mode,这是我使用 a 函数添加的。使用这个 a 模式,我添加了那个特定的东西。对吧?所以,我希望我清楚这个函数是如何工作的,对吧?所以,我将要做一件事。我将简单地从这里删除这些相关的东西。所以,这将是很好的。如果我再次运行它,它将在这里运行。现在缺点是我没有得到任何选项或答案。但这里又添加了一句话。所以,您运行此语句的次数,您运行此程序的次数,它将基本上将这些语句添加到您的相关文本文件中。对,这就是 append 函数实际工作的方式。现在我将向您展示 length 函数。所以,这里是 length 函数。让我们来到这里。我将再次打开我的文件,但这次我的文件将打开,一秒钟。这次我的文件将以读取模式打开,因为我想嗯,只是加起来或计算一些相关的东西。对。我不想写或重复任何东西。所以,我只想计算总字符数。这很清楚。我的文件将以读取模式打开。好的。所以,在这里我将写下,比如我的变量 this_data 等于 f read,并在括号中,我将写下我们拥有的变量 f。好的。不是这个。我将简单地写 f read,就像这样。接下来,我有一个 total_count 作为我的新变量之一。并且在其中,我将首先放入我们拥有的函数 len 和我从中读取数据的变量。所以,那个变量就是 data。好的,我将只读取 data mean。就那样吧。这里也是 data read。所以,在 len 函数中,您需要写那个变量,您使用 read 函数的特定变量,我上面写了。好的。最后,您将打印出您计算的变量。那就是 total_underscore_count。我将就这样写。最后,您关闭您的文件。对吧?所以,我将要做的是在这里运行这个程序。我的总字符数,我文件中的总字符数是 87,对吧?我的 demo.txt 文件中总共有 87 个字符,对吧?为什么我得到了一个这样的额外语句?因为我没有注释掉这一行。这就是为什么又出现了一行。所以,是的,我希望再次清楚如何使用 append 函数添加一些文本,以及基本上如何使用 len 函数来计算并给出您文件中总字符数的计数。好的,我希望我对这些事情非常清楚。所以,让我们继续下一个主题,并查看下一个函数。现在我们将在此文件处理中查看另一个函数,即 readline 函数。现在我将解释 readline 函数实际上是什么以及它在这里有多大用处。好的。现在,让我们看看。我们已经讨论了如何读取文本,如何写入文本,以及如何向该特定文本添加一些内容。我们已经看到了如何追加以及所有这些事情都绝对清楚。现在,可能有一种情况,比如您拥有的任何文本文件,您想逐行读取该文本。例如,在第一行,无论写了什么文本,您先读取它。然后,在第二行,无论有什么文本,您读取第二行。在第三行,无论写了什么文本,您也读取它。所以,这可能是一种特定情况,无论有什么文本,您都需要逐行读取所有内容。对吧?所以,为了执行这个特定的函数,我们在文件处理中有一个 readline 函数。Readline,顾名思义,可以帮助您逐行读取文本或内容。对吧?我希望我能说清楚。现在接下来,我们有什么?所以,我们如何使用这个特定的函数?所以,要使用这个函数,首先您需要以您想要的任何模式打开文件,读取模式或写入模式,无论您喜欢什么,您都可以打开文件,然后您需要使用 readline 函数。所以,为了相应地读取行,我们使用 readline 函数,如前所述,它基本上会逐行显示行,就像它会显示文本一样。现在,比如在您的第一次读取中,第一行写着 learning file handling。第二行写着 read write and open mode。第三行写着 append mode。所以,每当您使用 readline 函数时,首先它将显示第一个文本,即 learning file handling。接下来它将为您提供下一个输出。再次使用 readline 函数,它将为您提供第二行,即 read write and open modes。在此之后,如果您再次使用 readline,它将显示第三行。所以,这就是 readline 函数的实际工作方式。这就是这些函数的作用,并帮助我们逐行读取文本。所以,在写完这些内容之后,并且在我告诉您逐行读取这个文件之后,我们已经看到了 read 函数,对吧?那也是一个用于读取文本的函数,但是区别在于,使用那个函数,您一次性读取所有文本,就像您使用 read 函数一样,它会一次性显示您文件中写的所有文本,但在您想逐行读取文本的情况下,一次读取一行,那就是您使用 readline 函数的时候。对吧?所以,我希望我非常清楚这两件事。readline 函数以及基本上如何逐行读取文本。现在,我将带您到 PyCharm IDE,在那里我们将看到 readline 函数的实际示例。好的。所以,我们在这里 PyCharm IDE,现在我将使用 readline 函数。好的。但在此之前,我将向我的文件再写一两句话。所以,f.right。对?比如,我正在学习文件处理。好的。嗯,主题。我将只写主题是 open、read 和 write 模式。好的。然后,好的,不是 open。它是这样打开的,对吧?然后我将转到新的一行。我将再次写 f.right。然后,比如我将在这里写,嗯,接下来是 append 函数。对吧?比如,这三行是写好的。我将在这里运行这个特定的文件。但在此之前,我将要做的是注释掉这一部分。对?所以,注释掉它。然后,让我们向下滚动并运行我们的程序。所以,来了。好的。所以,这里不会显示任何内容,因为我告诉过您,因为我们已经写入文件。这是我的文件。现在,我在这里没有使用反斜杠 n,这就是为什么它会这样显示。让我快速在开头使用反斜杠 n。哦,好的,不是这样。像这样。然后在开头使用反斜杠 n。然后,现在让我再次快速在这里运行它。所以,让我去 demo.txt,是的,现在它显示出来了。所以,我正在学习文件处理,主题是 open、read 和 write 模式,接下来是 append 函数。还有一件事,如果您想删除所有这些空格,请不要在斜杠 n 和句子之间放置任何空格。现在它看起来完全正确。太好了。现在我在这里要做的是,我想逐行读取文本。好的。所以,我们需要做什么?首先,我将简单地写变量名,我用来打开文件的那个,无论模式如何。例如,这里我以写入模式打开了它,但这并不重要您使用的是哪种模式。重要的是您选择的变量,对吧?所以,您已经打开了文件,变量是 f。然后您使用 readline 函数,就像这样。F readline,而这一切都放在 print 语句中,就像这样。好的。现在,我将在这里运行这个程序一会儿。好的,一秒钟。它不可读。我的文本文件去哪了?一秒钟,各位。嗯,那个特定的文件夹在哪里,用于 Great Learning?让我快速打开它。所以,在这里。不在这里。不在这里。就在这里。所以,demo.txt。对。这些是文件。现在,让我们在这里快速运行我们的程序一会儿。好的。不可读。让我们看看我们在这里做什么,问题是什么,以及为什么它没有按预期显示。好的。所以,它进入 print f readline,之后括号关闭。在此之前,让我注释掉这三行,并首先以读取模式打开文件。现在是再次运行程序的时候了。所以,来了。现在,我得到了我的第一个输出。我正在学习文件处理。所以,这个输出出现是因为,哦,还有一件事,基本上您可以以读取模式或写入模式打开文件,但您不能一起使用像这样的函数。所以,在那一点上,我需要先注释掉这些行,因为我不能同时写入并使用 readline 函数。您不能同时使用这两个函数,对吧?这就是为什么我不得不注释掉那三行。所以,它读取了我文本文件的第一行,即我正在学习文件处理。是的,那是第一件事。现在,让我来到这里。如果我在这里使用另一个 print 语句 fad line 并像这样放置括号,会怎么样?现在,如果我再次运行我的程序,看看我在这里得到的输出。我得到的输出是主题是 open、read 和 write 模式。所以,让我在这里这样做。当我第一次使用 readline 函数时,我得到了第一行显示。接下来,当我第二次使用 readline 函数时,显示了这一行。对吧?所以,我希望你们都明白了这一点。现在让我们看看如果我再次使用这个 print readline 函数会发生什么。所以,f read line 带括号。现在会发生什么?这一行将第三次显示。这意味着我的第三行将在这里显示,即关于 append 函数。所以,只是为了验证,我文本文件中的这三行是我正在学习文件处理主题,即 open、read 和 write 模式。而下一个也是最后一个是 append 函数。太好了。所以,我希望我非常清楚这三个 readline 函数。我们如何逐行读取文本。现在,如果我再次使用 readline 函数会怎么样?由于我的文本文件中只有三行,如果我再次使用 readline 函数会发生什么?基本上,它不会显示任何其他文本,因为我的文本文件中没有更多行了。在我的 demo.txt 中,我只有那三个特定的行。它不会显示错误,也不会显示任何文本。它只会留空。我现在将删除这个特定的东西。最后,我的文件正在关闭,因为我们都知道,每当我们打开一个文件时,我们基本上都需要关闭那个文件。对吧?所以,我希望您也理解了关于 readline 函数的这个特定概念。readline 函数是什么,我们如何使用它,以及基本上我们如何读取单行中的文本。并且完全是逐行完成的。对吧?我希望这一切对您来说都非常清楚。现在,我们将继续下一个主题。现在让我们谈谈 try 和 except 函数。所以,这是我们开始处理异常处理的地方。对吧?所以,从这里我将向您解释如何处理异常。所以,这下面的有趣主题是 try 和 except。所以,让我带您到下一张幻灯片。在这里,我们有 try 和 except 语句。现在,您在 try 块中写入的任何代码块都将被执行,只要您的代码完全没有错误。如果您的代码中有任何错误,那么基本上 except 部分就会被执行。看,这样想。比如,假设您正在为项目或作业编写一些代码。所以,您决定将主要逻辑,即程序的核心功能或基本部分放在 try 块中。对,之后您也添加了一个异常。所以,如果您的代码中有任何错误、失误或意外问题,它将向您显示该特定异常作为错误消息。对,之后,它是一个异常,当发生问题时会发生的特殊事件。在这种情况下,您需要将 print 语句或您想执行的任何其他操作放在 except 块中。所以,如果您的代码没有任何错误,try 块将顺利运行并显示所需的或预期的相关输出。但是,如果您的代码有问题、麻烦或错误,那么您的程序的控制将进入 except 块,并且您在那里写的所有内容都将执行。将显示任何发生的异常,或者如果您在 except 中写了任何 print 语句,也会显示。您在 except 部分写的所有内容都将以异常消息的形式显示给您作为输出。太好了。我希望我非常清楚 try 和 except 语句以及它们在编程中的工作方式。之后还有一件事是,对于一个 try,您可以使用任意数量的 except 语句,这意味着您可以处理代码中多种不同类型的异常或错误,使您的程序更加健壮和可靠。让我稍微解释一下。比如,您写了一个 try 和 except 语句。您编写一个 try 块和一个 except 块的方式。现在,比如您想添加多个 except 块。是的,您绝对可以这样做。所以,是的,基本上您完全可以这样做,并且没有任何限制阻止您在代码中这样做。现在让我们详细谈谈这在您的程序中如何作为输出工作。对于一个 try 块,只有一个 except 语句是完全可以的,但对于正确的错误处理,您的代码中至少需要有一个 try-except 对。除此之外,对于一个 try 块,您可以根据需要使用任意数量的 except 语句,无论您想要多少,取决于您想要处理的不同类型的错误。这些是与单个 try 关联的 except 语句,对吧?所以,我希望我能清楚地说明如何在编程中使用 try 和 except 语句。每当您的程序没有错误时,try 块就会按预期执行,您的代码就会顺利运行。但是,如果您的程序中有错误,except 语句就会被执行,从而允许您优雅地处理错误。基本上,在 except 语句运行之后,您在 except 块中使用的任何 print 语句都将被执行,您将相应地看到输出。如果您没有使用任何 print 语句,那么您将得到一个异常作为结果,并且屏幕上不会打印任何内容。我之前提到的另一件事是,一个 try 块可以有多个 except 语句,这意味着您可以分别处理多种类型的异常。所以,不一定总是只有一个 try-except 对。您可以为不同的错误类型使用多个 except 语句。对于一个 try,您可以使用 10 个 except,20 个 except,30 个 except,无论您想与一个 try 块一起使用多少 except 函数或语句。您总是可以这样做,并且没有上限。我希望我非常清楚如何使用 try 和 except 函数以及如何有效地在代码中使用它们进行错误处理。现在让我们详细看看语法,看看如何在您的程序中编写它。所以,您如何使用它?try 和 except 的语法是什么?首先,您写您的 try 关键字,对吧?您写下它,添加一个冒号,然后转到新的一行。一旦您转到新的一行,您将自动获得一些制表符。这些空格是为了确认是的,您在 try 块内。在此之后,您写下您的相关逻辑。您写下您的语句。这意味着您只需写出您的完整代码,您想在那个特定位置写任何内容。对?之后,您退出 try 语句,然后写下您的 except。现在,您可以简单地打印一些东西,比如 write except,然后在其中一个 print 语句,或者您可以写 except exception as e。现在这两种情况在这里出现。它们有什么用?所以,这个 except exception as e 基本上用于当您想看到任何相关的错误或异常作为输出时。在这种情况下,我们使用 except exception as e。在您只想在发生异常后有一个 print 语句作为输出的情况下,您只需使用 except 关键字。之后,您只需写下您的相关 print 语句。对吧?所以,正如我们学过了 try 和 except 的理论,现在让我们进入实际部分。让我们看看它实际上是如何使用的,如何实现的。所以,我将要做的是,首先,我将获取两个输入。比如 a 等于我将只写 input。在里面,我将写一个语句。比如输入数字。好的。转到新的一行。让我们获取第二个。我将在这里写 input for number two。比如这是 number two。比如这是 number one。所以,这里再次出现冒号,就像这样。对?现在,比如我正在编写一个程序来添加两个数字。所以,现在是我的 try 函数。在我的 try 函数中,我有什么?所以,我将从这里开始,比如我必须声明一个变量。比如 C 等于。现在上面我只使用了 input 函数。我想做的是编写一个程序来添加两个数字。但 nowhere 我声明了我想让输入是整数格式。对吧?那是没有声明的部分。所以,现在我已经声明或将声明一个新变量。比如这里的 C。之后,基本上我将要做的是,正如我提到的,我们将编写一个程序来添加两个数字。比如,我将在这里从用户那里获取这两个数字。对?现在,嗯,当我说从用户那里获取数字格式的输入时,在这种情况下,我从未在任何地方提到我想让输入是整数格式。如果我没有指定,它将自动将输入作为字符串。当我使用加号时,它不会给我加法。它只会连接两个数字,这实际上就是发生的事情。我可以在这里做的是简单地使用相关的类型转换。我可以这样写,然后简单地这样写。转到新的一行,我将使用一个 print 语句,并在其中打印 C。好的。在此之后,我将使用 except exception as E。对?这是我刚才告诉您的第一句话,我们可以使用这个特定的语句 except exception as E,然后我将简单地打印 E。您都知道我将得到的结果是,我将得到某种异常。原因是,我没有在这里指定任何数据类型,并且我在这里提到了。所以,它会说我们不能添加整数和字符串。要么是整数加整数,要么是字符串加字符串。对,让我运行程序并向您展示这些内容是如何出现的。您可以输入第一个数字。比如,那是二,这里是六。所以,我得到了什么?加法的操作数类型不匹配:int 和 str。所以,基本上这意味着您在这里使用的操作数类型,比如您获取的变量不受支持。一个是整数,另一个是字符串。对?现在,这就是当您的程序出错时发生的异常类型。这是遇到异常的第一种方式。好的。现在,第二种方式是,您可以简单地在这里写 except,然后在其中您可以添加一个 print 语句,比如您的 try 块中的错误。您也可以像这样打印一个简单的句子。当我运行这个时,比如我输入我的数字。比如三,然后是五。所以,我得到了什么?您的 try 块中的错误。但它不像之前的 except exception as E 那样具体,对吧?它不是那么具体。所以,在这种情况下,我们总是尽量优先写 except exception as e。您应该始终优先使用它,对吧?所以,我希望您明白了异常是如何发生的。现在我也将进行类型转换。现在让我们以正确的方式编写我们的程序。我将在那个特定位置运行它。所以,我得到的第一个输出是输入数字一。比如,那是 4 6,现在我得到了我的结果输出,即 10。原因是,我没有任何错误。所以,我的 try 块执行了,如果我的 try 块执行了,我的 except 块也将不会执行,因为我的程序中没有任何错误,我写了。对,我希望我非常清楚这些特定的 try 和 except 语句,我们如何使用 try 和 except,语法是什么,以及实际生成异常的正确方法。所以,正确的方法是 except exception as e。对吧?我希望这很清楚。现在,让我们继续关于 try 和 except 函数的其他主题。所以,让我们添加到异常处理中。现在让我们理解 try 和 else 子句。我刚才几分钟前告诉您了 try 和 except。现在让我们看看如何使用 try 和 except 来使用 else 子句,它何时执行以及所有这些。让我们继续。好的。所以,第一件事是,您可以使用 else 子句与 try 和 except 语句。是的,这是允许的。这组指令是什么?您需要遵循哪些内容?所以,每当,比如您使用 else 子句与 try 语句时,就是当您想执行一组严格的指令。每当,比如情况是您的程序没有任何异常。在 try 块执行之后,您希望再打印一个语句作为输出。在这种情况下,我们只需使用 else 子句。让我给您一个想法。比如,您编写了一个程序来计算两个数字的乘积。您添加了 except 语句,之后您使用了 else 子句。在 else 子句中,您在那个特定情况下使用的任何 print 语句,如果您在程序中没有任何异常,如果您在程序中没有任何错误,那么在 try 块执行之后,那个特定的 else 语句将被执行。我希望我非常清楚这一点,对吧?但这只会且仅在您的程序中没有任何错误,您的异常实际上没有发生时执行。只有在这种情况下,else 子句才会起作用。语法是您首先写 try 语句,然后是 except 语句,之后是 else 关键字。添加该内容后,放一个冒号,然后转到新的一行。一些空格将自动检测到,之后您可以添加您的相关 print 语句。您的相关代码块,无论您希望在未发生异常时执行什么。所以,在这种特定情况下,您可以使用任何与您相关的。没有限制说您只能使用 print 语句或只能编写一些逻辑操作,什么都没有。

那样。你可以在那个特定部分写任何东西。对吧?所以,我希望我非常清楚地解释了 `try` 语句与 `else` 子句的用法,如何使用它以及在哪些情况下特别使用它。现在,让我们实际看看如何将 `try` 和 `except` 语句与 `else` 子句一起使用。所以,我将开始编写代码,从用户那里获取两个输入。所以,`a = int(input("请输入第一个数字。"))`。我在这里写,比如说“请输入数字”。好的,请输入第一个数字。它会移到新的一行,我将获取另一个输入,这就是我们的输入所在。请输入数字。好的,所以这里我用小写的 n。现在我要编写一个程序来找出数字是偶数还是奇数。好的,所以我不想要第二个语句,对吧?我只需要为那个编写程序。确定一个数字是偶数还是奇数。我不需要检查第二个数字,对吧?它只适用于一个。所以,让我们继续编写它。我将从我的 `try` 语句开始,在我的条件内部,我将检查数字模 2 是否等于零。基本上,如果数字除以二余数为零,在这种情况下,我将使用 f 字符串打印出数字本身,即 `a` 是一个偶数,对吧?如果不是这种情况,在这种情况下,打印 `else` 部分,打印 `f"{a} 是一个奇数"`,对吧?这些可以是两个语句,两种情况:如果数字是偶数,意味着余数为零,在这种情况下写出这个特定的数字是偶数,否则打印它是奇数。之后,这里是 `except`。我会写 `except Exception as e:`。加上冒号。来到新的一行。打印出小的 `e`。那是我的异常。现在,在此之后,`try` 和 `except`。这里你使用 `else` 子句。所以,就像这样。在这个里面,你可以写任何东西。我只会放一个打印语句,说“那个 `else` 子句被执行了,就像这样”。我可以打印其中一个语句,“`else` 子句被执行了”。对吧?所以,好的。现在我将要做的是,我将运行这个特定的程序。所以它要求我输入数字一。比如说,那是四。看看它给了我什么。它给了我“四是一个偶数,并且 `else` 子句被执行了”。现在,为什么我的 `else` 子句被执行了?因为我的 `try` 块被完全执行了,以完整的方式执行了,因为我的程序中没有错误或异常。这就是 `else` 部分被执行的原因。现在,我将要做的是,比如说,我只是在我的程序中制造任何错误。比如说,如果我只放一个单一的“这个”,好的,现在如果我运行我的程序,好的,所以它,好的,所以它是语法错误,1 秒等于 `and`,然后这里,比如说我只是制造 `b`,因为 `b` 是我们没有定义的变量之一。所以,比如说我制造了 `b`。运行它,它会要求我输入数字一。比如说我的数字是三。看看它给了我什么。“名称 `b` 未定义”。这是我发生的异常。对吧?而我的 `else` 子句甚至没有被执行。我告诉你的原因是,每当你的 `try` 块被执行时,每当你在 `try` 块中编写的逻辑被执行后,你的 `else` 部分才会被执行。如果你得到任何错误或异常,那么你的 `else` 子句根本不会被执行。对吧?所以,我将再次进行相关的更改。所以它是 `a`,又是 `a`。现在,如果我再次运行我的程序。所以,在这种情况下,我不会得到任何错误,任何像那样的异常。比如说,它是对的。所以,45 是一个奇数。然后我得到了那个语句被执行,“`else` 子句被执行了”。对吧?希望我非常清楚关于 `try` 和 `except` 和 `else` 子句如何协同工作的语句。希望我非常清楚这一点,即哪个部分基本上会被执行。对吧?我们将看到下一个主题。现在,让我们来讨论 `finally` 关键字。所以,现在我将看到“异常处理中的 `finally` 关键字是什么”。让我们继续。所以,是的,这里我们有,嗯,好的,我非常详细地告诉了你关于 `try` 和 `except` 函数。我们甚至已经完成了实际操作,对吧?那完全结束了。然后我向你介绍了 `else` 部分,对吧?如何将 `else` 子句与 `try` 语句一起使用。所以,那个特定的条件适用于那个特定的情况,每当你只是想,比如说,你正在 `try` 块中编写任何特定的逻辑或特定的代码,并且当你没有在你的程序中遇到任何特定的错误时,这意味着你的 `except` 部分不起作用,它根本不执行。在这种情况下,`else` 部分正在被执行。现在,`finally` 关键字会发生什么?看,`finally` 是一个关键字,无论你的程序中是否有异常,或者你没有异常,它都会被执行。它不。对于 `finally` 关键字来说,唯一重要的是它必须被执行,无论你是否有异常。对吧?你可以直接将 `finally` 关键字与 `try` 和 `except` 块一起使用,或者即使你只是想将它添加到 `else` 子句。所以,在这种情况下,你也可以把它添加到你的 `else` 子句,然后在之后是你的 `finally` 关键字。无论你是否与 `else` 子句一起使用,或者只是与 `try` 和 `except` 一起使用,这都无关紧要。但有一件事在这里是确定的,而且是强制性的。无论你的 `try` 和 `except` 块中编写了什么代码,无论 `try` 是否运行,或者 `except` 是否运行,`finally` 关键字都一定会执行。对吧?现在,让我们快速关注一下我在这里写的。所以,`finally` 是一个关键字,它肯定会在 `try` 和 `except` 语句块执行之后执行。所以,这意味着 `finally` 是一个关键字,它肯定会在 `try` 和 `except` 块运行之后执行,就像我之前告诉你的那样。很好。现在,当我继续讨论如何使用它的语法时,语法非常简单,实际上与我们在以前的主题中遵循的相同。首先,你放你的 `try` 语句。将你的相关代码或逻辑,无论你想包含什么,放在 `try` 块中。之后,添加你的 `except` 语句。我总是建议你写 `except Exception as e:`。这使得异常对你来说更相关。它生成一个特定的异常。所以,如果你的程序中有任何异常,它会以一种清晰定义的方式呈现给你。所以你可以轻松地理解,哦,这就是发生的异常,所以现在我不会在我的程序中再犯这个特定的错误了,这实际上就是发生的事情。然后,我们有 `else` 部分,它是可选的。如果你想添加它,你可以,否则它根本不是强制性的。对吧?并且在使用任何相关的 `else` 条件或不使用之后,下一个语句是关于 `finally` 关键字的。所以,在这个特定的位置,你使用你的 `finally` 关键字。在 `finally` 块中,你放你的相关代码,或者可能只是一个打印语句,或者任何你想要的逻辑。你可以在 `finally` 块中放入它。之后,你执行你的程序。所以,无论运行什么,`try` 还是 `except`,这都无关紧要,但你总会得到 `try` 或 `except` 的最终输出,并且 `finally` 关键字一定会执行。最后,这意味着你在 `finally` 中编写的任何内容都一定会执行并显示给你,在 `try` 或 `except` 块运行之后。很好。所以我希望我现在对 `finally` 关键字非常清楚。它是什么,我们如何执行它,它的语法是什么,它的用途是什么,适用的条件是什么,不适用的条件是什么。对吧?所以我希望这个理论部分非常清楚。现在,让我带你到 PyCharm IDE,让我们来实现相同的实际部分。所以,现在让我们执行一些 `try` 和 `except` 部分的实际示例。对吧?我将在这里使用 `finally` 关键字与 `try` 和 `except`。所以,让我们开始吧。好的,让我滚动到这个特定的位置。我将要做的是,我将首先编写一个程序来找出哪个数字更大。好的,比如说,我们有一个简单的程序想要编写。所以,我将要做的是从用户那里获取一个整数输入,这里是输入步骤,这里是我的提示“请输入数字”。对吧?我的第一个数字,也就是第一个变量的值,在这里。接下来,移到新的一行,我将使用第二个变量。对于那个,我也会像以前一样从用户那里获取输入。所以,这里是。请输入数字,像这样留出空间。对吧?所以,现在变量一和变量二都已成功从用户那里获取了输入,并且我们已经存储了这些值。然后是我的 `try` 函数,它用于处理程序执行期间可能发生的异常或错误。所以,`try` 我的条件是 `if a > b:`。在这种情况下,我可以使用 f 字符串向用户打印一条语句,它允许我们在 Python 中轻松地格式化字符串。我可以写 `print(f"{a} 大于 {b}")`。回到 `else` 条件。`else` 我们可以打印的是,好的,让我回到代码中的这个特定位置,并为 `else` 情况添加 f 字符串,以便正确处理两种情况。在括号里是这样的。好的,F 应该在外面,而不是像这样在里面,对吧?所以,是的,在这里写。`b` 更大。让我下来到这里。`b` 是一秒钟。所以,`b` 大于 `a`。好的,所以 `b` 大于 `a`。这些条件都已满足。出来并使用我的 `except` 函数。所以,`except Exception as e:`。加上冒号,然后在这里打印 `e`。对吧?你绝对理解了这段代码,因为我们之前已经处理过这类代码了。现在,来到这里,我将使用我的 `else` 子句。比如说,它也正在被执行。好的,首先,让我们添加 `finally` 块,然后我将添加 `else` 子句。所以,这里是我的打印语句,我将写“`finally` 关键字被使用”。比如说,这是我的打印语句。好的,没问题。所以我认为我们的程序中没有相关的异常,因为我们还没有创建任何异常。所以,我的输出将是,首先,我将得到这里是否满足了任何条件,最后,这个特定的语句将被打印出来。让我向你展示如何。所以,让我们运行它。所以,正如你记得的那样,快速在空白处运行它,我们只需右键单击,然后单击运行选项,就这样。所以,我将输入的数字,比如说,是 21。好的。好的。上面的那个也没有被注释掉。一秒钟。再次。非常抱歉。让我在这里终止它。好的。是的,但请记住,我们之前也写过一个程序。所以,让我在这里也快速做一下。让我们注释掉它。好了。现在,是时候运行程序了。所以,单击运行。请输入数字一。所以,比如说,那是 21。嗯,那是 34。所以,它显示给我的是 34 大于 21,因为我的第二个条件得到了满足。这意味着 `b` 的值大于 `a`。对吧?最后,出现了这个语句,“`finally` 关键字被使用了”,对吧?因为这个最终语句被执行了。现在,我将要做的是稍后对程序进行一些更改。让我们看看这里。好的。好的。是的。让我们现在运行它。好的。所以,我将输入一个。比如说,那是 34。然后是数字二。比如说,那是 1。好的。我得到了相关的异常,它说名称 `c` 未定义。除此之外,我的 `finally` 关键字再次在这个特定的点被执行了。所以,它向我展示了 `finally` 关键字的用法。所以,正如我在讨论理论时告诉你的那样,无论我们使用什么,`finally` 关键字总是会被执行。无论 `try` 块是否运行,或者 `except` 块是否由于异常而运行,`finally` 关键字都会在这个特定的点被执行。对吧?我希望我对此非常清楚。让我在这里关闭它。然后,我将再次以同样的方式进行。并且,我也将向你展示如何使用 `else` 部分。简单地在 `except` 之后,你可以添加 `else` 条件。嗯,一秒钟,回到这里,按回车键,然后写下你相关的打印语句。所以,打印或者任何你想要放入的逻辑。任何东西都可以。所以我将在这里写 `print("else 部分被执行了")`。所以,执行就在这里。对吧?所以,这里我也添加了 `else` 部分以及 `finally`。现在让我们运行它。所以,让我们看看我的数字一,它是 67,我被告知它是 30。然后这里是 67 大于 32。在 `try` 之后,我们使用了 `else` 部分,所以这就是为什么 `else` 部分首先被执行。然后我们有了 `finally` 关键字,然后基本上我的 `finally` 语句就在那里。所以,这个特定的语句被执行了,那就是 `finally` 关键字被使用了,对吧?希望我非常清楚关于程序的完整详细解释,如何添加 `finally` 关键字,如何添加 `else` 条件,以及一切都应该非常清楚,对吧?好的。所以,让我们也看看其他事情。嗯,所以现在基本上我将讨论我们已经涵盖的这个模块的总结。所以,让我带你到那个特定的演示文稿。现在,让我们快速总结一下我们在这个异常和文件处理模块中学到的内容。所以,让我带你回到我们开始的地方,我们将从那里回顾一切。所以,我们从文件处理的介绍开始。所以,文件处理基本上处理文本文件。这意味着这完全是关于处理文本文件。意味着你正在打开、读取、写入或追加它们。所有这些操作都在文本文件上执行。而整个过程称为文件处理。文件处理的另一个名称是 Python 文件输入输出函数,文件 IO 函数或文件输入输出函数,无论你如何称呼它,你都可以使用这个术语。所以,具体来说,我们有不同的函数,如 `read`、`write`、`append`、`alter` 等等。好的,让我们继续。我们描述了 `open`、`read` 和 `write` 模式。所以,`open` 是其中一种模式,它基本上帮助我们打开文件,就像我们会打开一本书来阅读一样。所以,我们做的第一步是打开相关的书。同样,无论你将要处理哪个文件,你做的第一件事就是打开那个文件。那个操作是用 `open` 模式完成的。然后我们有 `read` 模式。`read` 是允许你读取你的程序、你的文件、文本文件中写的所有内容的模式。而 `write` 是允许你在文本文件中写入任何内容的模式之一。所以,这是我们看到的三个模式。我们还看到了如何实现它们的实际示例。然后我们添加了文本和计算字符。所以,要向你的文本文件添加一些文本,我们有 `append` 函数。`append` 是一个函数,它基本上帮助你向你的文件添加文本。我们也看到了如何编写它。接下来,我们有一个用于计算字符的函数,它告诉你文本文件中的字符总数。所以,那个函数是 `len` 函数。对吧?现在,让我们继续。然后我们谈到了 `readline` 函数。所以,这是其中一个函数,它基本上允许你逐行打印出你相关的书面文本。无论你在文本文件中写了什么。所以,它允许你逐行打印出所有文本作为输出。对吧?然后我们转向了异常处理。我们谈到了 `try` 和 `except` 函数。所以,我们讨论了 `try` 和 `except` 语句。写在 `try` 块中的任何代码,只有在没有错误或异常发生时才会执行。如果你有任何异常,那么基本上 `try` 块将不会被执行,你将得到相关的异常输出。我们看到了两种编写异常的方法。第一个是 `except`,只写 `except`,然后在打印语句中写下你的相关消息。第二个是你可以使用 `except Exception as e:`,然后打印 `e`。所以,它会自动给你一个相关且有意义的异常。对吧?所以,我们谈到了 `try` 和 `except`。我们也看到,对于一个 `try`,你可以使用任意数量的 `except` 块。对吧?然后我们转向了 `try` 和 `else` 子句。所以,我向你解释了如何使用 `try` 和 `else` 子句。所以,写在 `else` 子句中的那部分或代码块,它是异常处理和编程的一部分,只有在 `try` 块执行期间你的程序中绝对没有发生任何异常时才会执行。如果存在任何异常,即使是一个,那么你的 `else` 子句也不会被执行。对吧?这正是我们在之前的例子中观察到的,并与 `try` 和 `else` 子句讨论过的。最后,我们谈到了 `finally` 关键字。`finally` 关键字是什么,它的目的是什么,以及它在异常处理的上下文中如何工作。有了 `finally`,无论你的 `try` 块是否成功执行,或者你的 `except` 块是否由于异常而执行,这都无关紧要。真正重要的是,无论你的程序中是否有异常,你的 `finally` 块都一定会毫无疑问地被执行。你的 `finally` 块总是在所有情况下都会被执行。对吧?所以我真诚地希望我已经让关于异常处理和文件处理的这个模块的一切都非常清楚了。对吧?所以我希望你现在对所有我展示和解释的主题都非常清楚,包括我们在这次会议中一起进行的所有的实际操作和演示。如果你有任何疑问,请随时回顾示例并自己练习以获得更好的理解。希望你们都非常清楚这一点。>> 掌握了这些高级概念后,让我们继续学习数据结构和算法。我们将探索数组、栈、队列和链表,并深入研究基本的搜索和排序算法,以提高你的解决问题的能力。>> 现在,让我们来谈谈我们的第一个线性数据结构,即数组。>> 那么,什么是数组?它是一种线性数据结构,意味着元素以线性方式存储。对吧?线性方式。现在,如果我们谈论数组,让我们举个例子。比如说,这就是你如何表示一个数组,以行的形式。对吧?比如说,它包含元素 1、2、3 和 4。对吧?现在,每个内存位置都会有一些地址。对吧?所以,比如说,这是四个元素 1、2、3 和 4。以及它们各自的地址。比如说,这个是 100,这个是 104。这个是 108,这个是 112。现在,如果我们谈论内存,这些地址显然会是十六进制的,当你谈论这个时,这个特定的数组将在内存中的某个地方,有四个,或者可以说每个整数有四字节的内存。现在,如果我考虑这个整数,比如说一个整数占用四字节。现在,这四个字节可用于每个整数。现在,这是一个整数,对吧?现在,它需要四个字节。现在,第二个整数将从 104 开始,对吧?因为这又需要四个字节,然后是 108,又需要四个字节,然后是 112,对吧?所以,在内存中它会在那里。但关键是,显然你可能会想,好的,先生,假设这是我们的内存,现在如果我们有四个字节和四个字节,这意味着这里有八个字节,这里有八个字节,但它们是以块的形式提供的,对吧?这是一个块,这是第二个块,其余的内存被占用。我们能为你的内存中的这个数组存储东西吗?不行,因为它需要连续的内存位置。这意味着,当出现这种情况时,你有内存位置或内存位置在一个大块中可用,对吧?这意味着,如果你谈论这个数组,它需要 4 * 4,即 16 字节,并且它们以连续的内存方式可用,对吧?或者它们以一种方式可用,那就是一个 16 字节的单个块。好的?只有这样你才能在该位置存储元素。现在,显然为了简单起见,我将这些地址视为数字,整数数字,但实际上它们是十六进制数字,好吧?所以,对我来说更容易。好的,所以,现在还有一件事是,元素以线性方式存储,对吧?但我们可以随机访问元素吗?是的,借助索引。所以,如果你谈论这个数组,对吧?1、2、3 和 4。显然,这个数组会有一个名字,对吧?现在我们有索引 0、1、2、3。现在,为什么索引从零开始?或者为什么有一个零,并且索引总是从零开始?现在,这是个问题,对吧?现在,让我们试着揭开这个事实。为什么索引从零开始?为什么它不从一开始?现在,如果你还记得,我告诉你这个数组会有一个名字,那就是 `r`。现在,这个 `r` 只是数组的名字,数组的名字代表,它代表它的基地址。对吧?现在,正如我们之前讨论过的,`a` 的基地址是 100,这是 104,这是 108,这是 112。对吧?所以,现在这是 100。现在,让我们谈谈如何访问,我们将谈论如何在接下来的幻灯片中声明和初始化我们的数组,但让我们假设我们正在谈论如何访问它。我们使用数组名,然后是下标,然后是索引。好的,索引是 1。现在,我告诉你这个数组的名字代表基地址。所以,基地址是 100。现在加上 1。现在,这个 1 代表四个字节。好的?所以,四个字节,然后内部发生的事情是,它归结为 100 + 4,这意味着 104。现在,104 不是第一个位置,它是第二个位置。好的?现在,同样,如果你谈论访问数组中的第二个或第三个元素,它会归结为 `array[2]`,这只不过是 100 + 2。现在,这个 2 实际上是 8,对吧?108。所以,你将访问数组中的第三个元素。现在,你如何访问第一个元素?所以,`r[0]`。现在,它归结为 100 + 0,因为没有字节。对吧?所以,它归结为数组索引从零开始。现在你知道为什么了。这就是你可以随机访问元素的方式。所以,借助这些索引。好的?所以,现在你可能会想,好的,现在我们有一个数组。我们可以存储不同的元素,对吧?我们可以存储,比如说,这是数组。我们可以存储像,首先是一个整数,然后是一个浮点数,然后可能是一个字符。不行。如果你谈论任何特定的数组,让我们谈论这个数组。你可以存储在这个数组中的数据类型或数据类型将是同质的。也就是说,你只能存储相似的元素。好的?所以,这些是事实,这就是数组的工作方式。地址是什么,索引是什么,你能存储不同的元素吗?不,你只能在其中存储相似的元素。现在,让我们谈谈数组的应用。现在,你可能会想,我们为什么要使用数组?我们使用它们的原因是什么?基本上,当你谈论数组时,显然当你有一个场景,你想以线性方式存储你的元素,并且你想将它们存储在连续的内存位置,以便你可以有效地使用你的内存,对吧?不是 CPU,而是你可以使用你的内存并充分利用它。所以,如果你想有效地使用你的内存,你可以使用数组,但显然数组有一些缺点,对吧?这就是为什么我们有不同的数据结构。所以,如果你想以线性方式存储你的数据,你可以使用数组。好的?现在,数组也适用于需要频繁搜索的场景。如果你想在数组中搜索一个元素,你可以直接访问这些索引一个接一个。所以,以线性方式,你检查,这是你要找的元素吗?不。20 是你要找的元素吗?不。30 是你要找的元素吗?不。那么,你要找的元素是什么?是的,你可以一个接一个地访问所有这些元素,并尝试搜索你想要的元素。好的?所以,它适用于需要频繁搜索的应用程序。现在,让我们谈谈一维。如果我们谈论一维数组,它可以被认为是一行,就像我们在例子中看到的,对吧?所以,这就是一维数组。它表示为一行,我们有地址,比如 104、100、104、108、112 和 106。索引显然将是 0、1、2、3、4。然后这个数组会有一个名字,那就是 `ar`。然后你可以在这个数组中存储元素。比如说,这里是一个整数数组。你只能存储整数元素。这个数组的大小是五。你存储了元素 1、2、3、4、5。所以,现在你可以把它看作是一行,其中元素一个接一个地存储,就像你看到的那样,有一个,然后是两个,然后是三个,等等。所有这些数字都存储在连续的内存位置中。好的?现在,当你谈论一维数组时,只使用一个索引,对吧?当你尝试声明和初始化你的数组时,你将使用一个下标。好的?所以,你怎么使用它?比如说,如果我谈论我在这里定义的这个特定数组,对吧?你会这样定义它:`arr`,然后是下标或索引,以及这里存在的元素数量,即五。所以,只有一个下标,或者将使用一个索引。好的?所以,这就是你声明数组的方式。现在,让我们谈谈这个数组的声明和初始化。所以,显然,当你谈论数组时,数组会有一个名字,然后是数据类型。你将在该数组中存储整数值吗?然后那个下标或索引,我们使用它,以及数组的大小。所以,这就是你声明一维数组的方式。现在,你怎么初始化它?有不同的方法可以初始化它。显然,在这里你正在声明它。然后你可能会使用一个 for 循环来初始化所有元素,或者你可以一次性声明和初始化你的数组。所以,你怎么做?所以,你会写,比如说,这是一个整数数组,你不需要指定大小,你可以直接写元素,对吧?而那些元素,比如说,是 1、2、3、4 和 5。在这种情况下,当你一次性声明和初始化你的数组时,大小就变成了可选的。你不需要显式地指定数组的大小。但显然,这个数组的大小将是五。好的?现在,因为你一次性声明和初始化它,这是可选的。但在你没有在那时初始化的 경우,大小变得非常重要,你必须显式地提及大小。好的?现在,让我们谈谈二维数组,也称为 2D 数组。所以,它可以被认为是一个像这样的表,或者你也可以称它为一个矩阵,其中有行和列,对吧?现在,在这个元素中,元素一个接一个地存储,以至于你可以把它看作是一个一维数组。所以,这就是一维数组,对吧?正如我们已经看到的,对吧?并且在这个一维数组中,你有一个另一个一维数组。现在,这被称为二维数组。所以,它是如何工作的?比如说,这里有数字,你有四个数字 1、2、3、4,然后你有 5、6、7、8,然后你有 9、10、11 和 12。所以,这是一个二维数组,它将类似于有三行,对吧?你将有三行,而不是四行,而是三行,并且在这三行中,你将有四列,1、2,等等。所以,数字将是这样的:1、2、3、4、5、6、7、8、9、10、11 和 12。好的,完成。现在,显然这将有,比如说,这是基于零的索引。所以,这里将有一个零索引,这里有一个索引,等等。现在,内部发生的是,它将是 0,0,然后是 0,1,然后是 0,2,0,3,然后是 1,0,1,1,1,2,1,3,然后是 2,0,2,1,2,2 和 2,3 用于索引,对吧?所以,类似地,我们将有这个索引为 0,0,这个为 0,1,等等。所以,如果你想访问存在于特定位置的元素,你会怎么做?你会运行两个 for 循环,对吧?一个将从这里开始,比如说,一个将从 `i=0` 开始到这个外部数组的长度,即小于 3,对吧?另一个从零到行数。好的?所以,这将是外部循环,这将是内部循环。这意味着存在的列数。所以,这是为了行,这将是为了列,它将从 0 开始到小于 4。好的?所以,这就是你如何迭代,它将类似于这个。现在,关于寻址呢?对吧?关于地址呢?所以,比如说,如果这是 100,那么这将是 104。这将是 108。这将是 112。这将是 116。因为内部它被视为它们都在连续的内存位置中,但这次你有一个一维数组,并且在这个一维数组中,你有一个另一个一维数组。所以,要声明它,你将使用两个下标,对吧?所以,它将是类似数组名,然后是两个下标。现在,这将表示行数,这将表示列数。所以,在这种情况下,行数将是三,列数是四。对吧?所以,这就是你声明二维数组的方式。维度取决于你使用的下标数量。这次我们使用两个下标。现在,比如说你使用三个下标,对吧?所以,类似地,三个,三个,三个。好的?所以,这次是三维数组。同样,你可以有多维数组,对吧?你只需要继续添加下标。就是这样。好的?>> 现在,我们应该学习数组的实现,对吧?我们在这里解决三个不同的问题陈述。第一个是创建一个一维数组。它非常简单,人们可以很容易地理解它。第二个我们关注创建一个二维数组,它通常意味着一个包含行和列的矩阵。我们也称之为 m 和 n 或 m x n。这些都是你可以用于二维数组的名称。此外,二维数组用于不同的目的。最后,我们将对只包含整数的数组进行排序、搜索、插入和删除元素。所以,这些是我们为 Python 中的数组解决的问题陈述。让我们快速跳到 IDE,看看第一个问题陈述,即如何创建一个一维数组,并将元素插入其中,并在屏幕上显示用户输入的输出。所以,让我们跳到 IDE。我正在使用 Google Collab 来编写第一个程序,对吧?所以,我们将重命名它。我将其命名为“一维数组”。现在,我们将来到这个 IDE,并输入一个一维数组示例,其中包含数组大小,向用户询问不同的输入,然后将用户收到的相同输入显示在输出屏幕上。为了节省时间,我将直接放入代码。所以,我认为这是我们将用于一维数组的代码。我将解释这里发生的事情。第一件事是,我们询问要存储在数组中的元素数量。例如,可能是五、六或十。所以,无论整数是多少,整个数字,我们都可以给出它,对吧?所以,我们再次为输入分配一个变量。用户输入的任何输入都将分配给名为 `num` 的变量,对吧?然后我们分配一个空数组。为什么?因为用户定义的任何大小都设置在这里。所以,如果是五,它只能容纳五个元素。如果是六,它只能容纳六个元素。就是这样工作的。紧接着,我们将要求输入数组中的元素。然后我们将使用 for 循环添加它们。我们将在这里使用一个重要的代码片段。那就是 `arr.append`。在这种情况下,`append` 意味着将元素一个接一个地分配到数组的末尾。我们不会将用户输入的元素随机放置在中间、前面或任何其他地方。对吧?所以,`append` 将始终确保用户提供的元素一个接一个地添加到数组的末尾。接下来,我们将显示数组中的所有元素。再次,要显示数组元素,你必须使用 for 循环,因为它需要一个接一个地打印元素。所以,让我们快速运行这个程序,看看输出是什么样的。对吧?所以,它正在询问你想在数组中插入多少个元素。现在,我只输入三个。然后它会问你第一个数字。我输入四。然后是第二个数字,即五。然后我输入七。好的?所以,它将显示 457。你也可以通过在数字之间添加逗号或空格来修改此输出。如果没有,它就可以像这样显示 4、5 和 7。所以,这就是 Python 中的一维数组。现在,让我们看看 Python 中涉及数组的第二个问题陈述。好的。我们将创建一个二维整数数组,你可以在其中指定行数和列数,它将相应地填充数组中的元素。所以,让我们快速切换到 IDE,即 Google Collab,看看二维数组在 Python 中是如何工作的。所以,这里我将这个特定文件命名为“2D array”,但你可以随意命名,我将在这里放入代码。让我解释一下代码。我们询问了行数。所以,你的矩阵应该有多少行?我将称它为矩阵,因为我们在矩阵中通常使用行和列。所以,用户应该提供行数,我们将把这个数字存储在 `r_num` 中,它代表行号。再次,我们将要求用户输入列数。对吧?所以,无论给出什么数字,一个整数,一个整数,都将存储在 `c_num` 中,这意味着列号。你可以根据问题陈述设置变量。所以,为了让事情更容易理解,我使用了 `r_num` 和 `c_num`。接下来,我们将分配我们拥有的所有值,对吧?用户给出的值,无论是行号还是列号,我们将把它们与元素一起分配。要做到这一点,我们将使用一个 for 循环,因为我们需要一个接一个地打印它们。最后,我们将打印最终数组,最终矩阵,它是一个二维数组。我在这里只使用了一个缩写,这样你们更容易理解。2D 数组,即 2D,表示维度,下划线,`rr`,我没有完全写出数组,只是 `r`。所以,这就是我们如何初始化和声明变量,以及我们如何执行程序。让我们快速看看输出。所以,我正在运行它,它正在询问第一个输入,即行数。我在这里给出的行数是两个。然后我按回车键,它会询问列数。所以,然后是三个。我在这里输入它,它给出两行三列。另外,如果你愿意,你也可以把它安排成一个矩阵。所以,一个接一个,但在这里我只是为你们展示,这样你们就可以看到,你可以数,你有三列和两行。对吧?括号在这里定义了行。第一组括号是第一行,第二组括号是第二行。所以,这就是 Python 中的二维数组的工作方式。现在,我们正在转向 Python 中数组的第三个问题陈述。它说“在整数数组中实现搜索、排序和删除操作”。对吧?所以,我将这三个操作,搜索、排序和删除,分解成三个不同的程序,以便更简单,而不是将所有内容合并到一个巨大的程序中。所以,首先,我专注于删除 Python 中整数数组中的元素。所以,让我们快速进入 IDE 并查看程序。Google Collab 已准备就绪,页面为空。我只是粘贴这段代码来高效利用我们的时间。现在解释这段代码,第一行说“请输入数组的大小”。对吧?我们首先获取数组大小。例如,它可以是 10、5 或 8,取决于用户输入的内容。然后我们向数组中插入那么多元素。比如说,大小是五。所以,我们插入了五个不同的元素,我们现在已经看到了。接下来,它询问要删除哪个元素,对吧?所以,我们指定一个要删除的整数元素,然后它会为你显示新数组。for 循环用于保持数组的顺序。无论是打印还是从用户那里获取输入,我们都同时使用 for 循环。`append` 用于将元素添加到数组的末尾。对吧?我们不是在中间或前面随机插入元素。插入应该一个接一个地顺序发生。要追加或插入元素,我们使用 `arr.append`。所以,让我们快速看看输出是什么。如果你输入一个不存在于这个特定数组中的元素,它会告诉你“元素在数组中不存在”。这就是程序的工作方式。所以,让我们快速看看输出。所以,它正在询问数组大小。我输入三并按回车键。然后输入所有我想输入的三个数字。好的?现在,它会问你想要删除哪个值。对吧?我输入值五。所以,新数组是没有五的,这意味着它是四和六。所以,这就是它的工作方式。并且,我将立即向你展示,如果你输入一个超出数组边界的元素会发生什么,它将如何给你一个错误。所以,我再次输入三个元素。5、7 和 8。对吧?所以,它会问你想要删除哪个值。我将输入一个。一不在数组中。它只有 5、7 和 8。对吧?所以,如果你这样做,它会说“元素在数组中不存在”。所以,这就是 Python 数组中删除的工作方式。既然我们知道如何从数组中删除元素,接下来我们需要看看如何在 Python 数组中对元素进行排序。所以,让我们快速进入 IDE,看看如何在数组中对元素进行排序。好的。所以,这里我们将开始编码,只是把代码放在这里。数组已经定义了。元素是 10、22、38、27、11 等等。所以,我们有五个元素要按升序排序。你也可以按降序排序。我向你展示如何按升序排序。所以,这里发生了什么?我只是添加了一个注释,以便更好地理解。显示原始数组的元素。原始数组意味着这里显示的内容首先显示。接下来,它正在使用 for 循环进行排序。所以,它将检查每个元素,并尝试将其与下一个元素进行比较。如果它更大,它将把那个元素推到后面,而较小的元素将来到前面。所以,这种交换会发生,它将按升序对数组进行排序。所以,升序意味着从最小的数字到最大的数字。所以,它将快速显示排序后的数组元素按升序排列是这样的。所以,让我们快速看看这个特定代码的输出。对吧?所以,我们有原始数组,即 10、22、38、27、11,然后我们有排序后的数组,按升序排列。它是 10、11、22、27、38。所以,这就是它的排序方式。主要函数,其中排序发生,是在这些特定的代码行中,我正在 IDE 中突出显示。它将比较数组中的每个元素与下一个元素。如果它更大,它将将其推到后面。如果它小于比较的数组元素,它将将其推到前面。所以,这个操作发生在这些代码行中。你也可以直接使用 `sort` 函数进行排序。所以,这是一个简单的例子,展示了 Python 中排序是如何工作的。现在,让我们看看你如何在数组中搜索一个元素。这里我也将展示如何找到一个元素的出现次数。所以,让我们快速搜索并检查 Python IDE 中的数组元素。好的。所以,这是搜索元素并找到其出现次数的代码。对吧?所以,这里是数组集。我给出的数字是 1、2、3、1、2、5。你可以看到 1 和 2 重复了。这两个整数是重复的。所以,首先它显示创建的数组。无论用户提供的数组是什么,都会首先显示。接下来,它正在尝试查找元素的出现次数。所以,借助索引,对吧?所以,对于元素 2,数字 2,它显示它在哪里以及多少次,对吧?所以,首先它会显示它在哪里,第二次不会被计算,第一次出现会被计算。所以,让我们快速看看这个特定代码的输出。对吧?所以,这里新创建的数组是用户提供的任何数组,显示在第一行。在第二行,它说 2 的第一次出现是在位置 1。为什么?因为它是 0、1、2、3、4、5。对吧?所以,2 第一次出现是在数组的索引值为 1。对吧?再次,接下来它在搜索 1。数组中 1 的第一次出现是在哪里?它在索引点 0,对吧?所以,它显示输出 0。再次,这里有一个 1。那是 0、1、2、3。你也有第二个 2 在第四个位置。但仍然,无论它在哪里,第一次出现的是在这个程序中显示的。对吧?所以,这就是出现次数的计算方式以及 Python 中元素的搜索方式。>> 现在,让我们谈谈数组的优点。显然,当你有一个与数组相关的索引时,对吧?我们有索引。所以,很容易通过这个索引访问任何元素。如果你想访问第三个元素,你只需说 `r[2]`,在一维数组中,对吧?所以,你可以直接使用索引访问元素。同样,遍历它也很容易。对吧?借助一个 for 循环,我们可以一个接一个地遍历数组中的所有元素。同样,如果你想排序,我们可以轻松地一个一个地遍历这些元素。如果我们试图在数组中搜索一个元素,比如说,我们正在搜索 3,那么一个接一个地,我们会检查,这个元素是 3 吗?这个元素是 3 吗?这个元素是 3 吗?这个元素是 V 吗?这个元素是 V 吗?对吧?如果这个元素是 3,我们可以轻松搜索。同样,对于排序,对吧?比如说,我们想对这个数组进行排序。它会是什么?它将简单地是,如果你有 4 在这里,3 在这里,2 在这里,1 在这里。比如说,这里有 0。好的?所以,现在你想按升序对这个进行排序。所以,你会怎么做?我们将使用两个循环。一个将关注第一个元素,然后第二个,第二个将比较所有元素。好的?然后在这个过程结束时,你将在数组的末尾得到最大的元素。所以,排序、迭代、搜索,在数组中很容易,你只需要一个接一个地遍历所有元素。现在,它是多个变量的替代品。现在,这是什么意思?让

假设你有一个整数,或者说你想存储 10 个学生的学号,对吧?那么在你了解数组之前,你会怎么做呢?你会说学号一,或者你可以说 S1、S2、S3、S4,然后逐个将学号存储在这些整数变量中,对吧?但是,一旦学生数量增加,现在假设我们这里说的是 10 个学生。但如果我们谈论的是 100 个呢?现在如果我们谈论的是 500 个呢?你打算写 500 个整数变量,从 S1 到 S500 吗?不。那是一种非常低效的做法,对吧?所以,你可以做的是创建一个数组。你可以创建一个整数数组,并将其命名为 student,在那里你将拥有大小,这显然代表了学生数量,在这种情况下将是 500。现在如果你想改变它,如果明天你想把它改成 600,你可以继续轻松地把它改成 600。对吧?所以它是多个变量的替代品。这就是它的意思。现在让我们清屏,然后我们来谈谈缺点。一个很容易注意到的缺点是大小。现在显然当你谈论一维数组或任何数组时,大小是固定的。所以你不能超过这个大小。元素不能超出这个限制。所以假设你的大小是五。你只能存储五个元素。你不能超过那个或超出那个。现在如果你有一个大小为 100 的数组,而你只尝试存储两个元素,那么所有 100 个元素的内存分配仍然会为这个数组存在。这意味着你在浪费内存。你没有有效地使用它。好的,所以这就是它的意思,大小是固定的,你不能存储更多元素,如果容量大于占用空间,大部分数组都会被浪费。好的,所以这是两件事。除此之外,你需要连续的内存分配。这意味着如果内存块在这里和那里可用,你就不能那样存储数组。或者假设这里你有 16 字节,这里你有 16 字节。如果你有一个 16 字节的数组,那没问题。但如果你有一个大小为四的数组,该数组可以存储在这里。但如果你有一个大小为 8 的数组,你不能把四个元素放在这里,四个元素放在那里。那行不通。好的,那不可能发生,因为它需要连续的内存分配。所以这是另一个缺点。最后但同样重要的是,插入和删除很困难。现在,为什么我们这么说呢?假设你有一个数组,在这个数组中有 1 2 3 4。现在,假设你想在这个位置插入一个值零。你需要做什么?你插入零,然后所有其他元素都必须被移位。所以,需要交换,对吧?需要交换。此外,应该有可用的内存,以便你可以存储该元素。否则,如果只有四个元素,而你现在想存储零,并且大小也是四个。那会发生什么?你会存储一个,其余元素将被交换,你最终会丢失这个值。所以,插入值非常困难。删除时也会发生同样的事情。但那时,你不会丢失数据。但是的,仍然需要交换,对吧?所以,假设你想删除这个位置或删除这个数字。你会怎么做?你会用三覆盖它。你会用四覆盖它。假设有一个六,你会用六覆盖它。所以最后你会得到 1 3 4 6,对吧?1 3 4 6,并且会留下一个内存位置,它将包含与六相同的元素。所以下次你会覆盖它。所以再次需要交换。这就是为什么在数组中插入和删除元素非常困难。

>> 现在让我们看看栈的概念。现在来谈谈栈。栈是一种线性数据结构,它遵循后进先出(LIFO)的顺序。这意味着最后插入的元素将首先被移除。这就是 LIFO 顺序。后进先出。现在元素的插入和移除是在一端进行的。我将向你解释如何做到这一点。所以让我们看一个栈的例子。所以这里如果我有 23 45 67 89 11,假设我有 50。这些是需要插入栈的元素。所以现在我将要做的是,假设这是我的空栈,我将逐个将这些元素插入栈中。所以首先我将插入 23。在 23 之后,我将插入 45。然后我将插入 67。在 67 之后是 89。然后是 11。最后是 15。所以这就是我的栈。现在正如我告诉你的,最后插入的元素将首先被移除。这意味着后进先出或 LIFO 顺序。所以正如你在这里看到的,15 是最后插入的元素。所以现在如果你想移除一个元素,15 将是第一个被移除的。所以对于插入,我们使用 push。所以 push 用于插入元素,而 pop 用于从栈中移除元素。所以 15 是最后插入的元素。现在我将使用 pop 来移除这个 15。一旦 15 被移除,我将拥有元素 23、45、67、89 和 11。对吧?所以如果我想移除另一个元素,那么我的 11 将被移除。所以再次我将在这里写 pop。始终记住 push 操作用于插入,pop 操作用于移除。所以对于我在这里插入的所有元素 23 45 67 89 11 15,我使用了 push 操作。所以如果我写 push 23,那么 23 就被插入了。之后,如果我写 push 45,那么 45 就被插入了,之后,如果我写 push 67,那么 67 就被插入了。这样我就可以使用 push 函数来插入元素。现在正如我在这里提到的,元素的插入和移除是在一端进行的。为什么是这样?如果你看这是我的栈。所以这是我的栈。无论我将什么元素插入空栈,我都是通过一端插入的,并且我使用 push 操作执行插入。现在如果我执行 pop 操作,我也通过一端执行 pop 操作。这就是为什么你可以看到这里写着元素的插入和移除是在一端进行的。所以这就是栈的基本概念。现在让我们看一个栈的例子。正如你在这里看到的,这是我的硬币堆。所以这可以被认为是一个栈的例子。为什么?因为最后一枚硬币先被移除。所以它遵循后进先出原则。所以我会一次移除一枚硬币。所以如果我一步一步地移除它们,这意味着最后一枚硬币将首先被移除。这样,如果我继续下去,你可以看到我可以一次又一次地移除一枚硬币。这样它就作为一个栈的例子。类似地,DVD 也适用同样的例子。如果我一次又一次地移除一张 DVD,那么这也可以被认为是一个栈的例子。所以最后插入的 DVD 将首先被移除。书也是如此。顶部的书将首先被移除。之后,如果我从顶部逐一查看,你可以看到最后放的书将首先被移除。这样,这可以是一个栈的例子。所以这就是栈的一个基本例子。现在让我们看看与栈相关的一些函数。所以我们有 push 函数。正如我提到的,如果我在这里写 push 23,并假设这是我的栈。所以这是一个空栈。所以它会在这里插入 23。所以正如你在这里看到的,它用于在栈的末尾插入元素 x。所以这里代替 x,如果我写 23,那么它将插入 23。类似地,pop 函数正如我告诉你的,pop 将从栈中移除元素。所以它用于移除栈顶或最后一个元素。所以如果栈中只有一个元素 23,我写 pop,那么它将移除 23。而且请记住,它将移除栈顶或最后一个元素。我们只有一个元素。所以这将是最后一个元素。所以如果我写 pop,那么 23 将被移除。但如果我在这里写 hush,比如说 25,那么 25 将被插入这里。一旦我再次写 pop,那么这将是最后一个元素。所以 25 将被移除。所以这就是 push 和 pop 函数的基本思想。现在让我们谈谈大小。所以 size 函数将给我大小,或者你可以说栈的长度。接下来是 top。所以它将给出栈中最后一个元素的引用。所以让我们说这是我的栈,我有 23 25,比如说 27。所以这是我这里的最后一个元素。所以 top 函数将给我这个最后一个元素的引用。现在让我们谈谈 empty 函数。所以 empty 函数对于空栈返回 true。所以如果这是一个栈,并且这个栈是空的,那么 empty 函数将返回 true。对吧?所以这就是栈中函数的基本思想。以及每个函数的时间复杂度是多少?每个函数的时间复杂度将是 push、pop、size、top 和 empty 的 O(1)。所以对于每个函数,时间复杂度将是 O(1)。所以这就是函数的基本思想。现在让我们看看栈的实现。在 Python 中有几种实现栈的方法。我们可以使用列表。我们可以使用 collections 模块,在那里我们可以使用 deque 类,我们也可以通过 queue 模块来实现它。所以这些是在 Python 中实现栈的一些方法。现在让我们看看使用列表的实现。当使用列表实现时,Python 中的列表可以用作栈。所以我们可以在 Python 中使用列表作为栈。在 Python 中,我们有 append 和 pop 函数。我们没有 push 函数。所以如果你想插入一个元素,你需要一个函数,对吧?所以我们可以使用 append 函数,它用于插入元素。现在说到 pop 函数。是的,我们在 Python 中有一个 pop 函数。pop 函数以 LIFO 的顺序移除元素。这意味着后进先出。正如我们所知,我们的栈也遵循 LIFO 顺序。最后插入的元素将首先被移除。所以这是我们将在这里与列表一起使用的两个函数。现在让我们看看这里的逻辑。正如我告诉你的,Python 中的列表可以用作栈,对吧?所以这里我使用列表作为栈。所以这是我的 stack 变量,它是一个空列表。现在正如我告诉你的,如果你想插入一个元素,你可以使用 append。所以这是我的空列表,也就是栈。正如我们所知,在 Python 中,列表用方括号表示。现在我将写 stack.append。在这个 append 中,如果我写 x,那么 x 将被插入到我的列表中。现在说到 pop 函数,如果我在这里写 stack.pop,并且我使用 print 并将其放在里面,那么无论我有什么元素,它都会移除它。所以让我们假设这是我的栈,如果它里面有元素 x,那么如果我写 stack.pop,它将移除这个 x 元素,因为我只有一个元素,最后一个元素将从栈中移除。所以这就是使用列表实现栈的基本思想。现在让我们看一个实际的例子。所以现在对于实际实现,我将使用 Jupyter notebook。所以我将在这里点击 new,然后我将选择 Python 3。如果我在这里写,我将命名它为 stack,让我先添加一个注释。我将在这里写一个井号,然后写使用列表的实现。所以我告诉过你,栈可以使用列表来实现。所以我将创建一个名为 stack 的变量,它将是一个列表,一个空列表。之后,我将在这里写 stack.append,并且在这个里面,如果我写 welcome,然后再次写 stack.append,现在我将写 two。再次,我将写 stack.append,我将写 great learning。所以你可以看到这是我的 append。现在如果我打印我的 stack,所以我将点击运行按钮。你可以看到这是我的列表。之前我的列表是空的,但现在通过 append 函数,我已经插入了 welcome to great learning。所以现在这是我的列表。现在我在这里要做的是,从这个栈中移除一个元素。为此,我将使用 pop 函数。所以我将在这里写 stack.pop,并将这个 stack.pop 放在 print 函数中。所以我将写 print,现在让我执行它。所以当我执行它时,你可以看到我得到了 great learning。所以这意味着最后插入的元素是第一个被移除的,对吧?正如我告诉你的,pop 总是遵循 LIFO 顺序。后进先出。所以如果我打印我的 stack,你可以看到我只得到 welcome to,因为 great learning 已经被 pop 函数移除了。如果我再次在这里写,让我复制并粘贴这个。Ctrl + Crl + D。所以再次,我在这里执行 stack.pop。如果我打印 stack,你可以看到我只会得到 welcome。所以你可以看到我得到了 welcome,而在这里,如果我执行 stack.pop,那么 two 就被移除了,对吧?所以我们可以清楚地看到,我们可以使用列表和 append 和 pop 函数来实现栈。所以这就是使用列表实现栈的基本思想。

所以另一种实现栈的方法是使用 deque。所以我们将看看如何使用 collections 来实现它。这里的栈在 Python 中是使用 collections 模块创建的,该模块提供了 deque 类。所以现在让我们理解一下,这是 Python 中的 collections 模块,我将写 from collections,从 collections 模块中,我将导入 deque 类,对吧?我将写 from collections,然后在这里我将写 import deque。deque 在这里代表双端队列。append 和 pop 操作比列表更快,为什么呢?因为 deque 的时间复杂度是 O(1),而列表的时间复杂度是 O(n)。此外,使用列表,如果你不断插入更多元素,列表会增长,最终会耗尽一块内存。所以,Python 必须分配更多内存。这就是为什么当你向列表中插入更多元素时,它会变慢。这就是为什么我们使用另一种方法。从 collections 模块中,我们导入 deque,然后我创建我的 stack 变量并将其赋值给一个 deque。好的。现在,我将执行与列表相同的操作。我将在这里使用 append 和 pop。所以始终记住,deque 比列表更受欢迎,因为 append 和 pop 操作在这里更快,而其他一切都一样。所以让我运行它。现在让我们看看使用 deque 的实现。让我添加一个注释。我将在这里写使用 deque 的实现。现在正如我提到的,如果我想实现一个 deque,它是一个类,对吧?所以我必须从 collections 模块中导入它。所以为此,我在这里写 from collections import deque,然后我将创建一个 stack 变量并将其赋值给它。现在在这之后,我将写 stack.append,让我使用值 x。如果我打印我的 stack,所以当我运行时,你可以看到我的 deque 包含 x。现在让我添加更多值。所以我将在这里写 stack.append y,然后我将写 stack.append,比如说 z。再次,如果我运行它,我将写 print stack。当我执行它时,你可以看到我得到了 xyz。现在,让我们执行 pop 操作。所以,我将写 stack.pop。让我把它放在 print 函数中。正如我们所知,如果我在这里写 stack.pop,最后插入的元素将首先被移除。所以,这里将移除 v。所以,你可以看到 z 被移除了。现在,如果我打印我的 stat,我只得到 x 和 y。所以你可以看到列表和 deque 是一样的。唯一的区别是 deque 更快,因为 deque 中的 append 和 pop 操作更快。所以这就是使用 deque 实现栈的基本思想。现在让我们看看使用 queue 的栈实现。所以在这里使用 queue 的实现中,queue 模块包含 lifo queue,意思是后进先出。所以基本上这里发生的是,它与栈的工作方式相同,但它有一些额外的函数。所以它有一些额外的函数,并且与栈的工作方式相同。对吧?现在我们已经看到,在列表和 deque 中,我们都使用了 pop 和 append 操作。对吧?但在这里插入元素,我们将使用 put 操作。所以如果我在这里 put 三,这意味着它将把三插入到我的栈中。类似地,如果我在这里使用 get 函数,它将移除一个元素。正如我告诉你的,它的工作方式与栈相同。所以最后插入的元素将首先被移除。现在我们有一些在 queue 模块中可用的函数。第一个函数是 get。正如我之前告诉你的,get 函数用于移除一个元素。接下来是 max size。Max size 是队列中存在的最大元素数量。接下来是 empty 函数。如果一个队列是空的,它将返回 true,否则它将返回 false。接下来是 full。当队列已满时,它将返回 true。类似地,put。我已经讨论过 put。如果你正在插入任何元素,你可以使用 put。假设我正在插入两个。它将把两个插入到队列中。现在 queue size 将给我队列的大小。假设你有三个插入到队列中的元素。3 2 4。那么队列的大小是多少?队列大小将是三。现在来谈谈逻辑。那么我如何使用 queue 模块导入一个 LIFO Queue 呢?所以我会在这里写 from queue,然后我会在这里写 import,然后我会写 LIFO,然后我会写 Queue。之后,正如我告诉你的,栈可以使用 queue 模块来实现。所以我将在这里创建一个 stack 变量并将其赋值给 LIFOQ。所以我写 lifoq。现在如果我写 stack.put 并写 two,这意味着我正在将值 two 插入到栈中。类似地,如果我在这里写 stack.get,这意味着我正在从栈中移除值。所以这就是基本思想。现在我们将看到所有这些函数在实际的编码示例中。所以让我们开始编码部分。我将在这里写一个注释,在这个注释中我将写使用 queue 的实现。现在在这之后,我必须做的是从 queue 模块导入 LIFOQ。所以我会在这里写 from queue import LIFOQ,然后我将创建一个名为 stack 的变量,然后我将写 lifoq。所以创建 stack 变量后,正如我告诉你的,如果我想将一个元素插入队列,那么我必须使用 put 函数,对吧?所以我将在这里写 stack.put。然后,比如说我插入 two。所以你可以看到我已经插入了元素 two。现在让我插入更多元素。我将写 stack.put 并在这里插入 three。然后我将写 stack.put 开放括号关闭括号。所以这就是 put 函数的全部内容,对吧?所以我们已经看到了 queue 中的几个函数。所以让我写函数。所以在这里我将写 print,如果我写 stack.qsize,正如我告诉你的,qsize 将给你队列中存在的元素数量。我已经插入了三个元素。所以队列大小应该是三。当我运行时,你可以看到我得到了队列大小是三。我还告诉你关于 max size 函数,对吧?为了澄清,max size 函数用于设置一个限制,即数据结构可以存储多少元素。所以这里如果我写 max size = 3,这意味着数据结构最多只能容纳三个元素,如果你尝试添加更多,它将不允许。如果我再次在这里写 print 语句,如果我写 out stack.full,就像我之前做的那样,那么正如我告诉你的,full 函数将在我的栈已满时返回 true。这里我设置了 max size 为三,并且我插入了三个元素,这意味着我的栈已满。所以当我运行时,你可以看到我得到了 true,对吧?因为我的栈已满。现在如果我想从栈中移除一个元素,我可以使用哪个函数?我可以使用 stack.get。现在如果我再次打印 stack.full,我会得到 true 值吗?不,因为我移除了一个元素。所以如果我运行它,你可以看到我得到了 false 值,当它执行时。所以这里你可以看到我们使用了 put 函数、get 函数、full 函数、qsize 函数和 max size。所以这就是使用 queue 实现栈的基本思想。

现在让我们来理解 queue 线性数据结构。什么是 queue?Queue 是一种线性数据结构。这意味着队列中的所有元素或项都以线性方式存储,一个接一个地排成一条直线。现在,它遵循所谓的 FIFO 原则,即 first in first out。这意味着有一个规则,无论什么项先进入队列,它就是第一个出来的或从队列中移除的。好的,让我们尝试想象一下现实生活中的队列。例如,想象一下你排队等候购买电影票。前面有一个人,然后是他们后面一个人,然后是再后面一个人。对吧?所以,你可以在这里看到有几个人都在排队,一个接一个,就像队列中的元素一样。你在排队。所以,现在队列中的第一个人将是第一个拿到票的人,对吧?有道理,对吧?所以,他将是第一个拿到电影票并离开队列的人。然后队列中的下一个人将是下一个拿到票的人,对吧?假设有一个新的人加入了队伍。他不会插队到这个人前面。相反,他将在这个人后面排队。当下一个人来时,他们将在这个人后面排队,以此类推。所以,这基本上就是人们的原则。好的?第一个进来的是第一个出去的。好的?现在,插入总是发生在队尾。好的?如果你谈论删除,它总是发生在队头。好的?所以,这是我们的队头,这是我们的队尾。很酷。例如,在柜台买票。可以是电影票,也可以是在公交车站。你在公交车站试图买公交车票,对吧?这些是一些例子。现在,关于队列有四个主要操作。这些主要操作是什么?让我清屏。所以,Enqueue。所以,你将向队列中插入一个元素。这就是 Enqueue 的意思。Dequeue 意味着你将从队列中移除一个元素,然后 Peek First。你将查看队列中的第一个元素。Peek Last 意味着你将查看队列中的最后一个元素。所以你将有两个指针。一个是 front,另一个是 rear。借助这些指针,你将执行 Enqueue、Dequeue、Peek First 和 Peek Last 操作。现在,这些操作,这四个操作的一个主要优点是,它们都以恒定的时间执行。这意味着执行这些操作的时间复杂度是 O(1)。这就是为什么当你谈论竞争性编程时,队列是最常用的数据结构,因为这些原因,对吧?因为它的时间复杂度,你能够以恒定的时间执行你的操作。现在让我们谈谈队列的应用。所以它用于操作系统中的调度算法,如先来先服务调度算法、轮转调度和多级队列。在所有这些算法中,队列都用于存储数据或进程。它还用于维护播放列表,比如当你有一个播放列表时,假设你有一个包含 10 首歌曲的队列,对吧?在一首歌曲之后,队列中的下一首歌曲将被播放,以此类推。所以对于维护播放列表,再次使用队列。它也用于中断处理。让我给你一个例子。你知道操作系统的进程状态图。所以它也在那个时候使用。所以当你有一个中断,并且你的进程正在执行,那么该进程将被推出并存储在队列中。下次处理这个优先级或这个中断时,一旦完成,它将开始选择队列中的进程并开始执行它。同时,如果还有其他进程,那些进程也将进入队列。所以,会维护一个队列,一旦中断被处理,它们将开始取出之前正在执行的进程,执行它,完成它的执行并终止该进程。所以,它也用于中断处理。

>> 在理论上学习了 Python 中的队列是什么之后,让我们看看如何实际实现它。所以,一个队列将有两个基本操作。那就是 Enqueue 和 Dequeue。这些将通过一个简单的 Python 示例来演示。所以让我们快速跳转到 Python IDE,也就是 Google Collab。我使用它的原因是它对每个人都可用,因为它是在线提供的,而且它是开源的。所以让我们快速开始一个简单的队列程序,展示两个不同的函数 Enqueue 和 Dequeue。所以这里是 Google Collab 环境,你将在其中工作。所以在这个特定的代码中,我们正在创建一个名为 Queue 的类,对吧?我们还提供了 Enqueue 和 Dequeue 的不同函数。Enqueue 简单地意味着进入或将值插入队列,而 Dequeue 意味着从队列中删除值,对吧?正如你们所知,队列遵循 FIFO,即 first in first out。所以例如,当你想要在火车站或任何地方买票时,你都会排队,对吧?谁先排队谁就先拿到票然后离开队列。这里也是一样,只是元素不是人。它们都是整数。所以,你先放进去的数字就是第一个出来的数字。对吧?现在,让我们快速看一下。我们有两个不同的函数,正如我提到的,Enqueue 和 Dequeue,稍后你将看到显示。我们看到三个不同的函数,display、Enqueue 和 Dequeue。所以,这里发生的是我们正在使用 self.q.append。所以无论你提供什么项目或数字,它都会被插入到队列的末尾。它维护着插入数字、整数或你给的值的顺序过程,以便将它们插入队列。删除时,你可以使用 pop,对吧?所以插入使用 append,删除使用 pop。而 display 只是一个普通的 print 语句。它会相应地显示当前队列中的内容。所以让我们快速运行这个程序。我只用了一些数字 1 2 3 4 5。总共五个数字,在 Dequeue 之后,它应该显示什么?它应该先移除 1,然后显示 2 3 4 5。所以让我们快速看看它是如何工作的。好的,所以正如你所看到的,给定的队列首先被打印出来,即 1 2 3 4 5,然后在移除第一个元素之后,对吧?所以第一个人将被移除,因为它是 FIFO,所以剩下 2 3 4 5。这就是一个简单的基本队列在 Python 中的工作方式。在理解了基本队列实现之后。让我们看看一种队列,即循环队列实现。有许多类型的队列,但我选择循环队列作为例子,并向你展示从队列中插入和删除元素的相同操作。所以,让我们快速进入 Google Collab IDE,看看这个程序。如何在 Python 中构建循环队列?这是循环队列的程序,让我告诉你这个程序中的不同元素。第一部分是类声明。所以这里我的循环队列是类,对吧?类可以随意命名。所以保持它非常面向程序,而不是离题的东西。所以这里是我的循环队列。然后我们又有两个不同的初始化。一个用于 Enqueue,一个用于 Dequeue。所以无论我们在这里使用什么元素,无论我们尝试将什么项目插入队列,我们都必须确保队列是否已满或为空,以及是否还有空间。所以所有这些条件都应该被检查。所以让我们进入 Enqueue 并查看你必须验证的不同条件。所以第一件事是检查队列是否已满。所以,在插入某些东西之前,例如,如果队列大小是五,而你试图插入第六个元素,那么它应该显示一个错误消息,即只有五个空间。你正在插入第六个元素。这是不允许的。所以队列已满。因此,为了显示这一点,我们使用语句“循环队列已满”。接下来你需要知道的是如何判断它何时为空,对吧?对于 Dequeue,主要条件是,每当队列中的所有元素都被移除时,它都应该被声明为空。队列为空,所以没有东西可以删除。所有元素或项目都已移除。所以给用户的错误消息或语句将是“循环队列为空,没有东西可以弹出、删除、移除或 Dequeue”。除此之外,如果你尝试打印一些东西而队列为空,因为它没有任何元素,你应该显示语句“循环队列中没有元素”。为什么?因为如果没有元素,就没有什么可以显示或展示的。display 函数不起作用。没有任何东西被打印出来。所以这就是这个特定代码背后的基本思想。相应地,我们使用了迭代和声明。接下来,你需要查看我们提供的输入。我正在尝试输入 12 22 31 44 和 57。对吧?所以五个元素被给了队列,你需要做的是首先检查初始值。你必须显示初始值,向用户展示你给出的确切队列及其元素,然后显示哪个元素被删除。所以显然第一个元素被删除。但是的,循环队列与基本队列有什么不同,对吧?所以让我们快速运行程序以查看输出。好的,如果你看这里的输出,对吧?初始队列值正是我们输入的 12、22、31、44 和 57。所以移除一个元素后,显然是第一个元素,并且根据流程,第一个元素将被移除。所以现在是 22、31、44 和 57。普通队列和循环队列有什么区别?如果你看这里,对吧?在 57 之后,末尾有一个分配的空间。在普通队列中,它没有连接。在这里,front 和 rear 连接形成一个圆。对吧?如果第一个元素,例如 12 出去了,那么 22 将移动到第一个位置,然后是 31,然后是 44,然后是 57。最后一个位置将是空的,对吧?所以,它是以圆形运动进行的。所以,无论你想再次插入什么,对吧?所以,例如,如果你想插入六,对吧?六将占据第五个位置,就在 57 之后,对吧?这就是它如何以圆形运动连接起来,意味着 front 将连接到 rear。所以这就是普通基本队列和循环队列的区别。

>> 现在让我们谈谈队列的优点和缺点。首先让我们讨论优点。它遵循 FIFO 原则,即先来先服务,这意味着元素以 FIFO 的方式存储。这意味着,假设这是一个队列,并且其中有元素。删除将从前面发生,对吧?插入将从后面发生。所以这被称为 Dequeue(删除)和 Enqueue(插入)操作。而且这两个操作都以恒定的时间执行。所以这绝对是一个优点,对吧?并且在开头插入和在结尾删除也需要恒定的时间。此外,如果我们想进行 Peek First 或 Peek Last,所有这些操作都可以以恒定的时间执行。而且这是我们谈论 CP(竞争性编程)时最广泛使用的数据结构。当我们谈论竞争性编程时,这种数据结构是最常用的,因为这些特性。所有执行的操作,如插入、删除、Peek First、Peek Last、Enqueue 和 Dequeue,都以恒定的时间完成。现在,让我们谈谈缺点。由于我们只能从前面和后面删除或插入,这意味着从前面删除和从后面插入。对插入或任何操作都有限制,对吧?我们对这些操作的插入和删除有限制。所以这个限制总是存在的,并且结构的状态(即队列)不是非常灵活。我们受到限制。我们只能以固定的模式或 FIFO 的方式删除和插入元素,因为它不是很灵活。

>> 所以现在让我们开始链表。链表是一组节点的集合。那么节点是什么呢?所以你可以在这里看到这是一个节点。节点将同时包含数据和一个引用。所以每个节点都包含数据和一个引用,该引用保存下一个节点的地址。所以这是一个节点,正如我告诉你的,一个节点将同时包含数据和一个引用。所以假设我在这里插入数据 20,这只不过是一个引用,或者你可以说是一个指针。所以这个指针将包含下一个节点的地址。对吧?所以正如我告诉你的,链表是节点的集合。所以这是一个单独的节点。所以假设我有多个节点,如果我将它们连接起来,它就会形成一个链表。所以我们将在下一张幻灯片中查看链表的表示。现在链表是一种线性数据结构。现在说到最后一点,我们知道在数组和列表中,元素都存储在连续的内存中。而在链表中,元素是随机存储的。现在让我们看看链表的表示。所以正如我告诉你的,链表是节点的集合。所以假设这是我的 n1 节点。这是我的 n2 节点,这是我的 n3 节点。所以每个节点都将包含数据以及一个引用,或者你可以说是一个指针。所以这是数据,这是引用。现在我将给出这个 n1 节点的地址。所以,让我把这个 n1 节点的地址写成 2010。我将给这个地址 2020,我将给 n3 节点地址 2030。所以这些是地址。正如我告诉你的,每个节点都将包含数据。所以,让我分配一些数据。假设这里是 10,然后是一个引用,或者你可以说是一个指针。所以我告诉你关于指针,指针将包含下一个节点的地址。所以下一个节点的地址是什么?下一个节点的地址是 2020。所以我将在这里写 2020。所以这个指针或这个引用,或者你可以称之为这个链接,将包含我下一个节点的地址,而我下一个节点的地址是 2020。现在再次,这将是数据,这将是我的 n2 节点的引用。所以,让我在这里分配数据为 20,引用会是什么?引用将包含下一个节点的地址。所以这里将是 2030。现在再次,这个 n3 也将包含数据。所以,我将在这里分配 30。所以现在你可能会想,这里的引用应该是什么?所以现在你看到这个 n3 节点之后还有其他节点吗?我们有 n4 n5 g 吗?不。所以这个引用将被设置为 null。所以我可以写五,因为没有下一个节点存在。对吧?现在说到 head。什么是 head?所以 head 将包含我 n1 节点的地址。也就是说 2010。对吧?所以这是我的链表表示。现在问题来了,为什么是链表?所以我们为什么需要链表?因为与列表相比,链表在执行操作方面更有效。所以我们可以在链表中执行哪些操作?我们可以执行插入、删除以及遍历等操作。所以它在执行这些操作时更有效。说到下一条,正如我之前提到的,在链表中,元素是随机存储的。而在列表或你可以说的数组中,元素存储在连续的内存中。现在,继续,访问链表中的元素比列表慢。所以,如果你想访问链表中的一个元素,它会比列表慢。为什么?我现在告诉你原因。让我们看看这张显示链表表示的幻灯片。所以,这里是我的入口节点,对吧?如果我想访问这个入口节点的数据元素,我必须经过 n1、n2 和 n3。只有这样我才能访问元素。而在列表的情况下,我们可以使用索引来访问元素。但在链表中,那是不可能的。所以你必须遍历。换句话说,这里的遍历意味着你必须经过每个节点。所以如果你想访问 N3 的元素,你必须从 N1 开始,然后去 N2,只有这样你才能到达 N3。这就是为什么访问链表中的元素比列表慢。现在说到最后一点,在链表中,内存利用率将比列表高。所以让我们开始单向链表。我已经向你展示了链表的表示,它与单向链表相同。所以在一个单向链表中,每个节点都包含数据和一个引用。所以假设这是我的 N1 节点。这是我的 N2 节点,这是我的 N3 节点。所以正如我告诉你的,每个节点都将同时包含数据和一个引用。所以我将把数据放在这里是 10,节点 2 是 20,这里是 30。并且每个节点都有一个地址。所以,比如说这个 N1 节点的地址是 1000。这个是 1100,这个是 1200。所以这个引用,或者你可以说这个链接或指针,将包含下一个节点的地址。所以这将包含 1100。类似地,这个引用或链接将包含 N3 节点的地址。所以我将写 1 1200。在这里。而在这里,在 N3 节点之后,你看到还有其他节点吗?我们没有更多节点了。所以这里的链接或引用将是 null。现在说到这个,这里的 head 是什么?所以 head 将包含我第一个节点 1000 的地址。所以在一个单向链表中,遍历只在一个方向上进行。所以你说的遍历是什么意思?遍历意味着你逐个经过每个节点。所以,比如说你想去 n3 节点。你先去 n1,然后去 n2,只有这样你才能到达 n3。你不能直接跳到 n3。你必须经过 n1 和 n2,只有这样你才能到达 n3。现在让我们看看单向链表中的一些操作。所以链表中存在几种操作。我们有插入、删除和遍历。插入和删除可以在开头、任何指定节点或结尾进行。现在说到遍历,正如我之前告诉你的,遍历意味着你必须经过每个节点。所以遍历链表的每个节点称为遍历。现在让我们看看单向链表的伪代码。所以如果你想在单向链表中创建一个节点,代码应该是什么样的?所以首先我将在这里写 class node。所以这里我创建了一个名为 node 的类。这个 node 类也将有一个对象,对吧?我稍后会创建对象,但现在我们先看看。所以假设这是我的 n1 节点。正如我提到的,一个节点将同时包含数据和一个引用,对吧?所以代替引用,我在这里写 next。我使用一个更短的词来简化编码。现在这是我的节点创建。现在我在这里要做的是,在这个 node 类中,正如你所看到的,我正在创建一个 init 方法,或者你可以称之为构造函数。所以要创建它,我首先将写保留字 defaf,然后我将写 init 方法。所以,我将首先写 defaf,然后是双下划线 init,然后再次是双下划线,然后我将写 self 和 then comma data。为什么我写 self?我稍后会解释。我还将 data 作为参数传递。在这个里面,我写了 self.data data = data 和 self.reference = none。为什么我写这个?因为我的节点将同时包含数据和引用。在这个方法中,我将写 self.data = data。对于 self.reference,因为我在这里写了 next,我也会在这里使用 next,它等于 9。所以当你创建一个节点时,比如说这是节点 n1。最初,它将包含一些数据。而且因为我只是在创建节点,我还没有将它链接到任何东西。所以链接,或者你可以说引用将是 none。对吧?所以这是我的初始节点。我在这里写了 self.data = data 和 self.next = none。对吧?现在这是一个类。所以我可以从中创建一个对象。如何创建对象?我将写 one = class name 7,并在类中传递参数 7。现在会发生什么?代替 self,我的对象将被传递在这里。所以我的 n1 将在这里代替 self 被传递。所以现在它将是 n1.data =,我的数据是什么?数据是 7。现在下一步是 self.reference = none。让我们看看这里。self.next。所以代替 self,那里是我的 n1。所以 n1 将在这里被传递。而对于 n1.next,我将得到 none。所以这基本上只是创建我的节点。现在如果你想检查,我们可以使用 print 函数。当你写 print 函数中的 node 1.data 时,你会看到你得到了值 seven。类似地,如果你在 print 方法中写 node 1.reference,你会得到 none。所以现在这就是如何创建节点的基本思想。现在让我们在代码中看看。所以这里我将使用 Jupyter notebooks。所以我将在这里转到 new,然后我将点击 Python 3。你可以在这里看到我得到了名称 untitled 21。让我改变它。我将写 linked list here。linked list,然后我将写 python。现在让我们创建一个节点。所以我将注释为创建节点。首先我将创建一个类,我将命名它为 node,在这个 node 类中,我将创建我的 init 方法。所以这里我将写 defaf,这是一个保留字,然后我将写 init,但在此之前,我将写双下划线。然后我将再次写双下划线,然后我将写 self data here。所以为什么我在这里写 self?所以当我创建一个类对象,比如 n1 时,我已经在这个例子中向你展示了,代替 self,n1 被传递。正如我们所知,我们可以创建类的多个对象。所以如果我在这里写 n2 或 n3,那么代替 self,我也可以传递 n2 或 n3。所以现在让我们创建一个节点。所以我将在这里写 self.data = data。我将在这里写 self.next,并将它设置为 none。所以这就是我创建节点的方式。所以每当我有一个节点时,它将包含数据,并且它将有一个引用。所以最初它没有链接。所以引用是 nine。所以这是我的类。现在我将创建一个 node 对象。所以我将在这里写 n1,我将写类名。我将传递数据,比如说值 8。所以如果我执行这个,当我执行它时,这个 n1 将被赋值给 self,而这个 8 将进入 data。所以我的 n1.data data

等于8,我的n1.next等于None。让我来打印它。所以如果我在这里写print,然后在里面写n1.data,再次使用print函数,然后在里面写n1.next,那么您可以看到我得到的数据是8,而对于next,它是一个引用,我得到None,因为我还没有将这个节点链接到任何其他节点。所以这是如何创建节点的.基本思想。现在让我们看看如何为单链表创建一个类。那么我的单链表什么时候会是空的呢?正如我告诉您的,如果这是一个节点,让我们假设n_sub_1,这是另一个节点n2。所以n1和n2相互连接。所以我们有一个头指针,它总是指向第一个节点。对吗?所以如果没有头,如果头是None,那么我的链表将是空的。所以现在我在这里要做的是创建一个类,我将给这个类命名,比如单链表。在这个类里面,我将再次写init方法。所以在这里我将写defaf double_init double underscore,然后我将在括号里放self。现在在这里我将写self.head等于None。所以这是我创建类的设置。所以如果头指向None,这意味着它不指向任何节点,这表明链表是空的。所以现在让我们看看如何创建一个单链表。是的。所以让我删除这个。现在创建一个类,创建一个链表。为链表单链表创建一个类。在这个类里面,我将编写初始化方法,通常称为init方法。在这个单链表中,我将创建一个init方法。我将写defaf double_init double underscore,然后我将在这里放self。当我的链表为空时,self.ad将等于None。所以这是创建单链表类的简单方法。现在创建类之后,让我们创建这个链表的对象。所以我会写sl作为单链表的对象名。现在我会写类名,即singly。所以大写的ll在那里,对吗?所以执行时,请始终记住,每当您创建对象并执行它时,该类中的init方法将始终运行。我将给您举一个例子。如果在这个init方法中,比如我写print goroff。所以我已经在这里创建了对象SL,现在如果我执行它,您可以看到Gorov在这里被打印出来了,对吗?所以请始终记住,每当我创建类的对象并执行它时,init方法中的所有语句都将被执行。所以当我实际运行它时,这里会发生什么是我会得到scale.head等于None。对吗?所以ll是我的对象。所以代替self,这里将分配sl。所以,SLL head等于None。对吗?所以,这是我创建节点和创建链表的基本概念。让我们来谈谈搜索算法。我们将讨论的第一个搜索算法是线性搜索算法。那么,什么是线性搜索?它帮助我们在线性数据结构中搜索元素。现在,让我们看一个例子,我们将在这个数组中搜索一个元素。所以,假设这是一个数组,元素是10、20、30、40和50。现在如果我们试图在这个数组中搜索元素50,线性搜索的工作方式是它检查每一个元素来找到我们正在搜索的元素。对吗?也就是说,它检查数组中的每个元素。对吗?让我们以50为例。现在50将被比较。对吗?我们检查这个10是否等于50?不。这个20是否等于50?不。这个30是否等于50?这个40是否等于50?这个50是否等于50?是的。所以在这里我们能够执行线性搜索,对吗?我们一个接一个地在这个数组中搜索这个元素。我们先与10比较,然后是20,然后是30,然后是40,最后是50。最后,我们在这个数组中找到了这个元素。这就是所谓的线性搜索。现在让我们来谈谈线性搜索算法。由于它是一个非常直接的,或者你可以说是一个蛮力算法,对吗?它是查找数组中元素的一种蛮力方法。它是这样工作的。我们有一个for循环,我们在其中迭代从0到n的所有元素。在里面,我们在做什么?我们在寻找这个项,也就是我们想要搜索的元素。假设这是50。我们正在检查这个50是否等于ar[i]处的元素。对吗?然后,如果情况是这样,如果我们找到了数组中的元素,我们将返回它的索引。对吗?也就是说,索引对吗?所以我将返回这个i。现在也可能出现这种情况,即我们到达了数组的末尾,并且我们已经检查了最后一个元素,但仍然找不到50,对吗?假设数组是10、20、30和40。现在这个50不在整个数组中。在那个时候,我们将返回-1。所以我们会说,好吧,我们找不到这个元素。每当我们返回这个-1在这个数组中,这意味着我们找不到那个元素。>>现在让我们看看如何在Python中实现线性搜索。线性搜索在这里通过数组来工作。所以我们正在做的是以顺序方式在整个数组中搜索单个元素。这就是线性搜索的工作方式。所以这里正如您所看到的,我们有一个数组。我们有您要搜索的数字,还有一个起始位置变量。在迭代过程中,数组将不断移动,从一个地方搜索到另一个地方,从第一个地方到第二个地方,第二个到第三个,依此类推。总共有五个不同的元素在数组中,这意味着四个不同的位置,因为数组从零开始。0 1 2 3 4。所以索引最多到四,有五个元素。首先,我们需要获取我们要搜索的关键元素,并将该特定元素与数组中的所有元素进行比较。对吗?所以,如果不匹配,如果数组不包含您要搜索的数字,它将抛出一个名为“元素未找到”的错误。如果找到了,它将显示索引值,即它在数组中的位置。所以,让我快速为您运行程序。所以,我正在尝试搜索元素1,对吗?元素1位于索引位置三。0 1 2 和 3。所以,x是用于查找数字的变量。它只是作为一个键。x将作为一个键。您可以更改此设置并检查是否要搜索其他内容。例如,如果它根本不在数组中,它将显示“元素未找到”。如果您想搜索2,例如,答案应该是零,对吗?让我们检查一下。对吗?所以,索引值是零。它位于数组的第一个位置。如果您想搜索9,它在最后一个位置。所以,那是四,对吗?所以,这就是您要搜索的值总是与所有元素顺序地、一个接一个地进行比较的方式。例如,9与2进行比较。不匹配。所以它会转到下一个。9与4进行比较,不匹配。然后与0,再次与1比较,不匹配。它会转到第九个。第九个位置就是它所在的地方。对吗?它会按顺序一个接一个地比较元素。这就是线性搜索在Python中的工作方式。>>现在让我们来谈谈线性搜索的时间复杂度。现在,如果您仔细观察,让我们尝试理解最佳情况。好的。所以现在如果您正在搜索一个元素,让我们说这些是数组中的元素。现在假设在最佳情况下会发生什么?您正在寻找10,而10是数组中的第一个元素。现在找到10需要多少次迭代?零。对吗?它是恒定的时间。只需一次操作,您就可以找到10。所以这是最佳情况时间复杂度,您正在寻找的元素是您搜索的第一个元素。在这种情况下,您正在寻找10,而10是第一个元素。所以这是您的最佳情况。那么,平均情况和最坏情况呢?让我们说平均情况是当您正在寻找一个位于中间的元素时,对吗?让我看看。0 1 2 3 4。或者您可以再添加一个并查找60。或者您可以跳过它。好的,没必要再加一个。好的,所以现在您正在寻找一个位于中间的元素。好的,在这种情况下,您正在寻找30。好的,所以如果您注意到,您只迭代了数组的一半。那是5 / 2,基本上是n / 2,因为在谈论时间复杂度时,常数并不重要。所以这就是为什么平均情况仍然归结为O(N)。那么,最坏情况会发生什么?您正在寻找一个位于数组末尾的元素50。或者在最坏的情况下,您正在搜索一个甚至不在数组中的元素,比如60。在这种情况下,您仍然需要遍历整个数组,这就是为什么最坏情况时间复杂度也是O(N),因为您遍历了整个数组,而元素没有找到。您正在寻找60,但它不在那里,所以您最终遍历了整个数组。这意味着您执行了n次操作。这就是为什么它归结为O(N)。现在让我们来谈谈线性搜索的空间复杂度。当我们试图在数组中查找一个元素时,比如10、20、30、40和50,我们没有使用任何额外的内存,对吗?我们没有使用任何辅助内存,即任何额外的内存来查找该元素。我们只是逐个循环遍历这些元素,并且我们是在给定的相同数组上进行的,对吗?由于我们没有使用任何辅助内存,例如堆栈、链表、数组、字符串或队列,我们没有使用其中任何一个,因为它们不是必需的,对吗?我们正在搜索给定数组中的一个元素,对吗?所以线性搜索的空间复杂度是恒定的,对吗?我们能够使用恒定的空间找到它。好的?我们没有使用任何额外的空间。现在让我们来理解二分搜索算法。什么是二分搜索?所以二分搜索是一种搜索技术,对吗?就像我们在线性搜索中看到的那样,线性搜索的时间复杂度是O(N),我们遍历了所有元素,而现在这是一种比线性搜索更有效的算法。现在,为什么我们需要搜索呢?问题是,假设您有一组给定的元素,可以是数字、单词或任何类型的数据,并且您想检查一个特定元素、一个特定值或项是否存在于您的数组中,对吗?那时,您可以使用线性搜索或二分搜索。现在,二分搜索比线性搜索更有效,并且它用于已排序的数组,或者可以用于某种顺序被维护的数组,因为基于该顺序,我们将划分我们的数组。对吗?它是一种遵循分而治之策略的搜索算法,这意味着它将问题分解成更小、更易于管理的部分,然后单独解决每个部分。假设这是我们的数组,现在由于它将被这样划分,以至于我们可以忽略它的一部分,对吗?我们将进行划分然后征服,这意味着我们将在数组的剩余部分搜索我们的元素。现在假设我们正在寻找某样东西,让我们举一个例子,其中数组被写入,或者数组中的元素被安排成这样,以至于如果我们跳过这一部分,无论是左侧被跳过还是右侧被跳过,都不会影响我们的输出。所以每次在二分搜索中,我们的搜索空间都会被缩小,直到我们找到该元素或数组被耗尽。换句话说,每一步,我们需要考虑的元素数量都会越来越少,这使得搜索过程比逐个检查元素快得多,也更有效。这就是为什么在处理大型排序数据集时首选二分搜索,因为它节省了时间和计算资源。该过程继续划分数组并缩小可能性范围,直到找到所需的元素或没有更多元素可供检查,此时我们可以确定该元素是否存在于数组中。这种方法在计算机科学中是基础性的,并且在需要快速搜索的各种应用中被广泛使用。好的。所以我们的搜索空间在每次迭代中都减半。这就是二分搜索。我们以一种方式查找元素,即每次我们都忽略一半的数组。让我们举一个例子。当我们拥有整个数组时,所以第一半意味着如果有八个元素,四边一边,四边另一边。这四边将被忽略。然后我们这边有两个,那边有两个。这两边将被忽略。然后这边有一个,那边有一个。然后这个将被忽略。依此类推,直到我们找到该元素或整个数组被耗尽。对吗?这就是您的二分搜索的工作方式。现在让我们来理解二分搜索算法。首先,我们将理解迭代方法,然后我们将理解递归方法。所以迭代正如其名,我们将使用for循环,对吗?我们将从一个for循环开始,它将迭代,我们将继续迭代,只要开始小于结束。对吗?因为我们将更新我们的开始,在某些情况下,我们将更新我们的结束。现在发生的是,因为我们知道在这种迭代方法中,或者在二分搜索中,无论我们使用迭代还是递归方法,逻辑都是一样的,对吗?所以我们将拥有这个数组,它将处于某种顺序,以便我们可以忽略它的一部分,它不一定总是排序的,只要有一些顺序,我们就可以应用二分搜索,以便我们可以忽略它的一部分,因为再次记住,它遵循分而治之的范式。所以现在我们有了开始和结束的位置,并且我们将始终迭代,只要开始小于结束。对吗?那么之后会发生什么?现在我们有了这个开始,我们将做什么?让我使用新的指针。所以这是您的开始,这是您的结束。这是您的开始,这是您的结束。现在您将使用一个新的中间索引。对吗?我们称之为m。现在让我们给这些位置编号。0 1 2 3 4。所以您将做的是开始+结束除以二。所以其中一部分可以被忽略。对吗?所以它将是二。所以您的mid在这个位置。现在您将检查,好吧,我正在寻找的元素是,比如50,而我当前所在的元素是30。所以显然它不会在这边。我们不可能在这边找到50,也就是左边。对吗?首先我们将检查,这个30是否等于50?不。所以那个条件永远不会为真。对吗?然后我们将检查我的项,也就是说,这个30是否小于或大于50?如果它大于50。对吗?如果元素,也就是说,项50大于30,对吗?在这个例子中,我们的50,我们正在寻找的元素,项大于30。所以没有必要在这边搜索。所以我们将跳过或忽略数组的这一半。这就是为什么我们的新起点会更新。它将是新的。它将是中间索引+1。也就是说,中间索引是2+1。所以这将是我们的新起点。所以我们巧妙地跳过了数组的一半。所以现在让我们继续。暂时删除所有这些东西,看看下一次迭代会发生什么。现在请记住,我们不会循环或超出这个限制。也就是说,开始应该始终小于或等于n。好的,所以这个条件必须保持。同样,我们将再次划分我们的数组并查找相同的东西,对吗?首先,我们将查找元素,然后我们将跳过其中一部分。这是二分搜索的迭代方法。现在,让我们看看相同的递归方法或递归算法。同样,基本规则保持不变。只要开始小于结束,我们就将始终迭代或递归调用二分搜索。完成。现在会发生什么?我们将再次找到中间索引,即开始+结束除以二。然后我们将查找元素。即使您使用递归方法,这三个步骤也保持不变。现在递归中会发生什么?我们一遍又一遍地调用函数。这就是递归。在本教程的整个过程中,我们将涵盖递归,但将在课程的后期。在这里,您可以获得一个很好的直觉,或者让我给您一个关于递归如何工作的简要直觉。假设这是您的激活记录。每次发生递归时,都会创建一个激活记录。所以,假设您有这三个语句,并且在您的算法中有语句P1、P2和P3,对吗?在P2处,您再次调用函数,对吗?您再次调用此函数。那么会发生什么?创建一个激活记录。它将检查。好的,这个语句执行了吗?是的。所以执行了一个。第二个执行了吗?是的。所以执行了第二个。但在第二个,您再次调用此函数。所以在那时,会创建一个新的激活记录。现在第三步被留下了。对吗?当我们将从这里进行的函数调用返回时,将处理此问题。所以,让我们假设函数在这里。现在在这里您正在返回,对吗?这个函数调用,假设它不小于开始。嗯,开始不小于结束。所以这种情况有点相关,对吗?它类似于我们正在寻找的东西。让我们假设存在类似的情况,即开始不小于结束。在那个时候,您将从这里返回。现在一旦您返回,您将再次调用此函数,但这次是为了这种情况,让我们假设这次您调用它时,第一步被执行了。第一步被执行了。现在再次调用此激活记录。这个激活记录是第一个,然后再次调用它,对吗?这个被执行了,然后再次调用这个,对吗?又会创建一个新的激活记录,而这三个步骤,第三步仍然留待执行。所以现在您在这里返回,对吗?然后它将回到这一步,对吗?一旦您完成了这个,现在有两个位置或两种可能的情况,您可以返回。要么您从这个函数返回,就像我们执行了这个条件并返回一样,对吗?另一种情况是,一旦您完成了整个激活记录,您也将返回。好的。所以这是两种情况。现在您已经执行了这一点,没有要执行的步骤了。它将返回。现在这被留下了。这将执行。现在没有什么要执行的了。它将转到调用者n,最后它将转到最初调用此函数的main方法。好的,所以这就是激活记录的创建方式。维护一个堆栈。好的,即使您可能认为我们没有使用任何额外的空间,但只要涉及递归,就会有堆栈形式的额外空间,并且会维护该堆栈。所以当您处理空间复杂度时,尤其是在使用递归时,您需要记住这一点。好的,那么说了这么多,让我们清除屏幕,看看递归是如何在这里调用的。所以再次,递归地,我们将要做的是,现在我们有了这个mid,对吗?让我们以一个数组0 1 2 3和4 10 20 30 40和50为例。所以中间索引将是0 + 4 / 2,即2。所以这是我们的中间索引,对吗?所以这是零。这是我们的开始,这是我们的结束。对吗?所以现在我们在这里了。对吗?所以我们再次检查,我们正在寻找的50,这是我们正在搜索的项。好的。所以是50吗?这是我们的中间索引。30是否大于50?不,在这种情况下不是。所以这永远不会被执行。这也不会被执行。对吗?那么这个条件呢,else部分?现在我们将要做的是,因为这个30小于,我们将跳过这一部分,我们将专注于中间索引+1,也就是这个。所以这将是新的开始,我们的过程将开始移动。所以现在同样的事情会发生,除非这个条件是假的。好的。所以这就是您的二分搜索在使用递归时的运作方式。所以现在让我们来理解二分搜索,让我们看看它的演示。好的。所以我们正在寻找20。这是我们的数组,对吗?10 11 16 20 和 23。现在这个数组是排序的,对吗?所以我们可以应用二分搜索。好的。因为我们可以根据某些条件忽略数组的一部分。好的。所以现在在第一次迭代中,我们的开始是什么?我们的开始是零。我们的结束是四,我们的中间是这个元素。现在我们要寻找的是,16是否等于20?不,它不是。但16小于20。所以我们将跳过这一部分。在下一次迭代中会发生什么?我们将专注于这三个元素。对吗?也就是说,从我们将专注于这一部分,或者说,我们将专注于这一部分,好的,所以现在在第二次迭代中会发生什么?我们的开始被更新了。现在我们的新开始是这个点,我们的结束将保持在它自己的位置。现在我们将找到中间索引。所以它将是4+3,即3,即7,对吗?然后除以二,它是3.5,对吗?所以由于这将是截断的,对吗?截断将发生,并且存在的整数,即中间索引将是三。所以这是我们的中间索引。对吗?所以您可以看到中间索引是三。现在这是我们要找的元素吗?是的。所以我们将返回索引。所以我们在索引三处找到了我们的元素,因此我们返回三,因为如果您仔细观察,它会返回,如果找到了元素,它会返回索引。所以这将返回。好的。所以这就是二分搜索的工作方式。在理解了二分搜索是什么之后,它是一种基础且广泛使用的计算机科学算法,用于高效地搜索排序数组,我们将通过切换到IDE来快速在Python中实现它,IDE代表集成开发环境,是一个帮助我们编写和测试代码的工具。所以,二分搜索有四个重要元素,对它的操作至关重要。第一个是数组,它是我们要搜索的元素集合。第二个是要搜索的元素,它存储在变量X中。然后还有另外两个变量low和high,分别代表数组的起始和结束索引。为什么我们需要这些?因为对于任何数组执行二分搜索,它都需要被分成两部分。对吗?这种划分对于算法高效工作至关重要。它的工作方式如下。如果键,即您要搜索的元素与当前子数组的中间元素匹配,二分搜索将立即退出,返回找到元素的索引或值。如果不匹配,它将在数组的两个半部分继续搜索该特定元素,根据键将其分成右半部分和左半部分并相应地搜索元素。所以中间索引的计算,通常称为mid,如下所示。Mid等于low加上high减去low除以二。这是我们将用于分割二分数组进行搜索的基本公式。它很重要,因为它有助于我们在某些编程语言中避免潜在的溢出错误。如果mid处的数组,即中间元素等于您要搜索的键元素,它将立即返回中间元素作为找到的元素,表明搜索成功。否则,如果中间元素小于x,它将搜索数组的右侧。如果它大于x,它将搜索数组的左侧。这种搜索空间减半的过程将一直持续到找到元素或搜索空间耗尽为止。所以它不断地在两半中搜索,使得算法与线性搜索相比非常高效。感谢各位伙伴的跟随,我们将一步一步地分解和实现这个基本算法。在这里,如果您看数组3 4 5 6 7 8 和 9,您拥有数组中的所有这些元素。您需要搜索的是4。所以4是第二个元素,您可以立即发现它。但您必须按照二分搜索的规则进行搜索。发生的情况是,它将首先使用公式将此数组分成两半,然后它将比较您要查找的键元素与数组中已存在的元素以找到它。所以让我快速运行一下。好的,它告诉我您要搜索的元素位于索引号一。这意味着它给出的是数组索引计数,而不是元素本身。所以0 1 2 3 等等。所以4位于索引值1。这就是Python中的二分搜索。>>现在让我们来谈谈二分搜索在最佳情况下的时间复杂度。那么什么是最佳情况?让我们看一个数组,数组中的元素是1 2 3 4 和 5。现在最佳情况不像线性搜索那样,最佳情况是您要搜索的元素恰好在开头。在二分搜索中,最佳情况是当您的中间索引位于您要搜索的元素的.位置时。假设您正在搜索整个数组中的3。在这种情况下,它将花费恒定的时间,这就是最佳情况时间复杂度。好的。那么,平均情况会发生什么?如果您谈论这个算法,让我清除屏幕。它遵循分而治之的范式。所以,假设您有八个元素。首先,数组将被分成四和四,因为左侧或右侧将被忽略,然后我们关注剩余的元素。好的,这四个元素将再次被分成两和两。然后我们将忽略两个元素,然后是一个和一个,然后其中一个元素可以被忽略。所以有一个和一个,我们关注这个元素。所以整个操作或整个搜索将在三个步骤中完成。对吗?现在如果我举这个例子并计算log base 2 of 8,值应该是多少?显然,当我这样做时,它可以写成2的3次方,对吗?这可以写成3 * log base 2 of 2。现在这是1,现在您得到答案是3。所以这个三和这个三是相等的。这意味着如果我谈论二分搜索的最坏情况时间复杂度,它将大约是log n,因为正如我们在三个步骤中看到的,我们能够找到元素,而log 8,答案也是三。所以您明白了,对吗?所以二分搜索的最坏情况时间复杂度是log n,平均情况也是如此,它将在log n / 2左右。忽略log n / 2,忽略常数项,它又归结为O(log N)。现在让我们来谈谈二分搜索的空间复杂度。当您谈论空间复杂度时,对吗?我们只考虑辅助内存,或者您可以说您看到的任何额外内存。由于我们没有使用任何额外的内存,例如堆栈、队列、链表或字符串,对吗?所以二分搜索的空间复杂度是O(1)。也就是说,它需要恒定的空间。什么是插入排序?那么问题是,什么是排序?您可能在想,为什么我们需要这些排序算法?所以如果我告诉您,您有一群学生,对吗?您有一群学生,他们每个人都有他们的学号。它们不是按数字顺序排列的,或者您可以说它们没有按任何顺序排列。我希望保持这种顺序。假设您有1到10个学生在这个组中,并且每个人都有这个范围内的学号,从1到10。现在有些人缺席,有些学号已经离开了学校,但学号还没有改变。现在我告诉您什么?我告诉您请对它们进行排序或排列,以便我能轻松理解哪个学号在哪个之后,无论是升序还是降序。假设有一个,然后是2,然后是6,然后是8,然后是10。所以剩下的学号我可以轻松地弄清楚,这些是缺失的或缺席的。为了做到这一点,我们有这些排序算法,其中一种排序算法是插入排序。现在它是最简单、最容易、最蛮力的排序算法。那么,您对蛮力是什么意思?蛮力意味着直接,对吗?以一种朴素的方式,它意味着直接。也就是说,您没有考虑任何效率,或者您不关心时间复杂度或空间复杂度。您只是直接进行排序,以最简单、最朴素的方式进行。在这个蛮力算法中,会发生什么?让我举一个例子。显然,我们可以使用这种插入排序算法进行排序。您当然可以按升序或降序排序。让我们举一个例子。我们都知道纸牌游戏,您有一堆纸牌。假设您手里有一张牌,桌子上有一堆牌。现在,您开始一张一张地拿起这些牌。显然,您手中的牌已经排序了,因为如果我告诉您只排序一个数字,显然如果数组或任何东西(如链表)中只有一个元素,我让您排序,如果只有一个元素,它已经排序了,对吗?您不需要排序。同样,现在发生的是这张牌在您手中,对吗?它就像玩纸牌一样。现在,您手中有一张牌,它显然已经排序了。那么接下来您做什么?在您的下一个回合,您开始从桌子上的牌组中一张一张地拿起牌。现在,让我们假设这是零。好的,我在这里使用数字值,以便您可以理解并联系起来。所以,发生的是您有零,现在您开始比较它。我们正在考虑您试图按升序排序的情况。好的。所以,现在让我们尝试擦除这些东西,这样您更容易理解。好的。所以,现在您有两个元素,对吗?我们正在考虑您试图按升序排序的情况。所以您检查0是否小于1?是的,它是。现在您交换它们。好的。现在您有零和一。现在这是您拥有的两张牌,并且它们都已排序。所以插入排序的工作方式是您总是有两部分,对吗?一部分是您手中的已排序部分,另一部分是后面的未排序部分。所以同样,您开始一张一张地拿起元素,或者您可以开始一张一张地拿起这些牌并继续排序它们。好的。现在这是一个简单的场景,您可以在其中应用插入排序,对吗?这是某人可以解释或您可以理解插入排序算法的最简单方法。现在它很简单,对吗?您开始拿起这些元素并继续排序它们,最后当所有元素都用完时,您将拥有已排序的数组。现在让我们来理解插入排序算法。所以在这个算法中,会发生什么?显然,现在我们知道我们会有两部分,对吗?一部分是已排序部分,另一部分是未排序部分。所以显然您手中的那个元素或您手中的那个元素或牌,只有一张牌在那里,对吗?您手中的一张牌显然已排序,对吗?所以我们不会考虑第一个元素,我们将从第二个元素开始我们的过程。现在我们理解为什么我们这样做。为什么我们从2到n-1或2到n开始,取决于数组,我们是从索引0还是索引1开始。对吗?所以我们总是从第二个元素开始。然后我们将把这个值存储在一个临时变量中。然后我们将检查该元素是否小于我们已排序部分中的元素。如果是这种情况,那么我们将移动它们的位置。对吗?现在我们将有两个元素在画面中,即0和1。并且这两个都将按升序排序。然后我们将考虑从3到0到n的其余情况。好的。现在您可能在想这实际上是如何工作的。让我举一个例子向您展示。让我们考虑我们这里有的这个数组。索引0。这是我们所有的索引,这是我们的数组23 10 16 11 和 20。所以第一步我们正在进行分区。现在这是我们的已排序部分,即第一个元素,这是我们的未排序部分。那么在第一次迭代中,我们将做什么?这是第一次迭代,因为这是我们从第二个索引开始移动的情况,即索引一,如果我们从零开始计数。对吗?所以我们从第二个元素开始,一直到n。对吗?所以现在在第一次迭代中,我们将比较这两个元素。好的,让我擦掉所有东西,这样对您来说更容易。所以现在我们将比较这两个。显然10小于23。所以我们将交换它们的位置。现在这是您的已排序部分,这是您的未排序部分。我们将做同样的事情,对吗?所以第二次迭代中,我们做什么?这里是16。现在我们做什么?我们首先将其与23进行比较。好的,我们看到16小于23。那么现在我们做什么?让我们交换它们的位置。所以这变成16,这变成23。现在会发生什么?现在16将与10进行比较。显然它不小于10。所以它将保持在自己的位置。也就是说,它在索引一的新位置。对吗?所以这是第二次迭代,第二次迭代后,这将是您的已排序部分。正如您所看到的,我将文本加粗了,将这两个元素的边框加粗了,并将这三个元素的边框加粗了,因为这是我们这里的已排序部分,这是未排序部分。现在在第三次迭代中会发生什么?它将检查那个数字。它是11。所以对于11,我们将做什么?我们将将其与注意这一点进行比较。现在我们将考虑11,然后我们将检查它。我们将交换它们。然后11在这里。23在这里。我们比较它们,然后交换它们。16在这里。11在这里。我们检查。所以由于10小于11,什么都不会发生。那么在第三次迭代中会发生什么?我们将有10、11、16和23。这些都已排序,我们只剩下一个未排序的元素。现在在最后一次迭代中会发生什么?现在这个20将处于其原始位置,即这里,其余元素将已排序。由于我们已经检查了所有元素,所有元素都已检查,在最后一步,即第四次迭代中,我们将拥有这个已排序的数组。在学习和理解插入排序的作用和操作方式之后,让我们快速切换到IDE,一步一步地在Python中实现它。我在这里使用Google Colab进行演示,因为它是一个每个人都可以轻松访问的平台。由于它是在线提供的,并且可以从任何有互联网连接的设备使用,因此无需在本地计算机上安装任何东西。所以,让我们快速切换到Google Colab IDE,这是一个专门用于Python编程的集成开发环境。在这里,您可以轻松找到一个名为insertion sort的文件,其Python文件扩展名表示它包含Python代码。有了这个,我们已经准备好了这个特定的程序,这使得我更容易详细地向您解释概念和代码。所以这里我们考虑一个名为insertion sort的函数。对吗?当作为参数传递一些数据以升序对数据结构中的元素进行排序时,就会调用该函数。对吗?为了实现这一点,我们必须编写一个适当的函数,就像插入排序一样。它是如何工作的?您已经了解了插入排序的逻辑和步骤。要将其实现为代码,您必须使用for循环。for循环有一个范围。所以,它将始终逐个检查数组中的元素,以将它们与关键元素进行比较。对吗?所以,每当它找到一个大于关键元素或小于关键元素的元素时,它将相应地交换它们。对吗?所以,我们使用while循环来完成相同的任务。所以我们从找到它的当前位置进行交换,无论它是更大还是更小,我们都会相应地交换它。对吗?然后我们有这里给出的数据,即5 2 1 78。所以这个特定数据通过这个函数时会发生什么,每个元素都将通过我们在这里编写的插入排序函数进行排序。所以它将首先比较元素并尝试按升序排序它们。例如,如果您想按降序排序,那么您只需要更改一个元素。也就是说,这个键应该大于数组元素。就这样。没有别的,没有改变。所以之后,插入排序是包含这里存在的数据的函数。所以所有这些函数都将完成,然后我们将打印最终输出。如何打印?一旦函数完成排序,结果将存储在数据变量本身中。所以那个特定的数据被打印出来。排序后将显示元素,对吗?所以这只是一个打印语句。按升序排序的数组。如果您是按降序进行的,您可以将其更改为按降序排序的数组。所以让我们快速检查一下输出是什么样的。所以这里有一个按升序排序的数组。所以是1 2 5 7 8,从最小的数字到最大的数字。现在让我们在这里做一个小的更改,以便它给我们降序。让我们尝试处理一下。对吗?如果您在这里看,如果键大于数组元素,那么您将得到降序,即8 7 5 2 1。所以您可以这样更改。好的,我没有更改打印语句,所以我只是将其更改为降序,对吗?运行已声明的相同代码。所以这就是Python中的插入排序。正如您所看到的,代码非常简短,并且很快消除了我们通常进行的所有变量初始化。您只需要有函数,传递数据,对其进行排序,然后输出就完成了。所以这就是Python中插入排序的所有内容。>>现在让我们来谈谈插入排序的时间复杂度。所以在最坏的情况下,当所有元素都以相反的顺序排列,并且我们需要逐个排序它们时,显然我们谈论的是从1到n的外部循环,然后是向后运行的内部循环。在第一次迭代中,我们只考虑零个元素,但随着我们前进,它将从n运行到零个元素。对吗?我们将考虑所有n个元素。所以在那种情况下,最坏情况下的时间复杂度将是n的平方阶,因为我们有两个嵌套循环。一个是for循环,在for循环内部有一个while循环。对吗?所以这是最坏情况,它也发生在平均情况中,即数组的一部分已经排序。假设我们有5 4 5 6 7 8,然后我们有未排序的部分。所以一半的元素已排序,一半未排序。在这种情况下,它将是n^2 / 2。我们不考虑我们谈论常数的情况。我们忽略常数。在这种情况下,平均时间复杂度将是n的平方。对吗?但关于这种时间复杂度最重要的事情是最佳情况。也就是说,当您的元素像5 6 7 8 9 和 10 一样,当数组中的元素已经排序时。在这种情况下会发生什么?如果您观察从1到n运行的for循环将始终存在。并且总是存在。时间复杂度,大O表示法,O(N)将始终存在。但在while循环中,我们检查J是否大于或等于零,以及array[J]是否小于10。对吗?在这种情况下,这永远不会被执行,因为array[J]将始终大于10。为什么?因为我们谈论的是这个元素,我们正在检查六是否小于五。不,它不是。七是否小于六?不,它不是。所以对于所有元素,这个条件将始终为假。所以总而言之,我们只是在每次迭代中检查这些步骤一次。这就是为什么最佳情况下的整个时间复杂度将是O(N),而不是O(N平方)。好的。现在让我们来谈谈插入排序的空间复杂度。如果您注意到算法和实现,我们从未谈论过任何辅助内存,对吗?我们没有使用任何额外的空间,无论是数组、链表、堆栈、队列还是其他任何形式的,对吗?所以这就是为什么插入排序的空间复杂度是01。也就是说,它使用恒定的空间。现在让我们来谈谈插入排序分析,我们将查看比较次数、交换次数,它是稳定的还是不稳定的,以及它是就地排序还是异地排序。所以首先让我们来谈谈所需的比较次数。这里我们将讨论两种情况。最坏情况和平均情况。在最坏情况下,所需的比较次数是n^2 / 2。现在,如果我们实际谈论平均情况,它是n^2 / 4,正好是.最坏情况的一半,对吗?它是.一半。现在,如果我们谈论插入排序所需的交换次数,我们再次考虑两种情况,平均情况和最坏情况。在平均情况下,它是n^2 / 8。在最坏情况下,它是n^2 / 4。这些是所需的交换次数。如果您想检查这些陈述或方程是否正确,您可以随时尝试一个示例,其中您将同时考虑偶数和奇数情况。所以举一个例子,然后运行它。现在如果您谈论插入排序的稳定性,它是一种稳定的算法。您对稳定是什么意思?所以如果您有一个包含1 3 1' 和5的数组,在这个数组中,这两个1的相对位置,即这个1和这个1,让我改变颜色并向您展示这个1和这个1的相对位置。

一个将保持不变。这意味着什么?这意味着无论何时您对其进行排序,都可以用两种不同的方式对其进行排序。对吗?这个也已排序,这个也已排序。这意味着您可以有一个 1 1 3 和 5,或者您可以有一个 1 3 和 5。显然这个数字重复了,但这是第一个数字。这个第一次出现在这里,这里是第二次出现。现在您想保持它们的相对位置不变。对吗?所以这两个都已排序。对吗?但如果您谈论稳定性,这个称为稳定,这个称为不稳定。好的?现在插入排序,无论何时您尝试实现插入排序,它都是稳定的。这意味着这两个 1 的相对位置将保持不变。好的。所以如果有人问您插入排序是否稳定,您会说“是”。为什么?因为重复数字的相对位置保持不变。那么关于原地还是非原地呢?由于我们没有使用任何辅助内存,对吗?我们没有使用任何堆栈、队列、链表或数组。这就是为什么每当您不使用任何额外内存时,它就被认为是一种原地算法。所以,如果一个算法在原始数组内进行排序,这意味着您没有使用任何额外的空间。该算法被称为原地算法,这是很清楚的。现在,在插入排序中,由于我们没有使用任何额外内存。所以插入排序是一种原地算法。现在,让我们看一个我们将实现插入排序的例子。正如您所见,我们这里有一个例子,我们有 6 5 3 2 8 10 9 和 11,并且我们得到了 K。这个 K 的意义在于,对于这个 3,无论是在左侧还是右侧,所需的最大交换或比较次数。对吗?这个 3 要移动到其原始位置所需的步数是三。所以这是一个称为“近乎排序的数组”或“K 排序数组”的问题。我们不需要对数组中的所有元素进行排序。我们专门寻找那些不在其原始位置的元素。如果我们想让它们回到原来的位置,所需的最大比较或交换次数是三。所以,如果您看这个 3,它的原始位置在这里。五。这意味着在排序后的数组中,它会在这里。同样,如果您看这个 2,它需要的交换次数是 1、2,然后它就会回到原来的位置。或者您可以说 1、2、3。所以,最多它可以移动三步,对吗?所以,对于所有元素来说,最多是三。好的?而最少,可能根本不需要移动,它保持在原来的位置,比如 11。您可以看到 11 在原始数组和交换后的数组中都处于其原始位置。所以最多有三个位置。现在,让我们试着理解什么是排序以及为什么我们需要排序。排序是一个过程,我们将数据按升序或降序排列。对吗?所以,假设您有一组学生,10 名学生,他们都分配了从 1 到 100 的学号。如果您想知道哪些学号存在,哪些不存在,以及哪些学生已经离开了学校,在这种情况下,您可以轻松地使用排序。当数据排序后,您可以快速找出哪些学生缺席或不在。对吗?所以,这就是排序的用处。在本教程中,我们将学习快速排序算法。它是最广泛使用的算法之一,它遵循分治范式。分治是什么意思?基本上,我们将划分我们的数组,以便每次我们分割它,假设这是我们的数组,然后我们将把它分成两部分,然后进一步分成两部分,依此类推,对吗?我们将在算法部分看到如何实现这种分治范式。在本教程中,我们将使用递归来实现快速排序。我们将看到如何根据枢轴元素递归调用这些函数。现在,在这个递归调用中,我们将选择一个枢轴元素。假设您有这个数组,我们选择这个元素作为枢轴。当然,您可以选择任何元素作为枢轴,对吗?它可以是第一个元素、最后一个元素或任何随机元素。但是一旦我们选择了那个枢轴,我们在每次迭代中做什么?在快速排序中,每次迭代会发生什么?这个枢轴会找到它的原始位置。也就是说,它在排序数组中的位置。假设这是我们的枢轴。一次迭代后,这个枢轴将处于其正确位置,所有小于该枢轴的元素将在左侧,所有大于它的元素将在右侧。然后我们将选择另一个枢轴。那么这些枢轴是什么?我们将更详细地查看算法,看看如何选择枢轴。假设我们选择了这个枢轴,它在这里。第二次迭代后会发生什么?这将是我们的下一个枢轴,这将是我们的下一个枢轴。现在我们将有两个枢轴。这就是我们实现分治方法的方式。每一步,我们的问题都会被分成两部分,从而导致快速排序或快速排序算法。所以现在我们将处理这个子数组和这个子数组,并将相同的过程应用于每个子数组。这意味着这是枢轴,这是枢轴。现在,让我们试着理解快速排序算法。所以,首先我们有一个叫做 quicksort 的方法,在这个方法中,我们将一遍又一遍地递归调用 quicksort,但第一次运行时会发生什么?我们检查,好的,现在我们有了这个编辑,我们总是检查开始应该小于结束,因为这样我们可以跟踪哪个部分已经排序,哪个部分仍然未排序,对吗?所以,在检查之后,我们调用这个方法,我们将看到这个方法是什么,我们将查看算法,我们将看到这个分区是如何发生的。我们将得到索引,假设我们选择这个元素作为枢轴,分区后会发生什么?这个枢轴最终会处于其原始位置,即索引 3。那个索引将被返回并存储在这个 pivot_index 变量中。现在会发生什么?我们知道这是它在数组中的原始位置。所以当我们得到排序后的数组时,这将是它的正确位置。例如,如果这个元素是 8,它将在索引 3 处,并且每次迭代后,这个元素将处于其原始位置。第一次执行分区。接下来,快速排序算法再次递归调用。首先在左侧,意味着这个部分和这个部分,这将是您的枢轴。您看,我们传递的参数是 beginning 和 pivot_index - 1,这意味着我们不包括这个元素,因为它已经排序了。我们不包括这个元素,并且我们再次调用该函数处理这个子数组。这次,这将是我们的枢轴。同样的事情也会发生。类似地,当我们完成左侧后,我们转向右侧。也就是说,我们从 pivot_index + 1 开始实现它,这意味着从这个元素到数组的末尾。这次,这将是我们的枢轴。好的,话虽如此,这就是实现快速排序时发生的情况。但是现在,这个 partition 方法呢?让我们看看它是如何工作的。所以,在 partition 中,我们会设置枢轴元素。也就是说,我们选择将成为我们枢轴的元素。显然,您可以选择任何元素,但在本教程中,我将使用并且您应该首先尝试的是选择最后一个元素作为枢轴。当然,您可以选择任何元素,时间复杂度取决于您选择的枢轴。我们将在时间复杂度部分讨论这一点。好的,所以我们将枢轴设置为最后一个元素,现在我们要做的是说,“好的,pivot_index”这个步骤指的是什么?假设这是 pivot_index,会发生什么?这将是我们的枢轴。会发生什么?这个 pivot_index 保持顺序。所以从这个索引开始,左侧的一切都小于枢轴,右侧的一切都大于枢轴。我们将看到一个例子,我将向您展示这个 pivot_index 是多么重要。好的。现在我们将要做什么?显然,一开始它处于这个位置,这意味着我们还没有出现一些元素小于枢轴而另一些元素大于枢轴的情况。好的。所以,现在假设这是我们的数组。这是我们的枢轴,对吧?这是我们的 p_index,即枢轴索引。它目前是 -1。好的。现在这两个步骤完成了。现在第三步会发生什么?现在我们将从开头开始迭代,也就是说,从这一点开始,我们将检查是否有任何元素小于枢轴。如果是这种情况,那么我们做什么?我们增加这个并交换那些元素,即数组元素和该索引处的第一个元素。这意味着现在如果您查看此步骤,我们首先增加了它。对吧?现在,假设任何元素小于枢轴,我们首先增加枢轴索引。所以枢轴索引将在这里,我们将它与同一位置的 arri 交换。所以这个元素将与自身交换。现在您可能会想,“好吧,我们为什么要这样做?”对吧?为什么要把它和它自己的位置交换?您可能在这个步骤中没有直观的理解,但在下一步您一定会明白。现在,假设这是在 for 循环中发生的事情。现在,让我们尝试重申一下。如果一个元素不小于枢轴,比如说这里我们有五,这里我们有三。所以它小于,我们把它和自身交换了。现在,假设我们有这个元素六,它不小于枢轴,对吧?所以这里会发生什么?所以我们不会执行这个 if 块,对吧?然后我们将有这个或宽度。现在它会在这里。现在它将被增加,这次我们有二,而 P 索引仍然在这里,对吧?这次它小于二,对吧?现在我们将要做的是,我们首先增加 P 索引,它将指向这里,然后我们将要做的是交换这两个元素,对吧?这两个元素将被交换,所以现在您这里有二,而您这里有六,对吧?所以您看到这就是为什么我们有这个原地枢轴索引以及为什么我们交换它们的原因。所以,在第一步中,这是因为元素小于枢轴,而如果元素不小于枢轴,那么我们将增加 i 指针,而 p 索引将保留在这里。现在,最后会发生什么?现在,一旦整个迭代完成,假设我们这里有八,然后是十。现在,一旦迭代完成,我们将交换这两个元素,这意味着五和六将被交换,我们这里有五,这里有六,这里有八,这里有十,这里有三,这里有二。所以您看到,一次迭代后,所有小于枢轴的元素都将在左侧,所有大于枢轴的元素都将在右侧。最后,我们将返回枢轴索引,即 p_index + 1。这意味着我们将返回这个索引,以便这个元素不会被考虑或不会参与任何进一步的迭代或任何进一步的递归调用。因为您看到,如果您仔细观察,我们传递的是 pivot_index - 1,也就是说,左侧的所有元素不包括五,而 +1 意味着右侧的所有元素不包括这个索引。好的,这就是 partition 的工作方式。现在您可能有点困惑。所以,让我们通过一个例子来演示一下。所以您看到我们这里有一个例子,对吧?我们有 5 10 9 6 和 7。这些是数组中的元素。我们这里有这个枢轴,最后一个元素。我们选择最后一个元素作为枢轴。之后,我们做什么?我们有这个 end 指针和这个 beginning 指针。此外,我们还有那个 pivot_index,它将在这里的某个地方。对吧?那个 pivot_index 将是 -1。现在,将检查这个七。好的。五小于七吗?是的,五小于七。所以,它将与自身交换,并且枢轴索引将首先被增加,然后与自身交换。现在,枢轴索引将在这里。下次,我们的 eye 指针将在这里。首先它会在这里,然后它会被增加。现在再次检查。七小于十吗?不,不是。所以我们的 I 将被增加。I 现在将在这里,在这个位置。对吧?再次检查。不。再次检查。是的。所以现在会发生什么?七和六。呃,六将被什么替换?十。所以您这里有六。显然,枢轴索引将首先被增加,然后我们这里有六,它将被与十交换。所以十将在这里。对吧?完成。最后,当我们到达末尾时,一旦整个迭代完成,这是第一步。一旦整个迭代完成,我们有五、六,然后七将是我们最后一次交换。我们最后一次交换,如果您仔细观察,我们正在进行的这次交换,就是负责将这个七与 pivot_index 交换,即 pivot_index + 1,也就是这个位置。我们这里有七,它将被九替换。所以这就是为什么我们这里有九,而十在那里,这是第一次迭代后的数组。现在您可能会想,“好的,现在这个元素已经固定了。”现在我们再也不会谈论这个元素了,因为它在排序后的数组中也处于其原始位置。现在我们将处理什么?我们将处理这部分左侧和这部分右侧。所以现在这部分会发生什么?这部分会发生什么?您看,现在我们有了新的,这是我们的开始,这是我们的枢轴,因为这是我们将选择的最后一个元素,这是我们的结束。同样,这是我们的开始,这将是我们的枢轴,这个子数组中的最后一个元素,结束将在这里。现在我们将再次执行相同的步骤,这次我们将检查,好的,枢轴小于吗?不,什么都不会发生。然后我们将把这个东西和它自己交换,对吧?现在,一旦这个整个子数组完成,我们将不再深入,因为这次 Beginning 不小于 End,两个元素都在零,而零不小于零。现在,如果您仔细观察,这就是我们在函数开头检查的条件,即 quicksort 函数,我们将检查 Beginning 是否小于 End。对吧?所以这就是它的重要性。同样,右侧也会发生同样的事情。并且 Beginning 将不小于索引 End 部分。我们也不会再深入了。所以两次迭代后,我们的整个数组就排序了。对吧?所以这是第一步。第二步之后,我们的整个数组就排序了。在学习了快速排序是什么之后,让我们快速用 Python 实现它。所以,我们在这里使用 Python IDE,特别是 Google Colab,我指的是其中一个 IDE。然后我们将在那里实现那个特定的程序。所以,让我们快速进入 IDE。所以,这是 Python 中快速排序的程序。所以,让我们理解这个程序是如何工作的。对吧?第一部分是我们需要创建一个 partition。对吧?在快速排序中,任何数组都需要被分成两个单独的部分,然后我们将单独开始排序这些不同的部分。所以分区定位将通过数组的 low 和 high 变量来完成,它们分别代表起始和结束索引。我们将始终将最右边的元素视为枢轴元素。数组的最右边元素是枢轴。这是此方法中的规则。为此,我们将使用语句 pivot = r[h]。对吧?然后我们需要一个用于较大元素的指针。所以为了比较较大的元素,我们将使用这个指针遍历数组。记住一个枢轴元素,并将其与每个元素进行比较。我们为此使用这个 for 循环。如果有一个元素小于枢轴,我们将使用 i = i + 1 并立即将位置 i 的元素与位置 j 的元素交换。对吧?这将通过 r[i] 和 j = j 来完成。我们将进行交换。如果您在这里看,I 和 J 已被交换为 J 和 I。所以,我们正在交换元素。如果它小于枢轴元素,那么交换枢轴与 I。如果它大于枢轴,对吧?如果任何元素大于枢轴元素,无论 I 指向何处,该元素都将与枢轴交换。为此,我们将使用这个特定的条件。然后,我们将返回到我们开始分区的初始位置,对吧?在那里我们将数组分成两部分。分区在那里完成。我们将回去并尝试从初始位置开始。然后 quicksort 函数将进来。所以,在这里的 quicksort 中,我们再次需要三个不同的元素:数组、low 和 high。如果 low 小于 high,也就是说,如果存在小于枢轴的元素,它们都将移到左侧。如果存在大于枢轴的元素,它将移到右侧。所以分区是相应完成的。所以这是我们用于快速排序的递归调用。对吧?再次,我们将有数组、low 和 pi - 1。pi 是 pivot - 1。所以对于枢轴的右侧,我们有一个递归调用函数,它在这里声明。一旦所有这些步骤都完成,我们需要提供数据来排序。对吧?这里我们专注于按升序对给定数组进行排序。所以数据集在这里指定并已分配为 d。所以集合已分配给我们为 D。9 8 7 2 10 20 和 1。这些是我们尝试排序的元素,对吧?我们打印未排序的数组。意思是输入是如何给出的,它就如何打印。未排序的数组等于等等,这已经存在了。我们还没有执行任何函数。然后我们打印 D,这意味着它会立即打印。然后 size = len(D)。我们在打印时会考虑这一点,对吧?我们必须一个接一个地打印每个元素。所以,我们再次先打印九,然后是八,然后是七,然后是二,依此类推,直到一。完成之后,我们将把这个原始数据,未排序的数据发送到我们在这里创建的 quicksort 函数。对吧?所以它被发送了。一旦发送,它将遵循这里提到的所有过程。所有函数都将传递数据。最后,我们将打印以升序排序的数组,这是使用快速排序排序的。所以,让我们快速运行这个程序并查看输出。所以需要一些时间才能获得输出。所以,让我们快速检查一下。好的,这就是我提到的。未排序的数组就是用户提供的数组,而排序后的数组是在执行了所有为快速排序分配的函数之后显示的。如您所见,它是升序的,从一到二十。所以,这就是关于 Python 中的快速排序。>> 现在,让我们试着理解快速排序算法的时间复杂度。在快速排序算法中,我们已经看到元素的分区发生了,并且我们正在分区所有元素。这意味着所有 n 个元素。如果有八个元素,我们就遍历所有八个元素,对吧?所以对它们进行分区需要 n 时间。也就是说,O(n) 时间。然后快速排序问题每次将其除以二。对吧?每次我们将其除以二。所以整个过程或快速排序在最佳情况和平均情况下的时间复杂度是 O(n) 时间,即 O(log n)。当我们谈论平均情况时,情况也是如此。但为什么在最坏情况下是 n 平方呢?这就是问题所在,对吧?所以让我来澄清一下。问题是为什么会发生这种情况?如果您选择数组中的最小元素或最大元素作为枢轴,如果您这样选择了枢轴,您最终会再次遍历所有元素,这意味着这个 n 已经存在于分区中。这意味着您将遍历数组,但有一个额外的 n。这意味着在那个 n 中,您再次遍历所有元素并交换它们,因为在最坏情况下,您的枢轴可能是数组中最小或最大的元素。在这两种情况下,您都将交换所有这些元素。例如,这个元素将被交换。假设这是最大的元素,比如八。所以什么都不会真正发生。如果它是最小的,它将与自身交换。这个将被与自身交换,依此类推。所以所有元素都将被交换,最后这个元素将最终处于其原始位置。这就是如果您选择的枢轴是数组中最小或最大的元素时发生的情况。好的,所以在这两种情况下,这并不理想。如果您随机选择枢轴,那就不一样了。简而言之,当您选择的枢轴元素是数组中最小或最大的元素时,您就会得到最坏情况下的时间复杂度,即 O(n^2)。现在,让我们谈谈快速排序的空间复杂度。您可能在想,“好吧,我们没有使用任何额外的空间,对吗?”我们没有使用任何辅助内存,如数组、堆栈、队列、链表或任何东西。但是通过调用这个函数,quick sort 函数,我们正在使用递归,对吧?我们一遍又一遍地调用 quicksort。有两个 quicksort 调用。为了维护调用堆栈,我们需要 O(n) 空间。所以时间复杂度将是更大的。当我们使用这种方法时,在最坏情况下,所有元素都将在调用堆栈上。好的。所以,在最坏情况下,空间复杂度将是 O(n)。但是,如果我们修改这种存储元素和管理调用堆栈的方法,我们可以将其减少到 O(log n)。现在,让我们试着分析快速排序算法。首先,让我们试着理解它的稳定性。所以,假设您有这个数组 1 3 1- 和 4。现在,如果一个算法是稳定的,那么这两个 1,这个 1 和那个 1,在排序后的数组中保持它们原始的相对位置。现在您有这个排序后的数组,对吧?这两个 1,这个 1 和那个 1,都保持着它们的相对位置,就像它们在未排序的数组中一样,对吧?所以,如果保持了,对吧?如果保持了,那么算法就是稳定的,否则它就不稳定。显然,还有另一种方式,这个也可以排序,但它不稳定。这是不稳定的。如果您以这种方式排序,并且您有这些东西被放置,这个算法是不稳定的。所以,如果您谈论快速排序算法,快速排序是一种不稳定的算法。尽管我们可以进行一些修改来使其稳定,或者我们可以使这个算法稳定。就目前而言,如果您谈论快速排序算法,它是一种不稳定的算法。那么原地和非原地呢?由于我们没有使用任何辅助内存,对吧?我们没有显式使用任何额外空间,如数组、链表、堆栈或队列,我们没有使用任何额外内存。所以这个算法,快速排序算法,尽管我们维护了一个调用堆栈,我们在其中维护了一个调用堆栈,并且我们有 O(n) 的空间复杂度,但是由于我们没有显式地提及这些辅助内存,这个算法被认为是原地算法。这是可以对快速排序进行的两种分析。所以,简而言之,如果您谈论快速排序,对吧?它是一种不稳定的算法。那么归并排序呢?如果我们谈论归并排序,让我们先试着理解排序。排序是为您的值赋予顺序的一种方式。对吧?所以,假设您有一些随机值 10 30,然后您有 5 2 1 等等。对吧?您有这些值,现在您想保持某种顺序。为了可视化这些数据,假设您想按升序或降序查看它们。这就是您所说的排序。所以,假设您有一个班级,班级里有几个学号,有些学号丢失了,然后您想按升序或降序对这些学号进行排序。这时您就需要排序。所以,这就是排序的基本直觉,试图为某种类型的值或某种类型的数据集赋予顺序。对吧?所以,在本教程中,我们将讨论归并排序。归并排序是一种经典的排序算法。在这种排序方法中,每次您的问题都会被分成子问题,以便您的问题集变得更小,然后您专注于那个子问题。同样,每次您划分您的子问题,您都会继续划分它们,直到只剩下一个元素。对吧?如果您将其与更简单的排序算法进行比较,如冒泡排序、插入排序、选择排序,甚至快速排序,当您谈论其时间复杂度与这些算法相比时,这个算法效率要高得多。现在它遵循分治范式。这是什么意思?这意味着首先您不断地划分您的子问题,然后您征服这些问题,最后您将所有东西组合在一起。好的。所以,在这里我们将看到,当您划分您的子问题时,然后当您有您的问题集并且这些问题集被征服时,这意味着这些问题进一步,当您谈论这个例子时,这些子问题是已排序的,在这种情况下,一旦您征服了它们,您就将它们组合起来。那是我们的归并阶段,您将问题带回一起,再次形成一个单一的子问题。所以,每次您划分一个子问题,您就征服它,然后组合它。这就是分治范式的工作方式。基本上,当您处理归并排序时,您关注两个函数:merge 函数和 merge sort 函数。现在,让我们谈谈 divide 部分。这意味着您正在划分您的子问题。您会一直这样做,直到只剩下一个元素,因为单个元素已经排序了,对吧?那是您的 divide 阶段。那么 conquer 呢?基本上,您征服那些单独的集合,然后将这两个子问题合并成一个问题。您在每一步重复这个过程,最后您得到已排序的原始数组。现在,让我们谈谈归并排序算法。首先,让我们讨论归并排序方法。在这种方法中,我们所做的是将我们的数组分成更小的子数组。我们怎么做呢?基本上,如果我们有这个数组,假设它包含八个元素,对吧?这是我们的数组。假设这是我们的左指针,这是我们的右指针。现在我们正在划分它。所以我们需要某种迭代器,我们将存储总和,并尝试计算中间值。您怎么做呢?简单地说,我们计算 left + right / 2。就是这样,对吧?所以我们有了这个划分,然后我们将划分这部分,因为我们再次调用这个函数,在左侧。所以这将调用这一侧,这意味着我们现在只讨论三个元素。所以,让我们说,或者让我们在这边取四个元素,在那边取四个元素。所以我们的 mid 将是 3.5。所以我们将讨论从 0 到 3 的元素。所以我们将讨论四个元素,然后这两个步骤仍然存在。为什么?因为我们以递归方式实现这一点。所以,现在假设这是我们的第一个函数调用,您有这三个步骤。一,我们称它们为 1、2 和 3。好的。所以,在第一个函数调用 1、2 和 3 中。所以这是第一个函数调用,在这个调用中,我们再次调用。这是第二个函数调用,我们再次调用。这两个仍然存在,对吧?我们再次调用 1、2、3。对吧?所以,在这种情况下,我们再次调用它处理这四个元素,它将被进一步分成两个元素。零和一,对吧?在这种情况下,再次调用它,它将被调用到这些两个元素上,这里我们只讨论两个元素,所以这是第三次函数调用,我们再次将其分成这两个和三个步骤仍然存在。所以,在第四步中,我们只处理一个元素,对吧?在这种情况下,我们只讨论这个元素,对吧?而且我们无法进一步划分它,在这种情况下,我们的 left 不大于我们的 left 将大于或等于 right,在这种情况下,它将等于,所以我们将返回。所以现在它将被返回,对吧?然后,无论剩下什么,对吧?现在我们来谈谈这个单个元素,剩下的那个元素,我们将讨论它。所以再次,它将被分成一个,对吧?再次,这将是第二个选项,我将把它擦掉,因为它看起来有点混乱。所以,现在会发生什么?让我再次用红色写出来。所以,在这里我们称它为第四次,这次它返回,返回,对吧?所以,在这种情况下,现在我们将进入第二步。现在再次调用它处理那个单个元素,并且 left 不大于,它将大于或等于。在这种情况下,它将等于,然后我们返回。所以我们再次返回。所以我们有两个元素,一个和一。这意味着不是一个元素,而是这两个数组中只有一个元素。对吧?为什么我这么说?在两个数组中。当我们谈论 merge 时,我们将看到。好的,我们将看到它是如何实现的。好的。所以,现在这两个函数调用都完成了,然后我们处理 merge。现在,在进入 merge 之前,让我向您展示一个演示,说明事情是如何进行的。所以您有这些元素,这里您有多少元素?您有五个元素,对吧?现在您将其分成三和二。现在这是您的第一步。第二步将是这个。所以现在您将继续创建这个作为您的第三步吗?这意味着您将继续处理这个。不,因为我们看到,除非左边什么都没有了,否则我们不会去右边。所以这是您的第二步。然后这将是您的第三步。这将是您的第四步。然后您将进入您的第五步。对吧?现在,一旦左边或右边什么都没有了,那么会发生什么?这将是您的第六步吗?不。您的第六步将是归并。所以,让我们进入归并。所以,在 merge 函数中,如果您查看算法,它非常简单。您创建两个子数组。一个是您的左数组,另一个是您的右子数组。现在,在这种情况下,正如您在前面的例子中看到的,我们这里有一个元素,那里有一个元素。现在,一旦我们确定了这些数组的长度,这些子数组的长度应该是多少,并且我们已经声明并初始化了这些数组,这三个步骤完成后,我们将要做的是创建三个迭代器:I、J 和 K。这些迭代器的工作方式如下。I 迭代器将处理左数组。J 迭代器将处理右数组,K 将处理原始数组,这有助于我们插入元素。所以,一旦我们设置好一切,下一步就是比较值。对吧?如果左数组中的元素小于右数组中的元素,我们将将其插入到原始数组中。所以,现在假设您这里有 10,那里有 20。由于 10 较小,我们将插入它并递增 k 指针。现在我们的 i 指针也将被递增。之前它在零,现在它将移到一。对吧?现在发生的是,我的指针指向一,我的长度也为一。所以,在这种情况下,当其中一个数组耗尽时,下一个数组,无论哪边剩下,对吧?它可以是左数组或右数组。那些元素将被直接插入到原始数组中,因为我们确切地知道左数组和右数组本身都已经排序了。好的。所以,让我们看看下一步的演示。所以,我们这里有我们的步骤,对吧?这将是第六步,我们将合并这个。现在这将是您的第七步吗?不,您的第七步将是这里。这将是您的第七步。现在第六步完成了。现在您将对其进行划分并创建所有那些数组。一旦您有了右数组,并且没有右数组,因为左数组已经完成了,现在您有了右左。现在这也被完成了。现在您的第八步将是这个。您将合并它。这将是您的第八步。然后您将合并它。现在这将是您的第九步吗?不。您有这个数组,即您的左数组,但右边呢?它在这里吗?不,它不在。所以,现在让我们试着计算一下。现在您的第九步是什么?这个左边完成了。这是您的第九步。那么您的第十步是什么?这是您的第十步。好吧,现在没有左边了。对吧?现在我们将转向右侧。所以这是您的第十一步,因为这是右侧。对吧?现在,当您右边什么都没有时,您将合并这两个步骤,这将是您的第十二步,就在这里。所以这是您的第十二步。这意味着您将合并这两个。最终的排序数组是这个数组。您将在第十二步得到这个数组。所以您看到 10 11 16 20 和 30。现在,如果您仔细观察,您有这些单独的数组,一个和一个。所以,现在当您合并它们时,您也在对它们进行排序。所以左数组是排序的,右侧也发生同样的事情。如果您看三和四,这两个元素在这个左数组中是排序的。所以这就是原因,在右数组中,而不是左数组。所以,现在当您合并它们时,您将再次得到一个本身已排序的数组。您看到 10、16 和 23。所以,如果其中一个数组耗尽,另一个数组中剩余的元素可以直接插入到您的原始数组中。让我擦掉这个。您看到您有您的左数组,它是已排序的,然后您将其与右数组合并,右数组也是已排序的。现在,如果其中一个数组耗尽,无论是左数组还是右数组,来自该数组的元素都可以直接插入到您的原始数组中,因为我们知道左数组或右数组中的元素已经排序。好的。所以,这就是您执行 merge 函数的方式。所以,这是 Python 中归并排序的程序。所以,这个归并排序是如何工作的?通常,一个数组将被分成两个不同的部分。然后这两个子数组将被进一步分成更小的子数组。之后,我们最终得到的结果将被组合起来,以完成对该特定数组的排序。所以,我们将所有从子数组中得到答案的合并起来,以形成最终结果。所以,让我们快速看看在 Python 中实现归并排序需要做什么。首先,我们需要一个数组,它将被传递给这个归并排序函数。那么这个函数里面发生了什么?首先计算数组的长度。一旦计算出来,就将其除以二。所以您得到数组的左半部分和右半部分,对吧?所以,将数组分成两个不同的部分后,我们在数组的左侧执行归并排序,并在数组的右侧执行归并排序。对吧?然后我们将使用一个 while 循环,借助循环结构。所以,首先我们将检查右数组索引是否小于左数组的长度,然后再次检查左数组索引是否小于右数组的长度。所以我们将尝试在那里合并和排序元素。所以稍后我们将回到 while 循环中的左侧和右侧部分。这里是左侧数组的长度。我们正在检查它是否小于或大于,并根据此决定将结果合并到哪里。我们从子数组中得到的结果。对吧?然后我们总是可以选择打印这些特定的数组,我们将在最后进行。但在此之前,为了合并我们从所有子数组中得到的所有结果,我们将在这里使用一个 for 循环。对吧?所以所有数组结果将被合并在一起,我们将得到最终的排序数组,它包含的元素数量与用户输入的元素数量相同。例如,如果数组中有五个不同的元素,在合并所有子数组结果后,我们将得到这五个元素。我们将使用一个称为归并排序的著名且高效的算法来对数组中的元素进行升序排序。所以,让我们快速详细了解一下这个归并排序算法在实践中是如何工作的。这里有一个包含八个不同元素的数组。正如您所见,这个数组目前未排序。我们需要将其按升序排序。一旦这个数组通过归并排序函数,算法将一步一步地执行所有必要的操作,将数组分成更小的子数组,对这些子数组进行排序,然后最后将所有排序的数组合并在一起。在所有这些步骤完成后,排序后的元素将显示在 print 列表中。对吧?所以,让我们快速运行这个程序并查看结果,看看归并排序如何有效地组织数据。尽管我们称之为数组,但实际上我们在 Python 中使用的是列表来存储它。对吧?所以,这是我们在这里得到的排序数组。正如您所见,我们之前没有排序的数组,但现在它是升序的。也就是说,从最小到最大。所以,这就是关于归并排序的一切。让我们从第一个主题开始,也就是什么是 Piest。好的。现在,我只想指出一点。您可能以前听过 Piest 这个名字。也许您不确定它到底是什么,它的用途是什么,或者它在什么上下文中是相关的,但您一定至少听说过 Piest。那么,Piest 是什么?它是一个测试框架,用于执行不同类型的测试。现在,正如我们所知,每当我们构建任何应用程序或处理新事物时,我们总是会尝试对其运行一些测试用例。这样,无论我们开发了什么应用程序,在推向市场之前,它都是完全无 bug 的,并且已准备好供用户使用。这就是目标。那么,我们实际上是如何运行这些测试用例的呢?在这种情况下,Piest 是用于对您的应用程序执行各种类型测试的框架之一。所以,Piest 是一种用于测试的测试框架。这里的测试意味着您将为您的应用程序或软件创建并运行测试用例,无论您构建了什么。我们为什么要这样做?正如我提到的,我们这样做是为了确保无论您在应用程序中提供什么内容或功能,当您将其推向市场时,它都是完全无 bug 的,并且您添加的所有内容都能完美运行。好的,所以这就是运行那些测试的想法。其次,它允许您轻松地编写和运行测试。现在,Piest 是其中一个测试框架,您可以在其中非常轻松地编写测试。使用 Piest 编写测试非常方便。编写测试非常容易,运行这些测试也非常方便。好的。所以,正如我提到的,在这种情况下编写测试非常容易。所以,我们可以说 Piest 也是一个非常简单的工具,对吧?因为如果编写和运行测试本身就很简单,那么使用 Piest,您就可以用 Piest 库完成所有这些工作。您只需编写测试并简单地运行它们。所以,当这两个情况都得到满足时,我们可以轻松地说 Piest 是允许您轻松编写和运行测试的库之一。好的,我希望这很清楚。接下来,Piest 实际上可以用来非常轻松地构建一个简单的测试。好的。现在,假设您只想创建一个非常简单的测试。在这种情况下,借助 Piest 库,您可以非常非常轻松地构建那个简单的测试。是的。所以,正如我之前提到的,编写和运行测试很容易。所以,这是我正在做的相关一点。您可以非常轻松地构建可扩展的测试。好的,它是一个自动查找您编写的测试并运行它们的工具。所以,无论您自己编写了什么测试,它都会自动找到它们并运行那些特定的测试。好的,这就是 Piest 的用途。它特别用于运行测试用例。它之所以被优先使用,是因为它是最容易用于运行和执行测试的工具之一。测试本身编写起来非常容易,并且它有一个直接的测试编写指南。此外,它可以自动检测您编写的测试并运行那些特定的测试。所以,我希望我在这里提到的关于 Piest 是什么这四点说清楚了。现在,让我们谈谈 Piest 的功能是什么。我在这里列出了 Piest 的四个功能。让我们逐行逐行地看。好的。首先,Piest 包含有用的插件。好的。所以,实际上 Piest 是我们的测试框架之一,我们的工具之一,它也包含有用的插件。所以,当您使用它们时,您可以根据您需要执行的功能来简单地使用那些插件。好的。Piest 不需要任何 API 即可使用。好的。现在,使用这个特定的工具,无论您称它为库、工具还是框架,无论您怎么称呼它,Piest 都不需要任何 API 供您使用。所以,它不像您总是必须设置某种 API 才能使用 Piest 中的其余功能或类似的东西。您可以运行测试,也可以编写测试。不是那样的。因此,它实际上是一个非常简单易用的工具。所以,从这个意义上说,您也不需要任何 API。好的。接下来,Piest 用于运行单元测试和文档测试。现在,有两种类型的测试。第一种是单元测试。您可能也听说过单元测试,对吧?所以,Piest 允许您运行单元测试和文档测试。好的,这是两种类型的测试,用于解决您在这里拥有的函数。所以,是的,通过这个,它实际上允许您,是的,使用 Pi test,您可以编写相应的代码,并且您可以运行单元测试和文档测试。好的,接下来,Pi test 可以作为方法或函数编写。现在,Pi test 可以编写,好的,让您想对任何情况执行测试,对吧?所以,在这种情况下,您可以做什么?您可以简单地创建一个方法,或者您可以创建一个事实,对吧?那就是借助 Pi test 本身。所以,它不是说 Pi test 只能使用函数编写,或者只能使用方法编写,或者任何任何特定的东西。使用 Pi test,您可以编写 Pi test,形式为方法或形式为函数。所以,无论您做什么类型的工作,或者您实际上喜欢什么,您都可以根据情况编写 Pi test。好的。所以,这些是我们拥有的 Pi test 的一些功能。所以,让我再回顾一遍,正如它所说的,首先。

在所有 pi 测试工具中,有用的插件,你可以用一种非常简单的方式来称呼它们。所以插件也可以称为扩展。好的,这就是这个想法。然后这个不需要任何 API 来使用。所以你不需要任何 API 来使用 piest。它实际上是一个非常非常简单的工具。你有一个安装过程。你安装好它,然后你就可以直接使用相应的 piest 来编写你的代码了。好的。你不需要任何 API 或任何特殊的工具来编写 pi test 等等。对吧?在这种情况下,它不是必需的。所以这就是为什么它被认为是简单的工具之一。好的,这就是为什么在上一张幻灯片中,我提到了 piest 是什么,我说它写起来和运行起来都非常容易。这就是我提到这句话的唯一原因,为什么它写起来和运行起来都非常容易。这就是原因,它不需要任何 API。接下来 Python 用于运行另一个单元测试和文档测试,我之前已经提到过,有两种测试。第一种是单元测试,第二种是文档测试。所以 pi test 用于运行这两种测试。最后但同样重要的是,piest 可以写成方法或函数。所以 pi test 是一个工具或框架,无论你怎么说。所以在 pi test 中,你可以声明一个方法,也可以声明一个函数。在这种情况下没有疑问或问题。好的。所以希望我非常清楚。现在我们将讨论 piest 的优点以及这些优点是什么。所以这里列出了 piest 的优点。让我们逐行逐字地看一遍。好的。所以 piest 的第一个优点是它是免费且开源的。为什么?这是我说的第一个也是最重要的优点,它是免费且开源的。这意味着它不向你收取任何费用或类似的安装费用。好的。你只需要一个非常简单的命令。只需输入该命令,pi test 就会安装在你的设备上,然后你就可以继续进行测试或任何你想做的事情。你可以继续进行。好的。所以它也是免费且开源的。开源意味着它也有官方库和官方网站。所以你只需要去那里,你就会找到关于 piest 的大量文档。所以你可以阅读这些文档并了解 pi test。好的。所以它是免费且开源的。接下来,它允许你并行运行多个测试。好的。它允许你并行运行多个测试。比如说你想同时运行一两个测试。好的。你无法在同一个地方运行两个测试,也无法在单个代码文件中运行。你无法同时运行这两个测试,对吧?所以,Piest 是一个框架。它是一个工具,或者你可以称它为一个库,它允许你并行运行多个测试。好的?这意味着你可以同时运行 2、3、4、5、6 个或任意数量的测试。好的?无论你想一次运行多少个测试,你都可以一次性运行所有这些测试。好的?所以这是 piest 库提供的另一个非常重要的功能。接下来,它允许你运行整个测试套件的子集。好的,如果你还记得测试套件,我们曾经学过 selenium。所以 selenium 有一个测试套件。它有一个完整的测试套件,我们在 selenium 中拥有。所以它有 web driver、RC 和 IDE。所以我们在 selenium 中有测试套件。所以我们只是说你可以运行整个测试套件的子集。所以如果这个 piest 是允许你运行这些测试套件的库之一。所以你也可以用它来运行这些测试套件的整个子集。好的?所以希望这一点很清楚。接下来,它有一个非常简单的语法,所以很容易学习。所以,你在 piest 中使用的语法是用来写测试的。所以它超级超级超级简单,而且语法非常简单。所以当语法简单时,我们学习起来当然就容易多了。对吧?所以它有一个非常简单的语法,而且很容易学习。我们稍后也会看一些例子。接下来,它允许你在执行过程中跳过某个主题。现在,假设你已经写了一些测试,而你只是想在这种特定情况下跳过某个主题。好的?所以如果你只是想跳过代码的某一部分或在执行过程中某个主题,是的,你也可以跳过那个主题。好的?所以即使那样,它也不会给你任何错误或类似的东西,如果你跳过某个主题。对吧?所以这就是为什么它说它允许你在某个特定测试正在执行时跳过某个主题。对吧?所以这些是 piest 的优点。现在我们将学习如何安装 piest。好的?所以在 Python 编程语言中,piest 是专门为 Python 设计的。在 Python 中安装任何库,我们都使用一个非常简单的命令,这是安装任何库的标准方法。好的?所以我们在 Python 中使用的语法是输入 pip,然后是 install,然后是你想要安装的库的名称。现在在我们的例子中,我们想要安装的库叫做 piest。所以在这种情况下,我只会输入 pip,然后是 install,然后是 piest。但是我们应该在哪里输入这个命令呢?所以再次让我告诉你,在哪里输入这个命令没有限制。没有地方你不能或不应该输入它。看,如果你正在使用任何 IDE,并且该 IDE 已经集成了终端,你可以使用它。例如,在我的例子中,我将使用 PyCharm。PyCharm 自带终端。好的?所以在这种情况下,你可以在那个终端中输入命令。你只需要输入 pip install Piest。现在,假设你正在使用一个没有自己的安装终端的 IDE。在这种情况下,你可以打开命令提示符并在此处输入此命令。pip install piest。好的?所以,我希望我已经清楚了如何安装 piest,即在 Python 中安装任何库,我们使用一个非常简单的语法,这是常用的库安装语法。该语法是 pip install 后面跟着你的库名。所以安装 piest 的具体语法是 pip install,我的库名是 piest。所以总共就是 pip install piest。当我们转到 pycharm IDE 时,我也会向你展示如何安装 piest。这里的第一项是关于识别测试文件和函数。好的?所以,让我们继续看看。现在我们将学习如何识别测试文件和函数,让我们看看在这个特定部分有什么。好的?现在,假设你想运行一个测试文件。好的?假设我给你一个场景。我给你一个情况,你想运行一个测试文件,但你没有指定文件名。但在那种情况下,你想运行一个测试文件,而你没有指定文件名。那么会发生什么?在这种情况下,piest 将自动运行该文件。好的?Piest 已经有了自己的格式。所以它会自动运行遵循该特定格式的文件。以 test 开头然后后面跟着任何内容的文件,或者与双星号和 test 模式匹配的文件。所以如果你有这样的文件或这种特定格式的文件,那么 piest 将自动运行你存储在目录或子目录中的所有这些格式的文件。它将快速运行所有匹配 test 后跟任何内容或任何内容后跟 test 的格式的文件,如果你没有指定要运行的文件名。好的?所以它所做的是它会自动拾取那些文件,测试文件。好的?我们有一个命名测试文件的特定格式。所以当你使用该特定格式时,它将自动识别为测试文件格式并相应地运行它。对吧?这就是它的工作原理。好的?现在,下一件事是它也要求测试函数的名称以 test 开头。现在,让我们看看你以 test 开头。好的?所以,在这种情况下,它也可能要求测试函数的名称以 test 开头。在运行测试之前,它还需要一个测试函数的名称。接下来,假设一个函数采用除以 test 开头以外的任何其他格式,那么它就不将其视为测试函数。我之前也提到过。我再说一遍。如果你有一个文件,并且该文件不遵循 test star 或 star test 的格式,那么它就不会将其视为测试函数。无论你在该文件中写了什么,无论你放了什么类型的测试,如果它不是 test_ 或 _test 格式,它就不会将其识别为测试函数,对吧?所以,我希望我在这里清楚如何识别测试文件和函数。所以,如果我向上滚动,假设你想运行一个测试文件,但你没有指定要运行的特定测试文件的名称。所以,在这种情况下,piest 会自动拾取以 test star 或 star test 格式命名的文件,这些文件存储在你的目录或子目录中。它将使用该特定格式并自动运行所有匹配 test star 或 test star 模式的文件。对吧?这就是它在这里要做的事情。接下来,它还需要一个测试函数来启动该测试。在开始测试之前,它还需要一个测试函数的名称。如果一个函数的命名方式不是 test star 或 test 格式,那么它根本不将其视为测试函数。对吧?所以,我希望我在这里非常清楚如何识别测试文件和函数以及我们如何识别它们。所以现在我们将开始我们非常基本的测试实现。好的?现在我将解释如何编写一个非常基本和简单的测试。让我们继续。我们有 13 个非常简单的步骤,这些步骤总是遵循和使用。然后我们将继续编写我们的测试。好的?这里有我们非常基本的测试实现。所以,让我们按照这些步骤来编写一个基本的测试。第一个步骤是创建一个目录。好的?创建目录是一个非常重要的步骤。你需要做的一个重要部分。好的?然后在你刚刚创建的目录中制作一个测试文件。好的?所以对于测试文件,我已经告诉你我们如何制作它。我们以 test_ 或 _test 格式制作它。等等。所以在这种情况下,你可以根据元素来命名文件。仍然是星号,这意味着在 test 之后你可以添加任何你需要的东西。例如,我可以将我的测试文件命名为 test a test one test one 或 test two。文件名称可以是这样的。不一定非要将文件命名为 test asterisk。好的?这里不需要。你可以在开头或结尾放置 test。怎么做并不重要。重要的是 test 应该写在你的文件名开头或结尾。只有这样它才会将你的文件视为测试文件。下次我将我的测试文件命名为 test one。好的?Test demo。所以是的,那是我的测试文件。好的?所以,确保你写了正确的东西。所以,在我们第一步创建的目录中。现在,在该目录中创建测试文件,使用你想要使用的任何名称。然后,将代码添加到测试文件中。现在,之后,添加所有你想要的代码。放入你想要编写的函数。在测试文件中写下你想要的任何程序。只需写出来。好的?所以,这是一个非常简单的步骤。这实际上是如何编写一个非常非常非常基本的测试。好的?让我们转到 PyCharm,然后我将向你展示如何实现这一步。现在,让我们做一个非常快速的实现,并动手实践如何编写一个非常基本的测试。对吧?所以我现在在 PyCharm IDE 中,我们将在 IDE 中编写该测试。现在,不一定非要只使用 PyCharm。无论你习惯使用哪个 IDE,你都可以使用它。好的?所以,希望大家都能明白。现在,我们如何在这里开始?首先,你需要去相应的,比如右键点击相应的文件夹。好的?点击新建,然后点击这个 Python 文件。现在,输入你想要输入的相应 Python 文件名。现在,请记住我关于这两点条件。第一个条件是,你需要在开头放置 test,或者在结尾放置 test,对吧?要么在开头,要么在结尾,但你必须放置这个词,那就是 test,记住?所以在这种情况下,我们怎么做?要么写 test_ 或 _test。这两种都可以。我已经为自己制作了一个测试文件,但我会做一件事。我可以在这里写一个新文件,让我们看看 test 和这个 code 2.1。好的?它将是 test_2。好的?太好了。他可以为你制作 Python 值。就在这里,我有了我的 Python 文件,我正在编写我的测试,以便运行这些东西。好的?所以,我将在这里放入基本的测试实现。其次,我也会在这里放入文件执行,即你如何执行相应的文件。好的?首先,我将导入模块,即 math 模块,因为我将使用一些 math 的东西。我将导入 math。现在,我正在制作我的 false 函数。现在,在制作 false 函数时,你也有一个需要提及的东西,那就是你需要提及 test 在开头。写 test_ 或 test,简单地 test。在你前面写上任何名称都可以。但如果你正在制作一个测试,这里是关键。所以确保 test 在前缀中。我会写成 test,然后是 41。这对我来说是可行的。我放上冒号,然后获取,好的?现在我将拥有 n,比如说我放一个数字,那就是 4。现在我将在这里使用我的函数,即 assert fun。那么它有什么用呢?简单来说,当我们用 Python 代码编写代码时,我们使用什么?我们使用 if 条件,对吧?比如说我想检查这个数字是否等于那个,或者它是否大于或等于那个,等等,对吧?所以在这种情况下,我们使用这个 assert 函数。在这里,在 pi test 中,你使用这个,所以它是一种条件,对吧?无论你在这个 assert 函数之后输入的条件是什么,如果该条件为真,它将显示你的一个测试用例已通过,如果该条件为假,那么它将显示该相应测试用例已失败,对吧?所以希望我对此很清楚。所以首先我将把 math 的平方根放在括号里,我们有 n,好的?它等于 5,并且不应放置冒号。我们使用 print 语句,就像使用 assert 函数一样。好的?下一个测试是 test_2。好的?所以,抱歉,这里应该是两个。好的?所以,如果 4 的平方根等于 2,那么在这种情况下,如果这个条件为真,那么这个相应的测试将显示为通过。好的?向下。我将在这里输入另一个条件。我的另一个条件是 assert。比如说,如果我输入 6 * 6 等于 35。好的?我的第二个测试用例,我想要放在那个地方。所以再次 assert 是同一个函数。如果你的条件为真,它将显示测试用例已通过,否则你的测试用例将失败。现在,这个 assert 是 Python 中我们拥有的函数类型。好的?所以这里不需要使用任何额外的东西。我也会输入我的第三个条件。Test_,这里是三。我放上括号,然后向下。这里也有 assert。比如说我的第三个条件我想检查的是 21 是否等于 12?好的?我的第三个条件。现在我们知道这个相应的条件不会是真的,对吧?这不是正确的事情,对吧?这不会是真的,这会失败,这不会通过。它会失败,因为 6 乘以 6 不是 35,而是 36,对吧?这里 21 也不等于 12。所以在这种情况下,这个测试也会失败。好的?所以希望我对此很清楚。我提到的所有三个案例。现在,在运行相应测试之前,我有一件事要告诉你。如果我从每个函数中删除这个 test 呢?如果我删除它呢?好的?你也应该知道如果我从其他所有函数中删除 test 会发生什么。那么它会给你什么?等等。所以我们如何运行它?要运行它,我已经将这个终端连接到我的 PyCharm。所以,我将打开这个终端并输入 pi test。所以,这是你用来运行相应测试的命令。现在看看它显示了什么。它显示了收集到的零个项目,什么也没显示。它只是在这里退出了。为什么?你已经在这里制作了一个测试文件。Test_1 是正确的。那是绝对正确的。那是正确的事情。但为什么它显示没有收集到的项目?因为你在制作函数时没有在开头添加 test。这就是我告诉你确保将 test 放在开头的原因。现在,这个下划线不是必需的。好的?你可以使用下划线,也可以不使用。这两种情况都是正确的。看,我没有使用它,这里我使用了。两者都是有效的案例。所以,它也会运行它们。好的?所以,这是我的终端。好的?我可以在这里输入 pi test,然后按回车键。好的?现在,看看这个。我刚刚得到了一些结果,一些输出。现在,让我们理解一下我们在这里得到的输出。所以我将从这里带你走。看,之前它显示了什么?它显示了零个项目被收集。但现在它显示了三个项目被收集。现在你看到的开头的这个绿点意味着一个测试已经通过。而你看到的这两个 F 意味着两个测试已经失败。所以一个通过,两个失败。好的?现在这里显示 test two test two 是一个显示断言错误的函数。那么这个断言错误是什么?所以,看,每当你使用 assert 函数,并且该条件和相应的测试失败时,它总是会为你生成一个断言错误。好的?请再次记住这一点。每当你编写一个测试并使用 assert 函数,并且该条件失败时,这意味着你的测试失败了。所以它会为你引发一个断言错误。好的?这就是为什么对于 test_two 函数,让我们看看函数是什么。所以这是我的 test_ 函数,对吧?所以这里我们得到了 6 乘以 6,我们写了。所以这就是为什么我的测试用例在这里失败了。好的?所以红线显示了失败。好的?然后我的 test three 也失败了。所以在这个 SR21 等于 12,这也是我失败的案例之一,因为它不正确。所以在这种情况下,我再次收到一个断言错误。所以,看,最后它也显示了你的测试信息的非常简短的摘要,即在 test one.py 文件中,test two 失败了,并且这是你输入的条件,它失败了。然后在 test one.py 文件中,test three 也失败了,这是具体的结果,你在这里输入的条件,最后它显示你的两个案例失败了,一个案例通过了,对吧?所以希望我非常清楚我刚才解释的这个特定案例,关于如何做到这一点。现在我将在这里结束。现在,让我们继续。好的?我将做什么?我将注释掉这里的所有这三个案例。然后我将向下写一些新的条件。好的?所以,让我们定义为 say test one,然后是冒号,转到下一行,我的第一个条件是 say assert 21= 21。好的?现在,我将添加正确的测试用例。比如说 test two,然后是括号,冒号,向下,我的第二个条件将是 say 3 * 3 = 9。好的?所以,我添加了这两个案例。现在,我将再次尝试运行这个文件。所以,我将再次输入 fives here 然后按回车键。现在,让我们看看我们得到什么结果。看它显示了什么。它显示收集了两个项目。它显示了两个绿点。这意味着你的两个文件,你的两个案例都通过了。而且看它显示了什么。它显示了两个通过,耗时如此之短。太好了。现在,我将关闭它。对吧?所以,希望现在很清楚如何编写一个非常基本的测试,以及如何简单地执行文件。现在,我们只执行了一个文件,对吧?这是唯一一个文件。如果你想执行,比如说我再创建一个新的测试文件。我也会在这里做。对于第二个文件,我有 test,然后是 code 2.py。好的?我将按回车键。我将做什么?我将按 control + D。所以,它将删除我在这里写的所有内容。好的?现在,我的文件一中的所有内容都已取消注释。在我的文件二中,我将快速写点东西,因为我想向你展示如何运行多个文件以及如何单独运行单个文件。所以,在这里,我将 say my function name is test,然后是 false。比如说我的函数。好的?放上冒号,然后向下。所以,这里是 assert,比如说我将输入 12 + 12 = 24。好的?然后这里是我的第二个函数 div。在其中,我有 test,然后是 second。好的?放上冒号,然后让我们看看这里的第二个条件是,好的?比如说 14 - 2 = 10。好的?那是双等号。所以不是单等号,而是双等号。好的?所以,14 - 2 = 10。对吧?比如说,这是两个案例。现在,我将继续并点击终端。好的?现在我有两个文件,test one 和 test two。我将在这里直接运行我的文件,作为 file test。好的?看看它做了什么?它实际上运行了这两个测试文件。它收集了什么?它在 test_1.py 文件中收集了总共五个项目。一个案例通过了,两个失败了。让我放大一下,这样你就可以看到我试图向你展示的内容。看,现在在这里,绿点表示一个通过了。FF 表示 test two 文件中两个失败了。所以,总共有五个项目。现在,让我们向下。现在,看看它显示了什么。它显示了,对于 test two,这是你提到的 test two,它失败了,它显示了断言。失败的原因我已经告诉你了,对吧?向下到 test three,这是失败的那个。好的?Test 和 test second 和 test second。好的?这是 test second 中失败的那个。所以,简短的摘要是什么?这是你的摘要。所以,在这两者中,这是你的摘要信息。在 test 1.py 文件中,test two 失败了。在 test 1.Y 文件中,test three 失败了。而在 test 2.y 中,test 失败了。所以,总共有三个测试失败,两个通过。对吧?现在,这是完整的概述。现在,它自动运行了这两个测试用例。它自动运行了这两个测试文件。现在,比如说我想运行一个特定的文件。在这种情况下,我将在这里输入,我将输入 piest 和我想要运行的文件名。比如说 test_2.p。好的?然后是 -p,然后按回车键。现在,它将做什么?看,它只为你运行了一个文件,那就是 test two test two。在这个 test_first 中通过了,test second 失败了。所以,这里有一个失败的测试和一个通过的测试。对吧?所以,希望我非常清楚这些事情。首先是如何编写一个非常基本的测试。第二是如何运行单个文件。第三,如何运行多个测试文件。好的?现在,让我们学习运行测试套件子集的不同方法。好的?所以,有几种不同的方法可以做到这一点。让我们逐一了解它们并理解它们是如何工作的。对吧?所以,关于测试套件的子集,我已经告诉你了,我们有一个完整的测试套件,正如我之前提到的,IDE、RC 和其他几个。现在,比如说你有大量的测试文件,每个文件都包含许多测试。对吧?所以,比如说你有大量的测试文件,并且在每个文件中你都写了很多测试。好的?现在,比如说你想运行特定的一组测试。例如,你有许多文件,并且在一个文件中你写了很多测试,现在你有一个情况,你想从那个文件中运行特定的一组测试。那么,在这里使用哪些方法或工具来运行测试套件的子集呢?通常有两种不同的方法。第一种是根据应用的标记来决定,选择一个组来运行测试。现在我们这里有标记,这些标记实际上是应用的,这些标记有点像提示。我们稍后会更详细地讨论这一点。所以有一些标记被应用了,你可以根据你使用的标记来运行。你可以选择组并运行这些测试。所以这是你可以做的一种方法,根据你设置的标记来决定,并根据这些标记选择组并运行这些测试。好的?继续。第二种方法是根据测试名称使用子字符串匹配来决定。选择组来运行测试。第二种方法是你可以根据测试名称使用子字符串匹配来决定。通过子字符串匹配,你可以根据测试名称选择要运行的测试,并在此基础上运行这些特定测试。在这种特定情况下,你可以选择组来运行测试。所以,这两种方法你可以用来运行测试的子集。首先,我提到你可以使用标记来选择组并运行测试。其次,你可以使用测试名称的子字符串匹配来选择组并运行你想要的任何特定测试。在 piest 中,你也有这些选项。例如,如果你有很多测试文件,并且每个文件都包含很多测试,在这种情况下,你可以简单地使用这些方法,设置好东西,然后相应地运行它们以获得你想要的输出或运行你想要的特定测试用例。所以,这是我之前告诉你的关于那种情况的两种方法。现在,让我们谈谈测试是如何分组的。好的?所以,我们确实有一个命令。但在我们开始之前,有一些事情你应该记住。所以,让我们先来回顾一下。使用 piest 创建的函数允许你为它们添加不同的标记。好的?现在,这是需要注意的重要一点。使用 piest 创建的函数。好的?所以,那些特定的函数允许你为它们添加不同的标记。好的?所以,如果你有一个函数是作为 piest 测试创建的,那么你就可以为那个特定的函数添加不同的标记。好的?接下来,我们使用标记为测试用例分配功能或属性。那么,这些标记的目的是什么?我们为什么要使用它们?因为在上一张幻灯片或类似的幻灯片中,我们一直在谈论和检查标记和未标记。那么,它们实际上是用来做什么的?它们用于为测试设置功能或属性。好的?每当你想要为测试分配功能或属性时,你就会使用标记,对吧?所以,它们用于为测试分配功能或属性。接下来,parameterize、skip 等等是我们 piest 中内置标记的一些类型。所以,在 piest 中,你也有很多内置标记。所以,这里已经提到了一两个例子。例如,parameterize 或 skip。所以,这些是你可以在 piest 中使用的内置标记类型。数量不多,但是的,piest 中有一些内置标记,你可以用它们为你的测试分配功能或属性。所以,要运行标记,我们使用什么命令?我们使用的命令是 piest。之后,我们写然后放上尖括号,在里面,你指定标记_名称。在这些尖括号内,你写你的标记名称。无论你有什么标记,你都把它放在那里。好的?然后之后,你有 -p。那个 -p 也是你需要使用的命令之一。所以,这里有点不同的是,在尖括号内,你需要写标记名称,并且在 piest 之后,你也需要添加 -m。-p 不起作用。好的?所以,请确保你这样做。所以,为了对测试进行分组,首先,使用 piest 创建的函数允许你为它们添加不同的标记。好的?现在,好的,比如说你现在被允许添加标记。现在,当你,比如说,你为什么甚至使用这些标记?所以,这些标记用于为测试设置功能或属性。好的?所以,我们对需要设置的测试使用标记。然后你有 parameterize、skip 等等。这些是我们 piest 中内置标记的一些类型。所以,是的,piest 中也有内置标记,比如 parimeterize 等。好的?要运行带有标记的测试,你在这里使用一个命令,即 py test -m 标记名称,然后是破折号。对吧?所以,这些是关于分组测试的一些要点。现在,让我们看看基本上我们如何设置标记,对吧?我希望你还记得我告诉过你标记,这些是我们在这里 pi test 中拥有的另一种东西。所以,让我们看看我们如何设置标记。好的?但在此之前,我有一些东西要给你。看,我做了什么?我有这两个文件。好的?test_1 和 test_2。现在,让我们看看如果我有一个函数名是通用的会发生什么。比如说我有一个词在两个文件中都通用。那么会发生什么?现在,比如说我这里有 test_first。如果我也把它改成 test first 呢?好的?那么,如果我转到我的终端,到相应的位置会发生什么?所以我将输入一个命令 piest -k,我的词是什么?我的词是 first,对吧?右键点击,粘贴,然后是 -v,然后按回车键。所以,我在这两个不同文件中的两个函数,test one 和 test two,这两个函数都被拾取了,对吧?我的 test first 在 test_1.py 文件中通过了。在 test 2.py 中,test first 也通过了。这两个函数实际上都通过了,对吧?所以,现在看看它在这里显示了什么。它是正确的。有三个项目,三个被取消选择,两个被选择。两个选择意味着我们在这里谈论的这两个函数,它们的函数名中包含 first 这个词。所以,两者都被选中了。而函数名中不包含 first 这个词的函数,那些被取消选择了。好的?所以,我在这里得到的是它们都通过了,两个通过的案例,其余的被取消选择。对吧?所以,这就是当你的函数名包含某个词时会发生什么。好的?现在,我将把它改回我们之前使用的。好的?太好了。所以,希望你现在还记得这个命令。好的?现在,让我们学习如何设置标记。我们如何将不同的标记放入我们的测试中。所以,现在你将导入那个文件。每当你设置标记时,你都必须这样做。好的?让我们创建一个函数 defaf sli。好的?我放上括号,然后是冒号,向下。我使用我的 assert,比如说我想用的是 2 * 7 = 14。好的?现在如何制作标记?所以,无论你在哪里声明了你的 test,就在它上面,放上一个 @ 符号,前面写上 error spy test。这里是你的函数,它被标记了。然后放上你想要制作的相应标记。比如说我想要制作的标记是 um,完全让它成为 a。所以,我只是放上我想要制作的相应标记,是的,这个标记是我制作的。这是我制作它的方式。稍后,这是我的第二个函数 desk test,然后是 for B。放上括号,然后放上冒号。这里有 assert 函数,比如说我放上一些,再次,一些条件。比如说我放上 32 - 0 = 31。好的?这是 mensubai candy。再次,在它上面,我将做什么?我将制作一个标记。所以,pi test hot mark hot。比如说这是 B。好的?向下。比如说我再放一个第三个函数 div。比如说,现在我有一个标准的 force C。好的?放上括号。放上冒号,然后向下。这里有绝对函数。比如说我放上 21 = 21。好的?这也完成了。现在我将制作那个标记,为 @ phi is.mark。好的?mark t。好的?所以我的第三个标记再次被制作了。这就是你制作标记的方式。比如说这是我制作的东西之一。其次,在 test 文件中,我也将制作一些标记。让我对这个文件做一些修改。我将在这里写 um import file。好的?让我在这里制作一个标记。比如说 @ pi test.mark。然后,比如说我放上相同的名称,那就是 A。好的?让我们开始 B。如果我不放 A,我将放上某种 1。好的?这里我也将,比如说我给它相同的名称,那就是 my test do my one。看,当你制作标记时,不一定每次都需要给不同的名称。实际上不是必需的。好的?这完全取决于你的选择,你想要什么样的标记,以及你想要使用什么。好的?所以,让我们看看,我在这里导入了另一个,math 也是。所以,import math,我将在这里放入 if,比如说 test_3,在括号里放上 full,然后向下。这里有 assert 函数。好的?所以,这里比如说我只是放上这个平方根。所以,math.比如说 12 的平方根,好的?等于,我放上 2。好的?对于这个,我也能制作一个标记。所以,我可以放上 @ here goes by this.mark C。好的?这已经由我制作了。现在,对于这两个案例,这两个测试文件 test one 和 test two,我们都为它们制作了标记。对吧?现在如何运行它?以及我真正想告诉你的是什么?首先,我将简单地输入 pyest。好的?让我们看看我们得到什么结果。看,基本上和以前一样,它给你很多不同的东西。好的?断言错误,并且在 test one 中,它显示 test one 通过了,test two 通过了,中间那个失败了。好的?所以,总共两个通过,一个失败。而这个 test two 显示一个通过,两个失败。好的?所以,总共六个项目。好的?我将关闭它,然后打开终端。我将输入命令。比如说,我使用 dash 来搜索任何我想要的标记。比如说,我想搜索标记,好的?然后是 -b。所以,任何你想要搜索的标记,你都可以把它放在相应的字段中。现在,让我们从外面看看。让我最小化它。在 test one 中,我们有标记 C,用于 test C。所以,它显示这里是 test C。好的?这个 testy,它在 test one 中,并且那个通过了。所以,这意味着它显示 21 = 21。对吧?如果我转到 test number two,在这里,如果我检查这个数字 C。如果我检查这个特定的 C,标记被设置为 buy it。所以,在这种情况下,现在我的文件是 test_2。对吧?让我们输入那个 test two。现在,测试是什么?我的测试名称是 test-。所以我快速输入了它。这很好。它显示失败了。所以,这意味着这个特定的测试失败了。所以,最后,它显示了什么?它显示了失败的 test-2.py 是。所以,这个等于这个,一个失败,一个通过。所以,选中的和警告。我们有那个。这完全没问题,你会得到所有这些东西。所以,在这种情况下没问题。但这里显示一个失败,一个通过。这是绝对正确的,对吧?一个失败,一个通过,对吧?所以,这就是你如何做到这一点。让我们看看,如果我再给你一个。好的?这里我们制作了一个 dash one。好的?好的?这应该可以。A B C。让我们在这里再试一次。所以,我将在这里再次输入 piest -M。我的标记名称是,比如说 one。好的?这里我们有 -field,然后按回车键。但这也会给我一个失败,一个通过。所以,让我们往上看看。所以,对于 test,它有两个文件。呃,我的第一个是 12 + 12 = 24。这是完全没问题的。第二个是 14 - 2 = 10。所以,第一个在这个测试中通过了,第二个失败了,这是绝对正确的。对吧?现在,让我们向下。这里有一个摘要。在这个相应的案例中,这是失败的案例,一个失败,一个通过。所以,取消选择。好的?所以,希望你明白了如何根据不同类型的函数完全制作不同的标记。所以,标记可以为所有函数,所有你定义的测试用例制作,并且对于那些相应的测试用例,你可以制作标记。在制作标记之后,你只需给出相同的标记名称,或者你也可以给出不同的标记名称。对吧?所以,标记的用途是什么?我已经告诉你了,在 PPT 中我们讨论了标记,关于我们讨论过的所有内容。现在,好的?所以,在这种情况下,我已经提到了相应标记的用途。就在这里。现在,让我们谈谈 piest 中的 fixtures。piest 中的 fixtures 是什么?我们如何使用它们?对吧?所以,这里有 piest 中的 fixtures。那么,fixtures 到底是什么?Fixtures 是在它们应用的测试函数之前运行的函数。好的?所以,在你应用的测试函数之前运行的函数称为 fixtures。好的?所以,希望我清楚哪些函数用作 fixtures。我们有一些函数在测试函数之前运行。对吧?在测试函数之前,有一些函数是我们应用的,并且这些应用的函数在测试函数之前运行。所以,它们被称为 fixtures,对吧?那么,它们是用来做什么的?所以,每当你想要为测试设置一些数据时。好的?所以,当你想要为测试设置一些数据时,就会使用 fixtures。好的?现在,标记一个函数的语法是什么?哦,抱歉。我的意思是标记一个 fixture,用于创建一个 fixture。为此,你使用 @piest.fixture。现在,在最后一个,当你只是,请稍等,让我给你看,当你,呃,学习了标记,就像标记一样,你也使用了相同的命令,基本上是 @ 后面跟着标记。好的?这是在这种特定地方使用的确切命令。嗨。所以,对于 Piest 中的 fixtures,在你应用的测试函数之前运行的函数,它们被称为 fixtures。基本上,有一些函数在测试函数之前运行,而这些就是 fixtures。它们用于存储测试数据。所以,你在这里用来标记一个函数的语法是 @piest.fixture。很简单,对吧?@piest.fixture。现在,让我们快速看看如何将 pictures 添加到我们的测试中。所以,这里我将创建一个新文件。我的新文件仍然遵循标准。所以,让我们免费做。好的?然后按回车键。我的下一个测试文件已经为我创建好了,就在正确的位置。让我们开始吧。首先,我将导入 piest。现在,请非常仔细地听我说。在你编写了一个非常基本的测试之后,一个非常基本的 pi test,你没有使用 fixtures、标记或任何类似的东西,你不需要提及或导入 piest。但在你使用 fixtures 或标记的所有相应情况下,你必须导入 piest 模块。否则,你会得到各种错误。好的?所以,请确保你做相应的事情。我将在这里创建一个函数 def。is for value。好的?现在,正如我们学习了 fixtures,fixtures 是什么?Fixtures basically 在你的测试用例之前执行。所以,这些是运行在你测试用例之前的一种函数。对吧?所以,在这种情况下,我们将设置,比如说,i 的值为 20。好的?这里我写了一个非常简单的程序。但我将要做的是创建一个 fixture。我们如何做到这一点?写你的 pi test。这里是我的 fixture。f iix x tur r。这就是你制作 fixture 的方式。现在,每当你运行这个程序时,你在这个函数之后编写的任何函数或测试用例,这些测试用例将在这个 fixture 运行之后运行。之后,这些测试用例将执行。好的?比如说我的测试用例是 defaf test check one。好的?我放上括号,像这样。向下。好的?所以,让我们设置一个案例。I * 2 = 4。好的?比如说,这是我相应的案例,我们 fun。现在,这里有一件事需要提及,实际上我只是写了它来给你看。需要注意的一点是,如果你想使用这个值,也就是 I,那么在这种情况下,你需要提及你在这里使用的函数的名称。好的?a search a searchable_value * 2 = 4。现在,让我们

说,我也想创建下一个。所以它是 test_ch check 2。好的。我加了一个括号。好的。所以在这里,我向下滚动到 assert 函数。稍等一下。让我向下滚动。断言。然后我们有六。这是为了值减去 n 等于 11。好的。首先,让我在这里解释一下,然后我将继续进行其余部分。首先,导入 pi 对我来说非常重要。这就是为什么我之前已经告诉过你它为什么重要,因为在这里,我想提到 spiders,因为我正在使用 fixtures。所以,如果你写一个非常非常简单的测试,也就是说,如果你写一个非常简单的测试,没有任何 fixtures 或其他东西,那么你就不使用 spiders。但是,如果你使用任何附加组件来编写测试,那么在这种情况下,使用这个库对你来说非常非常重要。所以,导入它。接下来,fixtures 是在你的测试被执行之前运行的函数。对吧?fixtures 是一种将在你的测试被执行之前运行的函数。所以,首先这个相应的函数将运行。stake value 函数将运行,然后你的测试才会真正执行。好的,事情就是这样进行的。所以在这里,我只是为 i 设置了一个值,并在此处简单地返回了 i。然后我声明了一个函数 test check one。现在请注意,我提到了 take 和 restore value,因为这不是一个需要测试的测试用例。这就是为什么我没有在开头提到测试。但现在这些是我的测试用例,需要被测试和评估为通过或失败。所以在这种情况下,我必须在开始时编写这个测试,这对我来说非常重要。否则,它将无法识别这些是测试用例。我再说一遍。我从头开始重复。所以,请确保在编写函数时,在开头包含 test。好的,请确保这一点。好的,那么这个 test_ch check 2 就完成了,一切都安排好了。让我们快速在这里打开终端。好的,现在打开终端后,让我们看看如何编写那个特定的东西。所以现在我们将要做的就是提到那个特定的值,那个特定的,比如说,我们在两个函数中都用作注释的词。所以我们用了一个共同的词,那就是 check,对吧?所以我会在某种条件下写下来。所以它是 by test-k,我们有这个词,它是 check-然后按 n。好的。所以,这里我们有 s3 s3 和这两个。它显示了什么?它显示了,好的,不支持的操作数。所以它有两个失败的案例和一个好的,等等,怎么会这样,稍等一下,让我们向上滚动检查一下。所以 20 乘法,好的,稍等一下,让我稍微最小化一下。所以 take 和 display value i 等于 20 返回 i,这完全没问题。如果 test check one take value 2 是的,所以它是 take value uh -10 乘以 2 等于 40 等于 check 1 check 2 哦,我想这完全是正确的,我没看到任何问题,哦,让我快速向上滚动,让我打开同一个终端,看看这里到底发生了什么,好的,哦,对了,让我检查一下,是什么样的,哦,它显示不支持的操作数,那是乘法。让我向上滚动。好的,八个项目失败了。稍等一下。让我在这里检查一下。如果我像这样放置这个百分号呢?如果我像这样放置它呢?然后让我们看看会发生什么。我将打开终端,输入相同的命令 by test。之后,我们有 -ash t。除此之外,我还有 check-3 然后按 out,对吧?让我们看看发生了什么。所以是的,两个失败。这完全没问题。但它不支持操作数。但我不知道为什么它不支持那个特定的操作数,因为嗯,百分号和所有这些东西都应该被处理。到目前为止,我们已经导入了它。之后,我们正在获取值输入。我们已经获取了返回。我们已经用名称 test 制作了函数 test。哦,我太抱歉了,我没有在这里输入值。我没有输入值。所以它会显示一个错误。太好了。所以在这里,我们必须放入相应的变量,那个相应的函数名,我们正在获取值,那个 take,还有一个 foral up,好的,在这里我必须放入 take,而这个 for value 很重要,现在我将放入我相应的符号,我将放入我需要的相应符号,让我们去终端尝试一下,对吧?我将检查一下,试试看,就在那里了,让我们看看之后,我们有 dash key。嗯,我们有这个词,那就是 check,我们有这个词,那就是 sweet。按 Enter 键。现在让我们看看会发生什么。所以我想现在它正在工作。太好了。它正在工作。所以看看它给我们展示了什么。所以在这里,它告诉我,好的,对于 van,它刚刚通过了。所以对于 check one,它通过了。所以对于这个 20 乘以 2 等于 40。是的,绝对通过了。而对于 check two,它失败了。所以在这里 test check two。所以是的,20 减去 10 不是 11,而是 10。所以是的,它失败了,对吧?所以一个失败,一个通过被取消选择。好的。现在我将关闭它。太好了。我们有 uh 我会评论掉。一切都很好。现在让我们再次运行它,因为它之前显示了应该显示的东西。所以写 dash k 这里是 check pocket check 和 dash 我们按 Enter 键,应该很清楚。所以看看这里,它收集了两个项目,uh test 3. py 文件,它收集了 test check one,它通过了,而这个 test check 2 失败了。所以这里是什么?它已经获取了值 20。正如我之前告诉你的,它会自动获取。所以首先,fixture 将运行。运行相应的 fixture 后,你相应的测试用例将运行。所以 test check two 已经完成,它的值已经被获取,一切都已安排好,最后你得到断言错误,因为测试失败了,你得到一个失败,一个通过的测试。对吧?现在让我们学习参数化测试。对吧?我们之前已经学习了许多主题。现在,让我们继续学习这个特定主题。这里的含义是什么?好的,现在,我们如何设置一些参数或类似的东西?好的,让我们在这种情况下理解它。所以,当你想要运行一个特定的测试时。好的,现在,比如说,你想为该特定测试提供多个输入。好的,你明白我的意思,对吧?比如说,你有一个表单,你只是为它设置了一个测试。在这种情况下,你需要输入很多内容。例如,比如说你有三个或四个输入可以填写在那里。在这种情况下,你使用参数化来测试。现在,从参数化这个词,我希望你有一些想法,因为当我们学习 Python 时,当我们有一个函数时,我们会将某种参数传递给那个函数,对吧?所以这个参数化这个词是专门与那个概念相关的。好的。所以,请记住这一点。参数化测试意味着,当你想要用多个输入运行测试时。在这种情况下,你使用参数化来测试。对吧?我希望我对此说得很清楚。现在,标记是为了参数化测试而创建的。好的?就在几分钟前,我们谈到了标记,对吧?关于我们如何设置标记。那么,这些标记是如何创建的?好的?或者目的是什么?好的。所以标记用于参数化测试。所以,在这种情况下,当你想要设置或提供多个输入时,好的,在那个特定的地方,以那个特定的方式,一个标记被创建。好的。所以,我希望你现在能将它与我们之前讨论的内容联系起来,看看标记是如何在这里发挥作用的,以及这些东西或这些地方的目的是什么。对吧?现在我们使用的语法是什么?再次,它超级容易使用语法。它是 @符号 pest.mmark.parameterize。好的,所以你写 @符号 pest.domark.parameterize,它对你来说效果非常好。好的,所以我希望我非常清楚地说明了参数化测试,你如何进行参数化以及你为什么要使用它,对吧?以及进行那个特定事情的语法。现在,让我们看看如何参数化测试。我将在这里创建一个新的测试文件,一个 Python 文件,这将是我的 test_4。好的,让我们开始吧。好的,所以在这里,我将参数化测试。所以,首先我将导入 pi test。好的,现在,我们如何参数化测试?我们在开头放置 @符号。好的,之后,你所做的是写出你的 piest py。是的。而在这里,你放入了被参数化的函数。好的,在括号内参数化。现在,暂时,我们将把这些括号留空。我们稍后会添加。好的,我想声明一个函数,它是不同的,呃,不同的。而我的函数名是 test mole。好的,所以我们将进行某种乘法。所以,这是我的两个参数,n 和 final。我的两个参数已设置。然后我放一个冒号。而在这里,我有一个断言函数。好的。断言。我将写 k 乘以 n 等于 final。好的。而 n 的值是什么?所以我会将它们设置在 parameterize 中。好的。所以,首先我需要声明参数 n。其次,我需要再次声明一个叫做 final 的。现在,在添加逗号之后,我将创建一个列表。在列表中,我将声明几个不同的元组。在那些元组中,我将放入 n 的值和 final 的值。比如说,它是 550。好的。我的第二个元组是 660。好的。比如说,我的第三个元组是 721。好的。比如说,这是我在这里创建的三个具有不同值的元组。好的。现在,这实际上将如何工作是,首先,我的参数化函数已经被声明。我有两个参数 n 和 final。所以在这里,它识别 n 和 final。而这是我创建的函数。那是我的测试用例,对吧?我的 uh 条件,我应用了 10 * 乘法。n 的值是什么?n 的值是 50。所以 10 * 50 等于 final 的值是什么?那是 50。是的,这个条件是真的。所以你的一个测试用例将通过。对于 6 来说也是一样的。60。所以 10 * 6 = 60 在 final 中。好的,对于第三个条件也是一样的。7 21。所以 10 * 7 = 70。但这里有 21。所以你的两个测试用例将通过,而你的一个测试用例将失败。让我们试试看。稍等一下。这一边不需要放在不同的括号里。呃,好的。不要使用不同的引号。只保留单引号,因为这是 n,这是 final。去终端,输入 piest-k。你有 mul,这里我们有 -v。按 Enter 键。好的。让我们去检查一下。所以看看它做了什么。它收集了三个项目。所以你总共有三个。550 660 和 721。对吧?让我们向下滚动。这里有失败。所以 test mole mul,而对于这个测试用例,它失败了,那就是 7 减去 21。它为这个失败了。好的。所以输入值是 7,而 final 值是 21。所以在这里,你有 pi test parameterize 函数,而这个失败了。这个特定的测试失败了,对吧?所以最后,你得到了一个断言错误,因为你使用了断言函数。所以,每当断言函数失败时,你就会得到一个断言错误。所以,最后,我的简短总结是什么?我的简短总结是,失败的测试在文件中。Test_4.py。失败的函数是 test_ull。断言是你设定的条件。所以,总的来说,你有一个失败的案例和两个通过的案例。所以我希望我对此说得很清楚。这就是它的工作方式。现在,让我们看看如果我也修复它,对吧?如果我将其设置为 70,如果我回到终端,输入 piest-k,呃,这里有 mul,你添加 -v,然后按 Enter 键。现在,它将显示所有三个案例都已通过,因为 5 * 10 是 50,6 * 10 是 60,而 7 * 10 是 70。所以,我的所有三个测试用例实际上都已通过,对吧?所以我希望你对参数化函数这一部分也很清楚。在 n 个测试失败后停止测试套件。现在,当你将在 n 个测试失败后停止测试套件时。现在,比如说,你有一些值,一些数字。所以,呃,当那个数量的测试失败时,你想要的是停止那些测试。好的。所以,现在我们将理解那个特定的东西。所以我们有一个叫做 max fail 的函数。我再说一遍。它是 max m max 和 fal fail。所以这个函数可以帮助你在 n 个测试失败后停止测试套件。好的,这个 max fail 函数可以帮助你停止那个特定的东西,它首先是一个用于在 n 个测试失败后停止测试套件的函数。比如说,你想要 uh 比如说,一旦另外三个测试失败。好的,比如说,我在这里举一个非常简单的例子。每当三个测试用例失败时。之后,你想停止那个测试套件。好的,在这种情况下,这个 max fail 和 max fail 实际上是 max fail 是一个允许你这样做的函数。Max fail 意味着,在达到最大失败次数后,我想停止运行我的测试套件。好的,所以这个语法的用法是,我们有 pi test。你可以添加一个小的破折号。好的,实际上是双破折号 high test 双破折号。然后你有我告诉你的相应函数。那就是 max fail 函数,等于,而在尖括号内,你将放入你想要停止测试套件的数字,如果那个数量的测试失败了。好的。所以,为此,你有 num,它是一个参数,你需要根据你的情况设置这个值。所以,这里 num 指的是你想要停止测试的测试失败次数。这就是我告诉你的,n 是相应的 num,而 num 是参数或变量,你将在其中放入一些值。所以,在达到这个测试失败次数后,就停止我的测试套件。接下来,我们将涵盖并行运行测试的主题。好的,正如我在一开始提到的关于 Piest,Piest 允许你并行运行测试,对吧?但它是如何做到的呢?现在,让我们看看这一点。现在,让我们先获取一些关于 Piest 的更多信息。默认情况下,它是一个按顺序运行测试的工具。默认情况下,Piest 一个接一个地按顺序运行测试。这意味着,无论函数是如何编写的,比如说,第一个函数叫做 one。在它下面,我有一个叫做 two 的函数,在 two 下面,我有一个叫做 three 的函数。所以它只会按顺序运行。首先 one 将运行,然后 two 将运行,之后 three 将运行。所以它将以那种方式运行。好的。这就是所谓的顺序。好的。所以,这是 piest 中的默认行为。现在,比如说,你有一个测试套件,它包含任何数量的测试文件。你可以添加任意多的测试文件。你有 uh,你有 50,100,200,无论你有多少。你只需要把那些测试文件放进去。好的。现在,在每个测试文件中,也有很多测试需要包含和运行。你编写了很多测试文件。所以,如果你有一个测试套件,测试套件包含许多测试文件,而每个测试文件又包含许多测试。所以它需要大量的执行时间,对吧?这是一个漫长的过程,执行起来也需要很长时间。所以,为了避免长时间的执行时间,Piest 提供了一个选项,允许你并行运行测试。好的,默认情况下,Piest 按顺序运行测试,但你也可以选择在 Piest 中并行运行测试,对吧?所以,这就是需要并行运行测试的原因。好的,这就是这样做的原因。好的,现在,关于安装这个的命令。你只需要输入 pip install,然后 piest,放一个破折号,然后写 exist。好的,这是用于安装并行运行测试的必需品的命令。好的,所以我希望我对此也说得很清楚,关于我们将如何进行。对,太好了。继续。我有一个我们到目前为止已经涵盖的所有主题的摘要。让我们快速回顾一下我们到目前为止已经学习过的所有主题的摘要。首先,我们学习了如何识别测试文件和函数。在这种情况下,我们举了一个例子,比如说,你想运行一个测试文件。好的?但你没有指定你想运行哪个测试文件。所以,在这种情况下,你目录中任何以 test 开头或结尾的文件都将被 piest 自动运行。好的。所以,无论你用 test 来命名文件,无论是在开头还是结尾,piest 都会自动识别这些文件为测试文件并运行它们。对吧?所以,我希望我清楚地说明了测试文件和函数是如何识别的。好的?现在,继续,你应该知道它也要求测试函数名以 test 开头。所以,正如我提到的,无论它在哪里找到 test 作为前缀或后缀,也就是说,在开头或结尾,它都会将这些视为测试文件,对吧?而如果一个函数的名字不是以 test 开头,那么它就不认为它是一个测试函数,好的,所以,现在,让我们试试,让我们在这里尝试一下,我们正在涵盖的下一个主题是 max fail 函数,对吧?请记住,我告诉过你,我们有一个函数,在一定数量的最大失败次数之后,它就会停止运行测试套件。在这种情况下,它会在 n 个测试失败后停止运行测试套件,对吧?让我们也快速做一个实际的例子。所以,我将注释掉。让我们在这里这个文件中做。不需要创建新文件或任何东西。所以,首先,我将导入 piest 模块。好的,导入 piest。而我也将导入 math。让我们稍微使用一下。否则,我们只是在写一个非常简单的程序。所以,让我们也使用一些不同的东西。所以,我在这里使用了 math。好的,我将创建我的函数,比如说它叫做 defaf 我的测试名称是 okay fail。而在括号里,我会这样放。加上冒号,向下。好的。比如说,我声明一个 n 值。比如说它是 20。好的。我在这里使用我的断言函数。n + n= 4。这是我的第一个种类。好的。我可以用它像这样。现在,让我们看看。我想到了这个查询。所以 test SR,比如说,好的,SR 分数,放括号,向下。现在,我想到了这个平方根,比如说,它是九。所以,这里是我的条件 assert math.sqrt of n 等于好的,我放错了值。让我们向下添加我们的第三个案例。比如说,这个是 score m,这是关于乘法的那种。实际上。好的。所以,在这里,我可以简单地写 assert 6 * 5 等于 31。好的。比如说,我把这个数量的案例放在这个特定的一个里。我有三个测试用例。一个是 pi test,第二个是 math。所以,这里我们有 test ad fail test SR fail 和 test m fail。太好了。我们拥有所有这些东西。现在,max fail 函数是用来做什么的?它是你放在 max fail 函数前面的任何数字。一旦那个数量的测试用例失败了,它就不会继续前进,而是会立即停止。好的,我来给你展示一下。比如说,我在这里打开终端,我像这样写命令。我的文件名是什么?我的文件名是 test 4. py 我的文件。好的,就在这里。然后我们有 double-v,我们有双破折号,而那个 fail 函数,让我们放一个。它意味着,在我的 test 4. py 文件中,一旦我得到最大失败次数为一,如果我得到一个失败的案例,在这种情况下,停止执行我的程序。看看它做了什么。让我去相应的地方给你展示一下。看看它做了什么。它从我的文件中收集了三个项目,但只运行了两个。为什么?因为我的最大条件是,一旦达到一个失败的值,一旦一个测试用例失败,就停止执行我的文件。所以,我的一个测试用例在这里失败了,那就是 test_rr.fail。这是我的错误案例。所以,一旦它发现,好的,最大值为一,并且一个测试用例已经失败,它就不会继续处理这个。所以它没有处理下一个测试用例。所以看看它显示了 test fail 和 src fail,只显示了两个。而对于 test sr.fail,它显示这是失败的。你得到了断言错误。一个失败,一个通过。好的。而且看看它显示了什么。它显示在一次失败后停止。在一次失败后停止。现在,比如说,我再次运行它。好的。现在,比如说,我在这里写了文件名是 test 4. py-pax fail,如果我在这里放值。现在,当它得到最大失败次数时,它必须,它将在有效阶段停止。现在,让我们来看看。我的第一个案例通过了。所以那是我们的 fail test。第二个失败了 SAR fail。而第三个,也就是 M fail,那个也失败了。所以这些是我的失败。我的失败是 test.sr.fail。而这是另一个失败。Test.mfail。而且看看它显示了什么。它显示在两次失败后停止。所以,两次失败,一次正确。我希望你现在也理解了 max fail 函数背后的想法。如何使用这个 max fail 函数,它的作用是什么,如何在这里设置它,以及如何在这里正确地获得这些相应的结果。我希望我已经清楚地向你解释了我们如何为我们在这次 pieest 会话中涵盖的所有主题进行实际操作。>> 让我们通过使用 Python 进行自动化来让生活更轻松。你将学会如何自动化重复性任务,甚至构建用户友好的 GUI。>> 到底什么是测试?让我在这里给你展示一下。所以,从我们这里这个简单的词,测试,让我们首先不要深入技术定义或任何东西。如果我只是用日常的语言谈论什么是测试,对吧?我们说什么?测试基本上就是尝试一些东西,对吧?所以,测试意味着,比如说,你有一个想法或一个应用程序或你自己开发的东西,现在你只是想测试一下,看看它是否还可以。它是否已经准备好上市?它是否是我可以给别人的东西,或者类似的东西?对吧?所以,同样的方式,在软件开发领域,我们谈论测试,我们说的是,当你开发任何软件,任何产品,任何组件,比如说,它是一个网站,一个应用程序,任何你正在开发的东西,我在这里说的是任何产品,对吧?我们必须做什么?我们必须分析它,对吧?我们需要问,好的,我添加了什么功能?对吧?之后,我们需要评估哪些组件基本上有错误或 bug 出现了。为什么有必要这样做?这是必要的,以便当你的产品上市时,当它交付时,它完全没有错误或 bug。我们都熟悉这一点。如果好的,比如说,你创建了一个登录页面。让我快速举个例子。比如说,你创建了一个登录页面,对吧?在这个登录页面上,基本上,比如说,一切都完全清楚地说明了,你也附加了一些数据库。好的。现在,当你只是运行它时,比如说,无论用户名或密码,一个人保存在那个登录页面上,它都没有被保存,它显示了错误,而你已经把它发送到市场了,那是什么类型的错误,它进入了你的产品,你已经发送到市场了,对吧?那不是一个正确的方式,所以这就是测试的用途,为什么你曾经使用过,以及为什么,为什么基本上你需要进行测试。而如果你在你的端进行了测试,首先,你已经消除了所有错误,你已经消除了你拥有的所有 bug。之后,现在当你正在弄清楚并对其进行测试时,在这种情况下,你发现,好的,当我输入用户名,当我输入密码时,它没有被保存,所以我需要弄清楚这个问题,弄清楚这个错误或弄清楚这个 bug,无论它在那里,这样,当它被交付到市场时,当一个人购买了这个应用程序,或者当有人登录到这个特定的页面时,那个人就不会遇到任何错误。对吧?这就是我们真正想要的。我们想要的是,我们所做的所有事情都是绝对正确的,如果一个人正在使用这些东西,那个人不应该遇到任何困难或任何类型的错误。这就是测试的用途,这就是你需要测试的地方。对吧?现在,我们在这里只是普遍地谈论测试。我们没有深入到你是在测试软件,还是测试应用程序,还是测试任何东西。我们只是不深入那个特定的东西。对吧?所以,当你开发出软件组件或你开发出任何项目时,我们需要分析它。我们需要检查它的功能。我们需要查看你添加的功能。我们需要评估你放在那个特定应用程序上的组件。我们需要分析。我们需要评估,这些组件,这些你添加到这个应用程序,添加到这个产品中的功能,是否存在错误或 bug?如果是,那么,为什么,为什么基本上我们需要检查它是否没有错误或 bug?这样,当你交付到市场时,当用户使用那个产品时,他们不会遇到任何类型的错误或 bug,它完全没有错误或 bug,对吧?所以,这是我们真正需要对软件进行广泛测试的阶段。如果我只是谈论软件,或者我谈论产品,这是你需要真正对软件进行彻底测试的阶段。现在,什么时候进行测试?我刚刚向你解释了什么是测试,以及它的用途。那么,它什么时候真正进行?测试是在你的应用程序构建完成后进行的。对吧?当你完成构建你的应用程序后,在那之后,你进行测试。给它不同的测试用例,给它不同的数据库。我们稍后会讨论所有这些。所以,只是给你一个想法,你提供不同的测试用例,你定义它们,你给它不同的数据库,以及所有这些东西。所以,当你的应用程序真正准备好时,当你的应用程序完全构建好并准备好进行测试时。所以,在这种情况下,我们只是继续进行测试,并将它部署到不同的测试服务器或测试环境中,这样,无论需要对那个特定的应用程序进行什么测试,我们都可以在那里执行。对吧?让我快速再过一遍。让我快速再解释一下什么是测试,什么时候进行,以及为什么我们需要它。所以,一旦你开发了一个软件组件或一个项目,你必须分析和检查它的功能,并评估组件是否存在潜在的错误和 bug。这是为了确保当它发布到市场时,它是没有 bug 和错误的。这就是我们需要进行广泛软件测试的地方,对吧?什么时候进行?测试是在应用程序构建好,准备好进行测试,并部署到测试服务器或环境时进行的。这基本上就是我能说的关于测试的。测试本质上是检查其功能,看看是否存在任何错误或 bug。如果存在,我们就修复它们,如果不存在,那么它就绝对准备好上市了,并且完全没有 bug 和错误。对吧?我希望你现在对什么是测试有一个基本的了解。现在,我们将讨论什么是手动测试。所以,正如我们已经讨论过的,我们已经看到了什么是测试。现在,Selenium 中有两种类型的测试。第一种是手动,第二种是自动化。在这里,我们将讨论手动测试。让我们开始吧。让我移到第二个。好的。现在,我再说一遍,让我们不要在这里过于技术化。让我们简单地理解“手动”这个词的意思。如果我用简单的英语谈论手动,我会说手动意味着任何用手完成的事情,对吧?任何由你手动完成的事情。这就是手动的含义。而如果我谈论测试,正如我们已经讨论过的,我们实现不同的测试,我们实现不同的功能和页面,所有这些事情都是为了让我们的产品没有错误和 bug,对吧?我希望你现在对什么是测试有一个基本的了解。现在,我们将讨论什么是手动测试。所以,正如我们已经讨论过的,我们已经看到了什么是测试。现在,Selenium 中有两种类型的测试。第一种是手动,第二种是自动化。在这里,我们将讨论手动测试。让我们开始吧。让我移到第二个。好的。现在,我再说一遍,让我们不要在这里过于技术化。让我们简单地理解“手动”这个词的意思。如果我用简单的英语谈论手动,我会说手动意味着任何用手完成的事情,对吧?任何由你手动完成的事情。这就是手动的含义。而如果我谈论测试,正如我们已经讨论过的,我们实现不同的测试,我们实现不同的功能和页面,所有这些事情都是为了让我们的产品没有错误和 bug,对吧?所以,如果我将手动的简单想法和测试结合起来,我可以说,没有任何技术定义或复杂的东西,手动进行的测试就是手动测试。这不是很简单吗?是的。没错。所以,我只想请你不要直接跳到技术定义。首先尝试分析,好的,这个主题的名字是什么?简单来说,主题的名字是手动测试。手动意味着你用手做的任何事情,而测试你已经知道了。它是为了测试你的软件,测试你制作的产品,这样当它们发布到市场时,它们就完全没有 bug 了。对吧?所以,这就是手动测试定义的由来。现在,如果我更详细地谈论事情,我会说,手动测试意味着你制作的应用程序,实际由你开发的应用程序,你开发的那个产品。所以,从现在开始,我将使用“应用程序”这个词。手动测试意味着应用程序基本上是手工测试的,以查找问题。这简单地就是手动测试。对吧?所以,当你创建了任何应用程序,并且你手动测试该应用程序时,这就是实际称为手动测试的东西。现在,当你进行手动测试时,需要做哪些事情?实际存在的测试需要在每个环境中手动执行,使用不同的数据集。一开始我也提到了数据集,对吧?我们使用不同的数据集,我们甚至创建一些测试用例,然后尝试手动实现和测试我们的软件,测试产品,手动测试应用程序,对吧?所以,无论你手动执行什么测试,这些都属于手动测试。无论你执行什么测试,它们都需要在每个环境中手动完成。对吧?在每个环境中,你都会使用不同的数据集。使用这些不同的数据集后,你还将记录成功率和失败率。好的?无论你执行什么交易,无论你使用什么数据集,对于每个数据集,你都将记录成功率和失败率。所有这些都将被记录下来。这就是手动测试中实际发生的事情。比如说,你开发了一个应用程序。比如说,你开发了任何应用程序,现在你想测试它。如果你要遵循手动测试过程,首先你需要测试那个特定的应用程序在每个环境中,每个环境都使用不同的数据集。对于每个环境,你还将记录每次交易和每次测试的数据集的成功率和失败率。这就是手动测试中实际发生的事情,对吧?一切都被记录下来。但这都是关于手动测试的。它是什么,我们如何做。接下来,当我谈论手动测试时,我会说它是绝对强制性的。意思是它非常重要。它对每个新开发的软件都很重要,在自动化测试之前。所以,当我们继续进行,比如说,开发一个新的应用程序或新的软件时,在这种情况下,必须先进行手动测试,然后再进行自动化测试。我的意思是,每个新开发的软件在进行自动化测试之前都必须进行手动测试。什么是自动化测试,我们将在几分钟内讨论它,对吧?所以,让我们暂时不要过多地深入自动化测试的细节,但正如我向你解释的那样,通过分解单词。如果你将自动化测试这个词分解成两部分,第一部分是自动化,第二部分是测试。如果你分解这两部分并找出它们的含义,那么绝对,你是对的。你对自动化测试的定义是绝对正确的。我将在稍后向你证明这一点。好的。首先,让我们详细讨论手动测试。现在,手动测试中发生的事情是,你正在手工完成所有事情。你在每个环境中进行测试。你使用不同的数据集进行测试。你提供不同的案例。你记录成功率。你记录失败日期。所有这些事情。当你做所有这些事情时,它绝对需要大量的时间和大量的精力。但是,当你手动做任何事情时,当你自己处理事情时,当测试人员手动测试某物时,它确实能让你对无 bug 的软件有一定的保证。机器还没有那么自动化,以至于它们可以保证无 bug 的软件。但是,如果你自己做,是的,这让你对拥有无 bug 的软件有信心。所以,如果我再次谈论手动测试,这意味着你构建的应用程序,你构建的 Web 应用程序或任何应用程序都是由 QA 测试人员手动测试的。你执行的测试需要在每个环境中手动完成,使用不同的数据集,并且还应该记录成功和失败交易的费率。为什么需要手动测试?所以,手动测试对于每个新开发的软件在自动化测试之前都是强制性的。这种类型的测试实际上需要大量的精力和时间。但它能让你获得无 bug 的软件,保证无 bug 的软件,对吧?这就是手动测试。现在,如果我谈论挑战,手动测试面临哪些挑战?嗯,手动测试肯定有一些挑战,一些限制,对吧?这就是为什么我们引入了像 Selenium 这样的自动化工具。这种类型的测试肯定存在一些挑战。而这实际上是引入自动化测试的主要原因。所以,让我们看看手动测试中的挑战是什么。首先,它需要更多的时间和更多的资源。绝对正确。所以,当你手动做任何事情时,对吧?当你手动做任何事情时,与使用自动化工具相比,它肯定需要更多的时间。对吧?所以,这是手动测试面临的挑战之一。它实际上需要更多的时间,而且还需要更多的资源,对吧?GUI 对象大小和颜色组合等的差异在手动测试中不容易发现。所以,当你进行手动测试时,无论你创建了什么 GUI 对象,无论你使用了什么颜色组合,无论你处理什么尺寸差异,或者你试图弄清楚的不同颜色组合,所有这些东西在手动测试中实际上并不容易找到,对吧?这些东西实际上并不容易手动捕捉。之后,一遍又一遍地运行相同的测试也是一个耗时且乏味的过程。绝对。所以,当你通过手动测试做事情时,我们看到了什么?我们看到,在手动测试中,首先,无论你想构建什么应用程序,它实际上都已经被构建好了。之后,当执行测试时,在这种情况下发生了什么?测试是在所有环境中运行的。然后提供了不同的数据集,而在这些不同的数据集之后,你必须记录成功率,你必须记录失败率,所有这些事情实际上都完成了。所以,所有这些事情都是手动完成的。所以,一遍又一遍地运行相同的测试,重复执行相同的测试,这是一个非常耗时的过程。是的,它实际上需要很多时间,而且也是一个困难且有些挑战的过程。所以,这是手动测试面临的三个挑战。第一,它需要更多的时间和更多的资源。第二,GUI 对象大小提示。在手动测试中不容易识别打印和颜色组合。第三,一遍又一遍地运行相同的测试是一个耗时的过程,而且也很详细。对吧?所以,这里我们讨论了手动测试及其挑战。现在,我想向你介绍什么是自动化测试,我们实际上是什么意思。再次,我不想让你只是快速阅读幻灯片。不,我不想让你这样做。首先,用简单的英语,想想自动化到底是什么。自动化意味着使用任何机器来自动化任何事情,对吧?自动化意味着使某事自动化。测试。我们已经熟悉了什么是测试。所以,基本上,在自动化测试中,我们已经有了一个框架。我们已经有一套专门用于此目的的工具。对任何应用程序需要执行的测试都是自动执行的。所以,你不需要手动记录成功率或失败率。你不需要手动测试每一个数据集。而且你不需要在所有环境中手动运行测试。在自动化测试中不需要这些手动步骤。自动化本身意味着一切都是自动完成的。对吧?所以,在自动化测试中,无论你运行什么测试,它们实际上都是自动执行的。对吧?让我们读一下。顾名思义,自动化测试将软件测试活动并通过自动化工具集或框架执行它们。正如我在开头提到的,在自动化测试中,发生的事情是,你只需要进行任何软件测试活动,然后通过你已经拥有的自动化工具集或框架来执行它们。所以,你只需要将这些东西放入那个自动化工具集或框架中,无论你想对任何软件或应用程序执行什么测试,你都可以对它执行这些测试。现在,如果我用非常简单的词来说,自动化测试到底是什么意思?我们可以说,它是一种测试,其中一个工具自动地以定义的模式执行一组任务。自动地是自动化测试定义中必须包含的一个重要词。所以,这是一种测试,其中一个工具以已经设置好的定义的模式自动执行一组任务,并且它自动执行和执行给它的任务。对吧?这属于自动化测试。现在,这种方法实际在哪里使用?这种自动化测试方法使用由测试工具执行的脚本序列。我们已经为此编写了许多脚本。我们已经为此自动化测试方法编写了脚本程序。我们只需要使用它们,它们就会由我们这里的测试工具执行。等等,这个工具执行对软件结果的检查,并将结果与之前的测试运行进行比较。现在,自动化测试工具可以做什么?所以,在这种情况下,它可以执行对软件的检查。它可以基本上报告任何结果,它甚至可以比较结果与之前进行的测试运行。它可以比较那些测试,我们可以看到与你已经进行的任何早期测试运行结果的比较。对吧?这就是自动化测试中的内容,它实际做了什么。所以,它执行对软件的检查。它报告结果,它甚至将结果与之前的测试运行进行比较。对吧?这就是关于自动化测试。如果我给你一个自动化测试的概述,那么我们可以说,顾名思义,自动化测试将软件测试活动并通过自动化工具集或框架执行它们。所以,我们有一个工具集或框架,通过这个框架进行自动化测试。如果我用更简单的术语来说,我可以说是它是一种测试,其中一个工具自动地以定义的模式执行一组任务。所以,基本上,在这个自动化测试方法中,我们使用由测试工具执行的脚本序列。这些测试工具的作用是帮助我们对软件进行检查,报告结果,甚至将结果与之前的测试运行进行比较。对吧?所以我希望你首先了解了手动测试是什么。手动测试面临哪些挑战?这就是为什么我们需要引入自动化测试。在讨论了这些挑战之后,我们只是学习了什么是自动化测试。现在,在视频的下一部分,我们将详细讨论 Selenium。我们将介绍 Selenium。所以,现在我们将讨论它,我将指导你进行 Selenium 的介绍。这实际上是我们开始使用 Selenium 的地方。所以,让我们开始吧。让我带你去新的幻灯片。就这样。首先,我们将回顾一下谁介绍了 Selenium。基本上,谁是创始人,或者你可以说谁开发了 Selenium。之后,我们将看看事情是如何进行的,以及 Selenium 到底是什么。对吧?所以,Selenium 是由 Jason Huggin 于 2004 年引入的。对吧?所以,我们可以在这里说,Selenium 是由 Jason Huggin 于 2004 年引入的。所以,他是 Thoughtworks 的一名工程师。所以,基本上,引入某个自动化工具的想法是如何产生的?所以,他实际上正在处理一些 Web 应用程序,对吧?他正在构建一些 Web 应用程序,处理他的 Web 应用程序。突然,他意识到他需要一些测试技术。对吧?他突然意识到,好的,我需要去测试我正在构建的那个特定的 Web 应用程序。进行手动测试绝对需要大量的时间和精力,正如我们在之前的幻灯片中已经看到的。手动测试首先需要大量的时间,也需要大量的精力。为什么?因为实际存在的测试首先是手动执行的。之后,测试必须在所有环境中执行,并且你需要为它创建不同的测试用例。然后,无论成功率或失败率如何,你都必须记录下来,然后得出结论。这就是手动测试中发生的事情,而且它绝对是一个漫长、艰难且耗时的过程。所以,然后,基本上,Jason Huggin 认为,必须有一些工具,具有一些自动化功能,使测试更容易和更快。这就是 Jason Huggin 引入 Selenium 作为测试框架的自动化工具。对吧?所以,如果我快速谈论谁引入了 Selenium,那个人的名字是 Jason Huggin。他是 ThoughtWorks 的一名工程师。所以,有一天,他正在处理一些应用程序,需要进行测试。在那时,他开发并引入了 Selenium 自动化测试框架,或者你可以说工具。对吧?现在,我们使用 Selenium 或通过使用 Selenium 进行的所有测试都称为 Selenium 测试。再次,从这个词本身,它实际上告诉你 Selenium 测试是关于什么的。所以,使用 Selenium 进行的测试。我们使用 Selenium 工具执行的任何测试都称为 Selenium 测试。那么,Selenium 到底是什么?所以,它是一个开源工具。首先,第一件事是,它是一个开源工具,一个便携式框架,用于自动化在 Web 浏览器上执行的测试。Selenium 首先是一个开源的

工具,这很棒。它是一个便携式框架,所以你可以在任何地方使用它,这也是一个优点。它专门用于自动化在 Web 浏览器上运行的测试。实际上,Selenium 可以在不同的 Web 浏览器上运行。它有能力跨各种浏览器运行。对吧?所以无论我们有什么测试,它基本上都用于自动化在 Web 浏览器上执行的测试。你可以用 Selenium 测试哪些 Web 应用程序?你可以在它们上面使用这个框架 Selenium。所以,你可以测试的 Web 应用程序包括购物车、电子邮件程序,如 Gmail、Yahoo,所有这些情况。在所有这些地方,你都可以实际使用 Selenium 框架。所以,首先,它是一个完全开源的工具,基本上意味着你可以直接下载它。它不需要你为任何版本或类似的东西付费。它完全免费。之后,它是一个便携式框架,所以你可以在任何时间、任何情况下使用它,它用于自动化在 Web 浏览器上运行的测试。你可以用 Selenium 进行的 Web 应用程序测试类型包括购物车或电子邮件程序,如 Gmail。是的,这些是你实际上可以使用 Selenium 完成的事情。所以,我希望你明白了。首先,让我们谈谈谁引入了 Selenium。所以,Jason Huggin 是在 2004 年引入 Selenium 的人。所以,他是谁?他是 Thought Works 的一名工程师。他为什么以及如何想到开发和引入 Selenium 的?嗯,他当时正在处理一些 Web 应用程序,突然需要一种测试技术。手动测试是一项非常漫长、非常耗时的任务,而且实际上需要花费很多时间来完成所有这些工作。所以,这种情况就是存在需求,而那时 Jason Huggin 开发了 Selenium,一个自动化测试工具。所以,你用 Selenium 进行的所有测试都称为 Selenium 测试。Selenium 到底是什么?它是一个开源工具,一个便携式框架,用于自动化在 Web 浏览器上运行的测试。它仅用于测试 Web 应用程序,如购物车或电子邮件程序,如 Gmail 或 Yahoo。你们都熟悉购物车,而且现在每个人都喜欢在线购物等等。所以,这些是你可以使用 Selenium 的应用程序类型。现在,为什么我们要将 Selenium 与 Python 结合使用?正如我在开头提到的,Selenium 是可以与 Python 编程语言一起使用的工具之一,你也可以将 Selenium 与 JavaScript 一起使用。那么它的用途和优点是什么?为什么我们要将 Selenium 与 Python 结合使用?让我们来看看。首先,我们都熟悉 Python 编程语言。毫无疑问,Python 的重要特性之一是它非常快速且易于学习,对吧?它是一种非常简单的语言。所以,这就是我们应该优先选择 Python Selenium 的第一个原因。Python 运行速度非常快。绝对。它是一种非常快速的语言。它使用缩进来开始和结束代码块。所以,Python 中的缩进是一件非常有系统的事情,你需要非常严格地遵循。所以,假设你应用了一个条件。当你这样做时,首先在第一行写下条件,然后转到下一行,在开头留出一些空格,然后开始编写你想要放在该条件内的代码块。这就是缩进。它实际上帮助我们看到特定代码块的开始和结束位置。这使我们更容易分析所有这些事情。这就是为什么缩进的使用如此有帮助。太好了。下一个。它非常简单。绝对正确。Python 中的语法也非常简单紧凑。是的,与许多其他编程语言相比,入门非常直接且更加紧凑。我希望到目前为止,你们都对 Python 非常熟悉了。所以,你们也应该熟悉我刚才提到的特性。它速度更快,而且我们在这里使用的缩进也有助于这一点。它使用起来非常简单,而且也很紧凑。如果我将其与其他编程语言进行比较,这就是我们使用 Python Selenium 的第一个原因。第二件事是我们有一个名为 WebDriver 的工具。在 Selenium 中,我们有这个工具,对吧?WebDriver 是 Selenium 中一个非常重要的工具。我们将在接下来的视频中讨论这一点。现在,只需了解 WebDriver 是 Selenium 中的一个重要工具即可。这就是我刚才提到的工具。我一直在谈论 WebDriver,它实际上与 Python 编程语言有非常强的绑定,对吧?所以,这是用于简单用户界面的重要工具。那就是 WebDriver。它确实对 Python 有很强的绑定。这是我们优先选择 Python Selenium 的另一个原因。继续第三点。与许多其他编程语言相比,它的运行速度更快。这是真的。与许多其他编程语言相比,Python 实际上运行得更快。此外,该编程语言是免费的,并且作为开源提供,这绝对是真实的。Python 是一种开源语言,所以任何需要它的人都可以直接下载并使用它。你可以在任何环境中自由使用它。是的,这也是事实。并非你需要一个特定的环境来使用 Python。不,你可以下载任何你喜欢的环境。然后直接下载 Python 编程语言并在那里使用它。所以,我们可以说它是免费的、开源的,你可以直接下载并在你选择的任何环境中进行使用。最后一个是,它易于编码且易于阅读。这是 Python 编程语言的重要一点,也是关键特性之一。它确实很容易编写代码,而且更容易阅读。所以,我希望你现在对这五个要点,这五个使用 Python Selenium 的原因有了清晰的了解。让我快速给你一个概述。Python 运行速度非常快,并使用缩进来开始和结束代码块。与许多其他编程语言相比,它非常简单且紧凑,对吧?在 Selenium 中,我们有一个非常重要的工具,那就是 WebDriver,它对 Python 编程语言有很强的绑定。Python 编程语言运行速度很快,特别是如果我们将其与其他任何编程语言进行比较的话。所以它运行速度很快,而且这种语言也是免费的,并且作为开源提供。所以,如果你只需要它,你可以快速下载并在任何环境中免费使用它。最后,它非常容易编写代码,而且语法,你用 Python 编程语言编写的程序也易于阅读。所以,这些就是我们优先选择 Python Selenium 的五个原因。现在,我们基本上讨论了 Selenium 是什么以及为什么我们应该优先选择 Python 编程语言的 Selenium。在接下来的视频中,我们将研究 Selenium 测试的优点和局限性。现在,我们将看看 Selenium 测试的优点。让我们开始吧。首先,Selenium 测试的第一个优点是它支持各种编程语言来编写测试脚本。正如我在上一个视频中提到的,我在讨论 Python Selenium 的主题时已经告诉过你们了。我提到你实际上也可以用其他编程语言进行 Selenium 测试。我举了 JavaScript 的例子,对吧?所以,这里提到的编写测试脚本的优点是相同的。支持许多编程语言。所以,无论你是什么,无论你熟悉哪种语言,你都可以绝对选择该语言并继续编写测试脚本。另一个非常重要的优点,我甚至可以说是一个非常棒的特性,那就是它也支持各种 Web 浏览器。你可以使用 Misilla Firefox,或者你可以直接使用 Google Chrome。你实际使用的任何 Web 浏览器,Selenium 都支持许多不同的 Web 浏览器,对吧?假设你使用 Firefox、Google Chrome 或任何你想要的浏览器。你都可以直接使用它。接下来,它支持并行测试执行。现在,并行测试执行是什么,我稍后会详细讨论。现在,我们只需要了解 Selenium 也支持并行测试执行。它的意思是,给你一个概述,你可以在一个特定的应用程序上同时运行许多测试。你可以说这是并行测试执行的简单定义。Selenium 实际上支持此功能。在 Selenium 的定义中还提到的另一件事是它是开源的。所以,你可以随时使用它。直接下载并按需使用即可。它是完全开源的软件。对吧?接下来,Selenium 还支持不同的操作系统。我提到并告诉你它也支持各种浏览器。除了支持各种浏览器之外,它还可以在不同的操作系统上运行。无论你使用 Windows、Linux 还是 Mac,无论你选择什么,它都支持所有这些操作系统。所以,这些是 Selenium 测试的一些优点。那么,局限性呢?正如我在开头提到的,如果某物有优点,它肯定也会有一些局限性。所以,让我们看看 Selenium 测试的局限性。我提到它可以在 Web 浏览器上运行,对吧?我特意指出了这一点。这是 Selenium 的一个局限性。它只支持基于 Web 的应用程序。无论你构建什么应用程序,它只支持基于 Web 的应用程序,这些应用程序基本上运行在 Google Chrome 或 Mozilla Firefox 上。它只支持那些基于 Web 的应用程序。现在,每当 Selenium 测试中引入新功能时,都不能保证它们是否会起作用。有时它们可能会起作用,有时可能不会。所以,这是我们现在看到的 Selenium 测试的另一个局限性。这里有一些关于 Selenium 测试的重要最后三个局限性。在某些用例中,Selenium 就是不起作用。首先,Selenium 无法对图像执行测试。这是第一件事。它无法对图像执行任何测试。为此测试编写的代码以及其他所有内容都不支持对图像进行测试。你也无法使用 Selenium 自动化验证码。现在在这个世界上,我们到处都能看到验证码。每当你登录任何网站时,它们都会要求你填写验证码,对吧?Selenium 无法自动化这一点。所以,验证码根本无法使用 Selenium 进行自动化。最后,条形码也无法使用 Selenium 进行自动化。无论是验证码还是条形码,都无法使用 Selenium 进行支持或自动化。对吧?这些是 Selenium 测试的一些局限性。希望你理解了。但让我再回顾一下。所以,Selenium 只支持基于 Web 的应用程序。无论你有什么应用程序,Selenium 只支持基于 Web 的应用程序。它不支持你为任何其他环境构建的应用程序或类似的东西。它就是做不到。好的。第二,正在引入的新功能,它们有点不可靠。在这种情况下,有时我们会怀疑它们是否会起作用。我们对它们并不确定。所以,这就是我们对新功能不可靠性的意思。现在,Selenium 基本上无法对图像执行测试。所以,如果你想对图像执行任何测试,Selenium 就无法做到这一点。你拥有的验证码,这些不是使用 Selenium 自动化的,条形码也不是使用 Selenium 自动化的。对吧?这些是 Selenium 工具的一些局限性。最后,我们将介绍 GUI 开发。你将学习如何使用 Tkinter 等库创建交互式桌面应用程序。我们将指导你从头开始构建自己的 GUI 应用程序,使你的程序更具用户友好性和视觉吸引力。>> 所以,让我们从图形用户界面开始。正如我之前提到的,图形用户界面允许用户通过图形表示与电子设备进行交互。当我谈论图形表示时,我指的是按钮和图标之类的东西。GUI 的例子包括 Microsoft Windows 和 Mac OS。还有其他几个例子。所以,基本上这里发生的是你可以通过与图标交互来进行通信。这就是图形用户界面的基本思想。现在,让我们看看 Python 中可用的不同类型的图形用户界面库。有几个库用于在 Python 中创建 GUI。我们有 Tinter、Kivy、PyQt5、WXPYphone 和 Pygei。现在,让我们对 Tinker 有个了解。Python 的 Tkiner 只是一个标准的 GUI 库。基本上,当 Python 与 Tkinter 一起使用时,它允许你快速轻松地创建图形用户界面。它还提供了具有复杂面向对象界面的 TKGUI 工具包。所以,这就是 Tinker 的基本思想。你只需要知道它是一个 Python GUI 库,然后我们将看到如何使用 Tinter 创建一个程序。现在,如果你想用 Python Tinter 创建一个简单的 GUI 应用程序,你需要遵循一些步骤。首先,你必须导入 tkinter 模块,对吧?所以,你可以直接写 from tkinter import star 来导入 tkinter 模块。第二步是创建一个主窗口。如何创建主窗口?基本上,你创建一个 Python tkinter 对象。接下来,在创建主窗口之后,你可以向其中添加多个小部件。添加小部件后,你可以进入主事件循环来执行操作。所以,现在用户必须遵循两种主要方法。对吧?所以,首先正如我之前告诉你的,你必须导入 tkinter 模块,方法是写 from tkinter import star。所以,导入 tinter 模块后,我们接下来要做什么?我们必须创建一个主窗口。那么如何创建主窗口呢?我将在这里简单地写主窗口,它只不过是一个变量。所以,要创建对象,我将写 tk。确保 t 是大写的。然后,为了运行应用程序,我将写主窗口.main loop。所以,基本上 main loop 并不是什么无限循环,对吧?它将运行你的应用程序,然后它还会等待一个事件并处理它,一旦窗口打开。所以,这就是如何用 GUI 创建一个简单的 Python 应用程序的基本思想。现在,让我们看一个实际的例子。所以,我现在要做的是直接写 from tinker import star。所以,这基本上是我在这里导入的 tinker 模块。然后,之后我将创建一个主窗口。所以,让我写一个变量叫做窗口,我将创建对象。创建对象时,请确保 t 是大写的。现在,我们将直接写窗口.main loop。所以,我们知道 main loop 是一个无限循环,它将运行应用程序。所以,如果我执行它,你就可以看到我们创建了一个简单的 GUI 应用程序,对吧?所以,这就是 Python TK 的基本思想。现在你已经看到了如何创建 GUI 应用,让我在这里更改标题。所以,如果你现在运行它,在执行时,你可以看到它显示 tk,对吧?如果我想将标题设置为 create learning 而不是 tk,我将直接在这里写窗口标题,我将写这里欢迎来到 create learning。所以,现在让我运行它,当你执行它时,你可以看到在顶部,我们得到了欢迎来到 create learning 作为标题。在此之后,让我更改窗口大小。所以,我将直接在这里写窗口.mmin size,我将直接写这里,比如说宽度为 100,高度为 200。所以,如果我现在运行它,你可以看到这是窗口的最小尺寸。如果我点击这个最大化按钮,你可以看到这是最大尺寸。所以,让我更改最大尺寸。为此,我将直接写窗口。所以,我将直接写窗口.mmax size。再次,让我将宽度设置为比如说 300。让我们将高度设置为 800。所以,当你运行它时,你会看到这是 GUI 的最小尺寸,这是最大尺寸。对吧?所以,这就是 Python tkinter 的基本思想。所以,在创建了我们的第一个 GUI 之后,现在是时候了解小部件了。那么什么是小部件?一般来说,小部件基本上是 GUI 的元素。在 Tinter 中,小部件被认为是代表按钮、框架等的对象。所以,基本上,tickinter 提供了许多控件。而这些控件只不过是我们将在 GUI 应用程序中使用的小部件。对吧?正如我之前提到的,它们代表按钮、标签和文本框。所以,Tkiner 中有不同类型的小部件,如 label、button、entry、check button、canvas、frame 等等。所以,这就是小部件的基本思想。现在,让我们理解小部件的几何配置。所以,我们已经了解了小部件。但是,如果你想组织小部件,你需要几何管理器类。主要有三种几何管理器类。Pack、grid 和 place。添加小部件后,我必须组织它。所以,我将使用这三个几何管理器类。第一个是 pack。当你使用 pack 函数时,这意味着你将小部件放在顶部。接下来,说到 grid,它用于在类似表格的结构中组织小部件。所以,当我谈论类似表格的结构时,这意味着行和列。接下来,我们有 place。它用于在特定位置组织小部件。所以,我将在这里写 x 和 y。所以,如果你在这里写比如说 x= 20 和 y= 40,这意味着从左到右放置一个特定的小部件,然后说到 y,这意味着从上到下放置任何小部件。所以,这就是小部件几何配置的基本思想。所以,现在是时候讨论 Python tkinter 中存在的不同类型的小部件了。所以,我们拥有的第一个小部件是 label。所以,当你谈论 label 时,基本上它用于表示一个显示框,其中添加了图像或文本。那么 label 的语法是什么?所以,我将在这里写一个简单的 label,然后在括号里,我将放入 master、options=value。说到 master,它只不过是你创建的主窗口。在这里,我们可以提供几个选项作为参数。所以,在选项中,我们可以写 bg command font image width 和 height。当我谈论 BG 时,这意味着它是背景,对吧?我们也有 FG。FG 表示前景色。所以,当你写 FG=blue 时,你的文本将是蓝色的,对吧?所以,这就是 label 小部件的基本思想。现在,让我们看一个实际的例子。所以,我现在要做的是再次导入 tinker 模块。所以,我将直接在这里写 from tinker import asterisk,然后之后我必须创建我的主窗口。所以,让我写变量名窗口,我将创建对象 TK。现在,我将直接在这里添加一个小部件。所以,我必须添加一个 label 小部件,对吧?我们知道只有在创建主窗口之后才能添加小部件。所以,让我在这里写 Elvin=label。所以,这是我的 label 小部件,对吧?所以在 label 这里,我必须指定 master。我的 master 是什么?Master 并不是什么,而是主要的。所以,我将直接在这里写窗口,然后我将在选项中提供几个选项。所以,让我在这里写选项。比如说,我只写 text,我将放入 great learning。所以,这是 label,对吧?而且,如果我想组织小部件,那么我必须使用几何配置,对吧?所以,让我先使用 elvin.pack。如果你想运行主应用程序,那么我必须写窗口.main loop。所以,如果我现在执行它,你可以看到 great learning 已经被打印在这个窗口的顶部,就在中间。所以,这就是 pack 几何类的作用。现在,在 pack 之后,如果我使用比如说 grid。所以,我们知道 grid 包含行和列,对吧?所以,我在这里要做的是直接写 row=0 和 column=比如说一。现在,如果我执行它,你可以看到 great learning 已经被打印在这里。所以,到目前为止,我们才刚刚开始编码。所以,当你写更多的代码时,我们也可以更改行和列。然后,我们还有一种几何类,那就是 place,对吧?所以,我将直接在这里写 place。基本上,使用 place,如果你想在特定位置组织小部件,你可以设置 x 和 y。比如说,我写 x= 5 和 y= 10。所以,基本上这是位置,当我写 x= 5 时,这意味着你正在放置你的小部件,从左到右。同样,当我写 y= 10 时,这意味着你正在放置你的小部件,从上到下。让我运行它。所以,当你运行它时,你可以看到 date learning 已经被打印出来。如果你想把它放在另一个位置,你可以直接写 x= 50 和 y=比如说 100。如果你运行它,你会看到我们得到这样的输出。所以,这就是 label 小部件的基本思想。现在,比如说我们已经创建了一个带有文本 create learning 的 label 小部件,对吧?让我运行它。所以,如果你看,这是 create learning,就在这里。现在,如果我想添加背景颜色以及前景色,我该怎么做?我将直接进入选项,比如说我想让背景颜色为蓝色。所以,我将直接写 blue。对于前景色,我将直接写 red。所以,当你写 FG=blue 时,你的文本将是蓝色的,对吧?所以,这就是 label 小部件的基本思想。现在,让我们看一个实际的例子。所以,我现在要做的是再次导入 tinker 模块。所以,我将直接在这里写 from tinker import asterisk,然后之后我必须创建我的主窗口。所以,让我写变量名窗口,我将创建对象 TK。现在,我将直接在这里添加一个小部件。所以,我必须添加一个 label 小部件,对吧?我们知道只有在创建主窗口之后才能添加小部件。所以,让我在这里写 Elvin=label。所以,这是我的 label 小部件,对吧?所以在 label 这里,我必须指定 master。我的 master 是什么?Master 并不是什么,而是主要的。所以,我将直接在这里写窗口,然后我将在选项中提供几个选项。所以,让我在这里写选项。比如说,我只写 text,我将放入 great learning。所以,这是 label,对吧?而且,如果我想组织小部件,那么我必须使用几何配置,对吧?所以,让我先使用 elvin.pack。如果你想运行主应用程序,那么我必须写窗口.main loop。所以,如果我现在执行它,你可以看到 great learning 已经被打印在这个窗口的顶部,就在中间。所以,这就是 pack 几何类的作用。现在,在 pack 之后,如果我使用比如说 grid。所以,我们知道 grid 包含行和列,对吧?所以,我在这里要做的是直接写 row=0 和 column=比如说一。现在,如果我执行它,你可以看到 great learning 已经被打印在这里。所以,到目前为止,我们才刚刚开始编码。所以,当你写更多的代码时,我们也可以更改行和列。然后,我们还有一种几何类,那就是 place,对吧?所以,我将直接在这里写 place。基本上,使用 place,如果你想在特定位置组织小部件,你可以设置 x 和 y。比如说,我写 x= 5 和 y= 10。所以,基本上这是位置,当我写 x= 5 时,这意味着你正在放置你的小部件,从左到右。同样,当我写 y= 10 时,这意味着你正在放置你的小部件,从上到下。让我运行它。所以,当你运行它时,你可以看到 date learning 已经被打印出来。如果你想把它放在另一个位置,你可以直接写 x= 50 和 y=比如说 100。如果你运行它,你会看到我们得到这样的输出。所以,这就是 label 小部件的基本思想。现在,比如说我们已经创建了一个带有文本 create learning 的 label 小部件,对吧?让我运行它。所以,如果你看,这是 create learning,就在这里。现在,如果我想添加背景颜色以及前景色,我该怎么做?我将直接进入选项,比如说我想让背景颜色为蓝色。所以,我将直接写 blue。对于前景色,我将直接写 red。>> 让我把这个 blue 放在双引号里。所以,如果我现在运行它,你可以看到当它执行时,这个 create learning 的前景色将是红色,背景色将是蓝色。而且,如果你想增加它的宽度,比如说你的宽度设置为 40。现在,如果我运行它,所以当它执行时,你可以看到它的宽度增加了。所以,这就是基本思想。所以在 label 小部件中,你可以添加更多选项,如背景、前景色、图像、字体等等。是的。所以,在学习了 label 之后,现在如果我想在我的 GUI 中添加一个图像。我该怎么做?所以,让我再次运行它。所以,如果你看这里,比如说我想在这里添加一个图像。我该怎么做?所以,首先我们要做什么?让我直接删除这个。让我在这里写变量名 Ivan,我将直接使用 photo image。所以,你也可以看到它显示了 photo image 选项。对吧?所以,在这个 photo image 中,我将直接写 file。如果你看这里,让我从桌面上抓取一个文件。所以,如果你看这里,这基本上是文件,它是一个图像文件,对吧?正如你所提到的。所以,我将直接进入属性。如果你看,这是位置。所以我将直接复制它。文件名是 Python,对吧?所以,图像文件名为 Python。所以,我在这里要做的是直接写双引号。在里面,我刚刚复制粘贴了位置,文件名是 Python,对吧?所以,我将直接写 Python,它是一个 PNG 文件。直接写 python.png。现在,在反斜杠之后,我们只需要将其替换为正斜杠。所以我将直接这样写。所以,在此之后,我将要做的是创建一个 label。所以,我将直接在这里写 ln=label。在这个 label 中,我首先必须放入 master,对吧?所以,我的 master 将是主窗口。所以我将直接在这里写窗口,然后我将写选项。所以在选项中,我将直接写 image,而 image 是什么?所以,image 等于 Ivan。所以,现在如果我运行它,你可以看到我什么也没得到。为什么?因为我必须在这里使用几何类,对吧?所以,为此我将直接写这里,比如说 elvin.back。所以,现在你可以看到在输出中,我们得到了 tender 图像。所以,这就是 label 小部件的基本思想。所以,下一个我们要谈论的小部件是 button。所以,基本上 button 用于在应用程序中显示一个按钮,它也有一个非常简单的语法。你只需要输入 button,确保 b 是大写的,然后代替 master,我们的主窗口将在那里。在选项中,我们可以传递几个参数,如 bg command font image width 和 height。所以,这里我们也可以使用 command 选项。所以,当你编写命令时,基本上当我们创建任何函数时,我们将直接将该函数名分配给 command。当我们进入编码部分时,我们将更好地理解这一点。现在,让我们看看如何创建 button 的实际实现。所以,要创建一个 button,我将直接在这里写,比如说 B1 是变量名。我将写 button,我将写窗口。所以,窗口是我的主窗口,对吧?之后,让我写 text。所以,如果我在这里写 text= in,我必须再次写 P1。我可以使用 pack。我可以使用 place。我也可以使用 grid。但我将写 pack。现在,如果我执行它,你可以看到这是我的 inner button。所以,让我再次设置颜色。所以,对于背景,比如说我设置为绿色。对于前景色,我将直接设置为黄色,这是一个明亮醒目的颜色。现在,当你运行它时,你可以看到这个 enter button 有一个黄色的前景色和一个绿色的背景色。所以,现在我们已经看到了如何创建 button 小部件。现在,让我们看看如何创建一个 entry。那么 entry 是什么?在 entry 中,比如说我创建了一个小部件,它是一个 label 小部件,它的名字是 username,对吧?我想允许用户输入一些东西,对吧?这就是为什么我将创建一个 entry,我可以在其中以字符串形式以及整数形式写入值。所以,让我们在这里创建一个 entry。所以,我将直接在这里写一个 event 变量,对于 entry,我将直接写 entry,在 entry 中,我将直接写窗口,然后让我为你设置宽度。所以,比如说这个 entry 的宽度是 20。所以我将直接在这里写 even pack,现在我将运行它。所以,你可以看到当我运行它时,我得到了这个 entry,对吧?所以,我可以在这里输入字符串值以及整数。那么我们如何使用这个 entry 呢?所以,比如说你正在制作一个网站,对吧?对于那个网站,如果你想访问它,你需要一个用户名和密码。然后我们可以在那里使用 entry。我们还需要为它创建一个 button。所以,比如说你想在这里更改字体样式。我将直接写 font=。让我在这里放入 calibri。让我把字体大小设置为 20。所以我将直接写 20。现在,如果我运行它,你可以看到大小已经增加了。所以,现在如果我在这里输入 gore,它是 Calibri。对吧?现在我能做什么?如果我在这里写 BD= 5。那么 BD 在这里意味着什么?所以,BD 基本上用于表示边框的大小。所以,当我在这里写 BD= 5 时,你可以看到 entry 框看起来像这样,对吧?所以,这就是 entry 的基本思想。现在,让我们做一个简单的 GUI。所以,我们要做的是首先创建一个 label,然后是一个 entry,然后我们将创建一个 button。所以,对于 label,我将使用 employee name 作为名字。对于 entry,我将直接输入任何字符串值。当我点击 submit 按钮时,在 entry 中输入的任何字符串值都将被显示。所以,基本上,我将使用两个 label。第一个将是 employee name,另一个 label 将从没有名字开始。所以,无论我在 entry 中输入的字符串值是什么,当我点击 submit 时,该值将显示而不是什么都没有。这就是基本思想。所以,让我创建一个简单的 GUI。我将直接在这里再次写 from tinker import asterisk,这是一个符号。然后,我将直接继续创建一个主应用程序窗口。让我给它一个标题。所以,再次我将写这里窗口标题,我将直接写这里欢迎来到 create learning imag,让我直接写这里窗口最小尺寸。所以我将直接将宽度设置为比如说 200,然后对于高度,我将直接写 400。准备好了吗?所以,对于最大尺寸,我将在这里将宽度设置为 400。让我们将最小尺寸加倍。然后对于高度,我将写 800。让我写窗口.main loop,因为如果你想运行应用程序,你必须写这个,对吧?所以,正如你所看到的,这是我的输出,这是最小尺寸,最大尺寸是这个。在这里,在标题上,我得到了欢迎来到 create learning。所以,这些是我们已经知道的事情,对吧?所以,让我创建一个 label 视图。对于 label,我将直接写这里 L1=label,L1 是我的变量,对吧?所以,在这个 label 中,让我写 master。所以,master 将是我的主窗口。现在,在选项中,让我写 text。所以,对于 text,让我放入比如说 employee name。然后,我也想在这里设置前景色和背景色。所以,对于前景色,让我们使用蓝色。对于背景色,比如说我将使用红色。而且,因为这是一个 label,基本上它是一个小部件,我必须组织这个小部件。所以,为此我将直接在这里写 L1.pack。我也可以使用 pack,但这次让我使用 place。使用 place,我可以将我的小部件定位在任何特定位置。所以,让我设置 X=0,Y=10。当你运行它时,你可以看到这是我的 label,叫做 employee name。对吧?现在,让我创建一个 entry 按钮。所以,对于 entry 按钮,我将直接写这里 even=entry,even 是我的变量,再次,我将指定窗口,让我设置窗口,让我设置字体。所以,我将直接写 font,在 font 中,我将更改字体样式。让我将字体样式更改为 corbal,让我将大小设置为 18,让我们使用 bead 2。所以,为什么我们要使用 bead?正如我之前告诉你的,bead 用于表示边框的大小,对吧?对于 entry。所以,如果我在这里写 BD= 5,让我写 here even entry。所以,现在我该做什么?现在我必须放置这个 entry,对吧?所以,再次我将写这里 even.place。让我们在这里使用 place,让我设置 x= 40 这次,y= 10。如果我现在运行它,你可以看到我得到了这个输出,对吧?所以,它没有完美地出来。所以,让我调整一下大小。所以,而不是 40,比如说我写 80。现在,如果我运行它,你可以看到我得到了 employee name 作为 label。这是 entry 字段,我可以在其中输入任何名字。好的。所以,让我们也创建一个 button。所以,对于 button,我将直接写这里 B1=button。让我在这里设置 master 为窗口。作为选项,我将给出 text,比如说 enter。让我也为这个 button 设置颜色。所以,对于前景色,我将使用黄色,对于背景色,让我使用绿色。所以,现在我们也需要排列这个 button 小部件。所以,为此我将直接写 b1.place。让我设置 x=比如说 100,y= 40。我只是在这里使用随机值。现在,如果我运行它,你可以看到它是这样的,对吧?所以,让我重新排列一下。如果我在这里设置 x= 120。好的。现在它在中间了。让我们把 Y 值设置为 60。现在它出来了,完美。对吧?现在,如果我在这里输入,比如说 Gorov,然后我按下 enter,你可以看到什么也没发生,对吧?所以,我现在要做的是直接创建另一个 label。这个 label 将在这里。我将直接在上面写 nothing。然后,无论我在 entry 中输入的字符串值是什么,如果我按下 enter,那么而不是 nothing,值应该是 whatever I entered。所以,为此我将要做的是创建一个另一个 label。所以,我将直接写这里 L2=label,我将直接放入窗口。在此之后,我将直接继续设置 text 为 nothing,正如计划的那样。让我设置前景色为比如说 black。背景色,让我们继续设置为一种漂亮的暖棕色调,以营造舒适的感觉。让我放置这个小部件。所以,我认为 X 将是 120。这里我将取 Y 为比如说 90,或者可能是 100。现在,如果我运行它,你可以看到 label 没有被定义,因为 L 需要大写。现在一切正常。所以,当我运行它时,你可以看到我有一个另一个 label,上面写着 nothing。现在,我需要让它变成这样,如果我在这里输入 goroff 然后点击这个 enter 按钮,它应该工作,对吧?而不是 nothing,我希望值是 goroth 在这里。所以,为此我将要做的是创建一个变量。所以,在此之后,我将直接创建一个字符串变量。所以,让我创建一个变量 v=string variable。所以,当我在这里写 string variable 时,基本上意味着我们正在处理字符串值,对吧?所以,我们在这里创建一个字符串变量。所以,现在我将要做的是在这个 entries 选项中,我将直接写 text variable,它将等于 v,因为我们正在处理字符串值,对吧?现在,我希望我的 button 工作。所以,为此我将创建一个函数。所以,无论你创建什么函数,比如说函数名是 add text。然后我可以使用绑定函数,我将在这里写 button command= add text。现在,如何使用这个 add text?所以,我将基本上创建一个函数。所以,我将直接写这里 def add text。现在,在此之后,我将直接写比如说我的变量是 v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我把什么值放进 entry,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们知道它不会移除,除非我们使用 command,对吧?那么 command 是什么?Command 并不是什么,而是一个绑定函数。所以,在 button 中,我将直接写这里 command,让我们使用它。我将写 edte。所以,在这里你可以看到我将 edte 分配给了 command。那么这意味着什么?这意味着我创建了一个名为 edte 的函数,对吧?所以,我将要做的是?好的,让我在这里创建一个函数叫做 edte。在这个函数中,我将直接写 let's say my variable is v,对吧?所以,如果我想获取任何值,我将直接写 v.get。所以,让我创建另一个变量 x= v.get。对吧?然后,在此之后,我将直接写 u。所以,现在我将要做的是我只想打印这个值。所以,我必须写 print x。现在,正如我告诉你的,我创建了两个 label。第一个 label 是 employee name,另一个 label 上什么也没有写。我告诉你,无论我在 entry 中输入的字符串值是什么,都应该在当前什么都没有写的 label 中更新。对吧?所以,我将直接写 L2,我将使用你的 config 函数,在这个 config 中,我将直接写 text= X。那么你的 X 值在这里会是什么?所以我写了 X= V.get,我们没有添加 V=string。所以,基本上我们正在处理字符串值。所以,现在我将要做的是我将直接运行这个,比如说我输入 Gorov 在这里,然后我点击这个 enter 按钮,你可以看到我在这里得到了 Gorov,对吧?而且,如果你看输出,我也得到了 gar 在输出中。为什么?因为我在这里写了 print x。所以,现在让我们做一些更多的更改。名称已从 nothing 更改为 gar。让我们也更改颜色。所以,如何更改颜色?所以,在这个 config 函数本身,我将直接写这里 background 为比如说 yellow,然后 foreground 为比如说 blue。现在,如果我执行它。所以,让我停止并重新运行它。这次,再次,如果我在这里输入 Gorov,然后点击 enter,你可以看到名称已更改,背景颜色是黄色,前景色是蓝色。所以,这就是 label 小部件、entry 和 button 的基本思想。对吧?所以,这是一个非常简单的 GUI 应用程序。所以,下一个小部件是 check button。check button 用于将选择的选项显示为复选框。让我们举个例子。让我们以男性和女性为例。我们可以将它们用作 check buttons。现在,让我们看看语法。所以,语法很简单。你只需要输入 check button,然后在括号内,你的 master 将是主窗口。然后有几个选项可以作为参数传递。我们可以有 title、background 以及 active background。所以,这就是 check button 的基本思想。现在,让我们看看实际的实现。所以,现在你又可以看到这是基本的 tinker 编程。现在,我将直接在这里创建一个变量。让我们称之为 CV,我将直接写 check button。在这个里面,我将直接放入窗口,然后我将在这里添加 text。所以,正如我解释的,我们可以以男性和女性为例。所以,让我直接写 mail,然后我将直接写 CV。让我们在这里使用 pack。现在,如果我执行它,你可以看到我得到了 mail 作为 check button。对吧?所以,这是我的 check button。所以,下一个小部件是 frame。基本上,frame 是一个容器,用于组织小部件。那么,frame 的语法是什么?它再次很简单。你只需要输入 frame,然后是 master,然后是选项。所以,这里作为参数,我们可以传递几个选项,如 BG、BD、cursor、width 和 height。对吧?现在,让我们看看这个 frame 的实际实现。所以,现在我再次回到 PyCharm。我直接在这里写 F1 变量。让我创建一个 frame。在这个里面,我没有传递任何 master 或选项。所以我将直接写 f1.pack。f_sub_2=frame。我将直接写 f2.pack。现在,如果你运行它,什么也不会发生,对吧?所以,我现在要做的是在这里创建一个元素。让我们拿一个 label。我将在这里创建它。在这个里面,我将把 f1 作为 master。然后,让我在这里设置 text。所以我将直接写这里 text= great learning。如果我现在写 low1.pack,所以,让我运行它。当你执行它时,你可以看到我得到了 great learning。现在,我将直接创建另一个 label。比如说 L2=label。所以我将直接在这里写 F2。然后,让我写 text= bottom。我将直接写 L2 pack。所以,现在如果我运行它,你可以看到我得到了 bottom。所以,这里你可以看到,基本上我有两个 frame,对吧?great learning 和 bottom,但我想让 bottom 显示在底部。所以,为此我将要做的是你可以在这里看到我写了 F2 here pack,对吧?所以我将直接写这里 side=,我将直接写 bottom,bottom 将全部大写。所以,现在如果我运行代码,你可以看到 great learning 在窗口的顶部,而 bottom 在窗口的底部。对吧?所以,下一个小部件是 list box。list box 用于向用户提供选项列表。所以,基本上简单来说,你可以说 list box 包含一个选项列表,正如我们所知,列表可以包含不同类型的数据值。所以,list box 将包含一个不同的选项列表。接下来是语法。所以,list box 的语法是什么?再次,我们只是写 list box,然后在其中添加 master 和可以作为参数传递的选项。所以,我们可以作为参数传递的选项是什么?就像 BG。BG 代表背景。BD BD 用于表示边框的大小。然后我们也可以使用 font 作为选项,以及 image width 和 height。所以,现在让我们看看 list box 的实际实现。在 list box 的实际例子中,我们将看到如何从 list box 中删除一个元素,以及如何插入任何元素,或者你可以说项目到 list box 中。所以,现在我将直接在这里写 LV=,让我创建一个 list box。所以,这是我的 list box,我将直接写窗口,让我设置宽度。所以,如果我将宽度设置为 20,让我直接写 lvp pack。所以,这里 else 应该大写。所以,这是我的 list box,如果我运行它,你可以看到我得到一个空的 list box。现在,是时候将选项插入 list box 了。所以,为此我将直接创建一个列表。所以,让我给你列表 as Elvin,让我们插入几个值。所以,如何将多个值添加到 list box?让我写名字 Muer。所以,让我写 Tony。我将写 Elvin。再看几个名字。让我写 Kurtica。让我们再取一个名字,IPSA。所以,这四个值,对吧?我想把它们插入到我的 list box 中。所以,为此,我将使用什么?我们可以使用循环,对吧?for 循环。所以,我将直接在这里写 for i in my list,名字是 Elvin,对吧?所以,我的 list box 的名字是什么?所以,list box 有一个变量名,那就是 lb。所以我将直接写这里 lb. 然后我将直接写 insert,让我把 end 放在这里,我将写 i。现在,如果我执行它。所以,在执行时,你可以看到我得到了 Tony Advent Curtica IPSA。所以,现在我能做什么?如果我想删除比如说 IPSA。所以,让我创建一个 button。我们必须创建 button,对吧?所以,对于 button,我将直接写这里 B1=button,我将直接写这里窗口,text=比如说,如果我想删除 ipsa,我将直接写这里 remove,让我也设置颜色。所以我将直接写这里,比如说将背景颜色设置为红色。现在,对于 button,我也必须写这里 b1.pack。现在,如果我执行它,你可以看到这是 remove button。但是,如果我只是点击这个 ipsa,然后点击这个 remove button,它并没有移除。所以,我们

再次,我只写 B1.pack。现在如果我运行它,您可以看到我得到了按钮。但如果我点击这个 enter 按钮,您可以看到我的输出中没有打印任何内容。那么我在这里能做什么呢?让我创建一个变量。所以我就写,比如说 v 等于 infar。所以这意味着我们基本上要处理整数值。在这之后,我将只写变量,我们知道我们的变量是 v。所以我就简单地写 variable 等于 v。并且在按钮内部,当我写 command 时,这意味着我们正在使用一个绑定函数。所以对于 command,我将再次将名称写在这里为 edtech,我将创建名为 edte 的函数,我们知道我们创建的任何函数,所以我们假设我们正在创建一个 edte 函数,那么在 command 中我们将分配 edte 在这里,所以让我只写 defaf edte,并且在这个里面,让我只写一个简单的 print,并且因为 v 是我的变量,我将只写 v.get。所以我们知道对于 yes,我们分配了值 one,对于 no,值是 zero。所以现在如果我执行它,当我点击 yes 然后点击这个 enter 按钮时,按钮就会工作。所以当我运行它时,您可以看到我得到了 yes 的值是 one。对吧?我们已经为 yes 分配了值 one。同样,如果我点击 no 然后点击这个 enter 按钮,它将为您提供值 zero。所以这就是单选按钮的基本思想。所以我们接下来要谈论的小部件是消息框。现在说到消息框,它用于在 Python 应用程序中显示一个消息框。对吧?那么我在这里能做什么呢?让我们创建一个消息框。要创建一个消息框,您必须导入 message box。所以我就在这里写 from tinker import。我就在这里写 message box。现在我的消息框已经导入。现在我将要做的是,首先让我创建一个 entry。我就在这里写 event 等于 entry。并且在这个 entry 中,我将只写 window。并且也让我在这里设置字体。所以对于字体,我将只更改字体样式。字体样式设置为 calibbri。然后字体大小是 18,对吧?并且也让我设置宽度。所以我就在这里写 width 等于 20。在这之后,让我来组织这个小部件。所以我将使用 event pack。现在如果我执行它,您可以看到这是我的 entry box。现在我将要做的是,让我创建一个按钮。所以我将在这里写 v1 等于 button,并且在这个按钮中,我将只写 window simple,然后在这个按钮中,我将只写 text 等于,比如说 enter,对吧?并且我将在这里写 v1.pack pack。好的。所以现在我想在这里显示的是一个消息框。所以,比如说,即使我没有写任何东西,我按下 enter,它应该显示一些消息框,或者您可以说一个警告消息,对吧,以消息框的形式。并且,比如说,如果我写任何字符串值,它应该显示是的,它是成功的,并且它应该打印那个特定的值。所以为此,我将要做的是,我将创建一个 int 变量。所以我将在这里只写 v 等于 inverb,或者而不是 inverb,我将创建一个 string verb,对吧?让我在这里写 string verb。所以我就在这里写 string verb,然后我需要写的是一个 text variable,这里等于 v。对吧?现在我们知道我们必须在这里写一个 command,它基本上是一个绑定函数。所以对于这里的 command,我将再次创建一个函数。我必须在这里写函数名并将其分配给 command。所以我现在要做的是在这里创建一个函数,它叫做 at tech,并且让我在这里添加条件。所以,比如说,如果我在这里写 if vget,那么我们知道 vget 将给我值。如果我在这里写等于等于,并且它是空的。所以我就在这里写 message box。现在我将使用 message box。Python 为此提供了几个函数。所以我将只写 show warning。所以我就在这里使用 show warning。正如您所看到的,我们有 title 和 message。所以对于 title,我将只写 coen,然后之后我将写 it's empty。这很简单,对吧?当您在 entry 中没有输入任何内容,然后点击 enter 按钮或 submit 按钮时,它应该显示一些东西,对吧?比如请输入一些内容,它是空的。所以我刚刚写了说明。它是空的。接下来我将添加 else 条件。else 我正在处理一个消息框。现在我实际上可以使用 Python 提供的另一个非常有用的函数。我将直接在这里写 show info。并且对于消息框的 title,我将把 successful 作为标签。这样用户就能清楚地看到操作已成功完成。然后,比如说,我想在这里显示 v.get。所以我将只写 v.get。无论值是什么,我都会在这里得到它。对吧?所以现在如果我运行它,现在当我执行它时,这是我的 entry,对吧?并且如果我在这里不输入任何内容然后点击这个 enter 按钮,您可以看到 causal 是我的 title,并且它显示 it's empty,对吧?所以这就是消息框。同样,如果我输入,比如说 gar of view,现在您可以看到我在这里输入了 gar,字体是 calibri 18,对吧?所以这是 calibbri 字体样式,如果我点击这个 enter 按钮,它显示 successful garv,对吧?所以这就是消息背后的基本思想。Python 是一种广泛使用的先进脚本语言,它是解释性的、交互式的和面向对象的。Python 旨在成为一种非常易于理解的语言。它在其代码中使用类似英语的单词。与其他脚本语言相比,它还具有严格的语法结构。在 Web 开发、游戏开发、数据分析和机器学习领域,Python 是一种广泛使用的编程语言。如今,自动化在技术领域发挥着至关重要的作用。这个关于 Python 自动化项目的视频将教您可以使用 Python 构建的最常见和最迷人的模块,用于语音命令识别系统。听起来很有趣,对吧?为什么等待?让我们直接进入视频,了解更多信息。所以,我们要使用的第一个库是 TTX3 库。好的,这个,这是一个库。它有什么用?它用于将文本转换为语音。您写的所有内容都将转换为语音。超级有趣,对吧?所以是的,在 Python 编程语言中,我们有一个名为 pyTx3 的库,它用于将文本转换为语音。所以这是我们将在此项目中使用的第一个库。接着是下一个,我们有 speech recognition。那么这个库有什么用呢?所以这个库用于转换,比如说我正在说什么。好的,我想把它变成文本。所以 speech recognition 是一个库,它可以让您做到这一点。这意味着无论说什么话,speech recognition 库都会将它们转换为文本。好的。接下来我们有 automate Wikipedia。现在这个 automate 和 disco Wikipedia 库可以帮助您处理 Wikipedia。好的,您不再需要去 Google,输入 Wikipedia,然后搜索您想要的东西。完成这个项目后,您就不必再做这些了。您只需说,“好的,为我搜索 Python。”它将自动从 Wikipedia 中提取相关信息、所需文本,并告知您,看,这是文本,根据 Wikipedia,这就是 Python。对吧?这就是 automate Wikipedia 库的工作方式。然后我们有 web browsers。所以今天我们将通过 Python 编程语言来自动化 Web 浏览器。比如说我说打开 Google。那么它会自动为我打开 Google。是的,这实际上是可能的,对吧?通过 Python 编程语言,这完全是可能的。所以 web browser 是我们将用于自动化 Web 浏览器的库。好的。然后我们有 SMTP lib 库。这个库用于处理电子邮件、发送电子邮件、检索电子邮件。所以对于所有这些任务,都使用 SMTP 库。所以在这种情况下,会发生什么呢?比如说您想发送一封电子邮件给某个人。之后,它会询问您要发送什么消息,然后您让那个人知道,好的,这封电子邮件是通过 Python 编程语言发送的,并且您口述的电子邮件将发送给您提供姓名的人。所以它与 SMTP lib 模块一起工作。然后 OS OS 代表操作系统。它用于处理或与操作系统交互。我们接下来要使用的是 datetime。正如我之前提到的,我们将通过这个项目来检查当前的日期和时间。同样,它也用于处理日期和时间。太好了。所以,我希望首先非常清楚我们将使用哪些库,这些库的任务是什么,以及它们实际做什么。太好了。所以,我希望首先非常清楚我们将使用哪些库,这些库的任务是什么,以及它们实际做什么。现在,让我们不要在这里浪费太多时间,让我们开始编写这个任务。让我首先给您一个关于我们将要处理的项目非常清晰的想法。所以,呃,到目前为止,我们只写了一些代码行,并且能够自动化不同的事情,对吧?现在,呃,如果您可以通过说话来做到这一点呢?比如说您说,“为我打开 YouTube。”您猜怎么着?YouTube 为您打开了。您说,“在 Wikipedia 上搜索 Python。”您猜怎么着?Wikipedia 为您搜索 Python,并大声朗读 Wikipedia 上关于 Python 的内容。是的,在 Python 编程语言中,这完全是可能的。所以,今天我们将做一个这样的项目。无论您给项目什么命令,它都会为您完成。比如说我说,“告诉我当前时间。”所以,它会说现在当前时间是什么,它会说出当前时间。所以是的,仅仅听到这个就听起来很有趣。那么我们什么时候开始呢?将非常非常令人兴奋地继续将所有这些事情和项目付诸实践。好的,我不会在这里浪费太多时间谈论它。让我们开始吧。呃,让我们收集一下这个项目所需的东西。好的。所以,在我们继续任何事情或开始编写代码之前,让我先告诉您我们将为这个项目使用哪些库。好的。现在这是一个这样的项目,您会说一些话,它会被转换为文本。好的。或者像麦克风和所有这些东西都会通过我们即将编写的项目自动访问。好的。现在,好的。就像在我们开始之前,我真的想建议在接下来的很短一段时间里。仔细听我说。注意我说的每一句话,并请严格按照所有这些步骤操作,以使这个项目取得成功。好的。所以,我在这里将写出来,首先我将导入第一个库,即 Py Tessoract。好的。所以,如果您还没有安装这个库,请转到终端。看,我正在使用 PyCharm。好的。所以在 PyCharm 中,我已经在 IDE 中有了终端。现在,除了 PyCharm,如果您使用任何其他 IDE,请确保打开命令提示符并输入我在这里写的相同命令。命令是 pip install,然后输入 pi test。好的。然后按 Enter。对我来说,这个库已经安装好了。所以它会显示我已成功安装。但如果您还没有这样做,它将需要一些时间,然后显示您的库已安装。好的。所以,请确保在开始这个项目之前,您安装了我们今天将要使用的相关库。所以是的,这个对我来说已经完成了。我将在这里打开一个新的终端。现在我需要安装的第二个库是 type pip install。第二个是 speech recognition。现在请确保并在此屏幕上查看我如何拼写 speech recognition。speech 应该是小写,但 recognition 应该是大写 R。好的,那就是 R E C O G N I T I O N。请确保您拼写正确。好的,对我来说,它再次已经满足了。所以它显示我已下载了相应的库,如果您还没有这样做,您需要安装它。现在您需要安装的第三个也是最后一个库是 Wikipedia。同样,输入 pip install Wikipedia 并按 Enter。对我来说,Wikipedia 也已安装。所以它显示 requirement already satisfied 之类的内容,但如果您还没有这样做,它将根据您的互联网速度花费一些时间,然后也会为您安装 Wikipedia 库。好的,太好了,现在不需要安装其他东西了。所以,我导入了 pi test 库,然后我将写 import。好的,1 秒,它是 import。接下来我们将写 import speech recognition as SR。现在 speech recognition 是一个长名字。毫无疑问。所以,每当我需要使用 speech recognition 时,我将只写 SR,它就会为我工作。好的,它不会给我任何错误。所以,我们在 Python 中实际做的是,当您有长名字的库时,我们会给这些库一个简写。好的,无论您想在哪里使用该库,您都可以简单地使用简写,它将直接引用您的库。所以这是我们做的一件事。接下来,我们将导入下一项,即 datetime。所以,import datetime。接下来,我们将写 import。在这里我们将写 or to import oh to meet,这是为了 wiki。好的。抱歉。所以,抱歉。最后一个 import 是 Wikipedia。好的。Wikipedia 库也在这里导入。这里是 import。这是我的 web browser。Import web browser。好的。我的下一个库。然后我有 import,这里是 OS,我的操作系统。最后,抱歉,这里是我的 import SMTP lib。最后,我将导入的最后一个类型是 import datetime。好的,所以是的。好的,datetime。我已经写过了。好的。让我从这里删除这个。一秒。太好了。所以,这些是我们将在整个项目中使用的七个库。PI tessoract,speech recognition,datetime,Wikipedia,web browser,O 和 SMTP。好的,太好了。所以,我们要做的第一项任务是设置引擎并初始化 PI tessoract 库。好的。所以,首先,我们将要做的是,我们将只做一些事情,以便我们设备上已有的任何语音和音频,我们将提取这些音频和语音。好的。太好了。所以,我在这里将写 engine 等于,这里是 py3 好的。然后正如我所提到的,我将在括号中初始化它,我将写 sappy 5。那么 sappy 5 实际上是什么呢?它是一种,您可以说是一种驱动程序,或者您可以说是一种语音。好的。所以,请确保您拼写正确。现在,您可以理解它是一种驱动程序,它可以帮助您获取语音,它可以在 PI3 库中帮助您。那就是用于将文本转换为语音。它在这种情况下会有帮助。好的。接下来,我们有变量 voices 等于。现在,接下来您有 engine。好的。Engine。我的函数是 get property。好的。Get property 是我的函数。现在在括号中,我将写 voices。好的。Get property,这里是我的 voices,然后移到第三行。它写 engine。现在我正在设置,嗯,我得到了 property。Get the property 意味着我尝试获取 property,即 voices。现在从那个 voices property 中,我将选择一个 voice。现在您实际上会看到我正在做什么。首先,为此写出 engine setp property voice voices one do id。现在听我说,这个 one。我为什么写 one?因为 one 是女性的声音。如果您想要男性声音,在这种情况下,您可以将零而不是 one 提及。好的。零是男性声音,对于我写了括号 one 的声音。所以 one 指的是女性声音。好的。您可以相应地设置它。好的。太好了。所以我的声音正在为我想要什么样的声音进行设置,所有事情在这里都完全没问题。接下来,我将要做的是,我将创建一个新函数。现在,好的,这个函数将允许我们写的东西被大声说出来。所以,我的函数是 speak。在括号中,我将传递 audio 作为参数。好的。所以,这里是 engine say,在括号中是 audio。好的。好的。这里只有一个 a。好的。现在我们正在做什么?engine 是我的库,我已经用这个 three 初始化了。那就是将文本转换为语音。好的。所以,现在我的书面文本在哪里,我正在将其转换为语音?所以,书面文本我正在将其转换为语音,为此我将创建一个单独的函数,并且该函数将只处理它。好的。到目前为止,我们还没有为文本到语音转换创建任何特定的函数。到目前为止,我们只初始化了库。仅此而已。太好了。下来,我将在这里设置一件事。Engine.ci 抱歉 engine.run and wait 函数,它在括号中。那么 run and wait 函数是做什么的呢?比如说我的程序已经运行了。好的。之后,我写的任何文本都将被转换为语音。之后,从 speech recognition 库,我说的任何话都将被转换为文本。所以,为了处理所有这些事情,我们设置了这个函数,即 run and wait。好的。所以,一旦我们运行这个程序,它就会运行,它将首先等待说出需要从文本转换为语音的任何内容。之后,它将听我的话,我说的任何话,然后它会将它们转换为文本。然后它将执行相关的函数,无论被命令了什么。好的。我希望我对项目的想法以及我写的内容,这些东西实际上是什么,都非常清楚。现在让我们继续进行接下来的事情,那将是我将要制作的下一个函数,那就是 defaf,这里是下一个函数 wish me,它是什么?函数 def wish me 现在,哦,让我们看看,让我们看看您已经写了相应的内容。现在,这里我们将使用 datetime 模块。好的,现在我为什么要做这个函数,以及为什么需要将这个函数添加到程序中,以便我涵盖的 Python 自动化模块,您能够非常清楚地了解如何在项目中它们。看,听我说。仅仅写两行代码来使用模块,或者在项目中使用模块,这两者是非常不同的事情,对吧?所以,首先,我告诉您如何在写三四行代码时使用该特定模块。现在,我将向您解释当您想将其插入到某个项目中时,该模块将如何使用。好的,这就是我创建这个函数的原因。所以,我将要做的是创建一个变量。比如说它是 R。在这里,我将获取当前的日期和时间。好的。所以它将是这样的。Datetime dot datetime dotnow。对吧?它将帮助我获取当前时间。我们现在有什么时间,它将帮助我获取那个 dot r。好的。所以,无论我有什么时间,它都会以...的格式显示,让我从这里获取时间。现在我没有为时间设置任何格式,比如它应该给我什么格式的时间,因为这不是我要求时间的函数。看,我实际上在这里做的是,让它提取当前时间,并根据那个时间决定是早上、下午还是晚上。好的,我们将把它设置成这样,一旦我们收集到当前时间,好的,无论现在是什么时间。比如说对您来说,它是早上 7 点,对吧?所以早上 7 点实际上是早上,对吧?那么它会做什么呢?它会提取它是早上 7 点。所以它会自动理解它必须问候早上好。那么在这种情况下,它会说早上好。对吧?现在让我们看看这里。可能会有一些混淆。它实际上不理解 A.M. 或 P.M.。好的。它不理解 A.M. 或 P.M.,因为这只是时间。所以它以 7:27 的形式获取时间。好的,它以 7:30 或 8:30 或 9:30 或 9:10 的形式获取时间,无论您有什么时间。所以它实际上做的是,比如说下午中午 12 点,好的,它会理解 12 已经写了,所以那是中午。之后,当我又写一的时候,它会自己理解那是早上,那么在这种情况下,就像我们过去写的那样,好的,让我加一个注释,所以就像我们实际上使用,比如说 12 是我的中午,对吧?所以对于 12,它将简单地是中午或下午,无论您怎么称呼它,12 之后,当我们写一的时候,我的程序实际上会理解什么?它会认为那是早上,但实际上我指的是下午 1 点,对吧?所以在这种情况下,我需要做的是以 13:00 的形式提及它。好的。13。现在它会自动将其视为下午。好的。比如说,您想要它在 18:00。好的。比如说,您想要它在 18 点。18:00。现在这会将其理解为晚上。但而不是这个,如果您写出下午 6 点,如果您而不是这个写出下午 6 点,它将无法理解。好的?所以,我希望我关于如何相应地设置时间非常清楚。好的。太好了。让我们开始设置这些相应的东西。所以,我在这里将提到,如果 r 好的,如果 r 大于或等于零,好的,并且 r 小于或等于 12,好的,那么在这种情况下,您就可以简单地说,您就可以简单地说早上好,我亲爱的,我亲爱的朋友,好的,早上好,我亲爱的朋友,这就是您可以说的。它意味着从早上到 12 点,好的,如果时间在这个范围内,那么在这种相应的情况下,它必须读出早上好,我亲爱的朋友。接下来是我的 else if 条件。Else if。现在,如果 r 大于或等于 12 并且 r 小于或等于 18。好的。那么在这种情况下,您需要说什么?您确实需要在这里说一句非常好的下午,祝您下午好,我最亲爱的朋友。您今天过得怎么样?现在,好的,这里还有一件事要提,那就是,每当我们想打印任何东西时,每当我们想打印一些东西时,我们做什么?我们使用 print 语句,对吧?现在,每当我们想要任何东西被说出来时,好的,任何东西都应该被说出来。所以,在这种特定情况下,我们使用 speak 函数而不是 print 语句。好的,这些是需要提及的小细节,并且实际上需要注意。然后是我的 else 条件。我将说。晚上好。让我们稍微克制一下自己。祝您晚上好,我最亲爱的朋友。晚上好,我亲爱的朋友。好的,所以我也希望那非常清楚。接下来。好的,这些条件已经设置好了。我想要的任何条件,我都简单地写在这里了。比如,现在我将写一个强制性的说话条件。这意味着我现在将写一个条件。条件意味着我将写出一些必须被说的必要陈述。无论它说早上好,我亲爱的朋友,那么这个陈述也会运行,或者如果它说下午好,我亲爱的朋友,那么这个陈述也会运行,或者它说晚上好,我亲爱的朋友,那么相应的陈述也会运行,这就是为什么我把它写在任何条件之外,因为这是强制性的,一个必须在三种情况中的任何一种下被说的陈述。所以,为此我正在写嗯,让我,好的,让我知道,让我知道,嗯,我该如何帮助,嗯,我该如何,以及我该如何帮助您,好的,让我知道我该如何帮助您,嗯,比如说我们写了您在寻找什么,好的,比如说这是您想说出的陈述,让我知道我该如何帮助您,您在寻找什么,我只加一个简单的逗号。好的。所以,这是我希望在任何三种我提到的条件之后,必然且强制性地包含的陈述。对吧?所以,这个 wish me 函数现在完成了。但它怎么知道是早上、下午还是晚上呢?嗯,从这个 date 和 datetime now,它将提取当前时间,并根据它决定说什么并相应地运行。好的,所以这就是清晰的想法。太棒了。现在,让我们继续添加第二个命令。我们将要在适当位置使用的第二个函数。好的,我的第二个函数将被称为 div。在这里我们将给它 take command。好的,div take command。它会做什么?首先,它会问候我。早上好、晚上好或下午好,任何合适的。之后它会说,让我知道我该如何帮助您。您在寻找什么?好的,然后它将要做的是,首先它会给我显示一条消息说正在听。比如说我说打开 Google。首先它会显示它正在听。我说 Google。所以,在我说了任何话之后,它会显示正在识别声音。这意味着您的声音是否足够清晰响亮,以至于您笔记本电脑上的麦克风可以拾取到?您说的任何话,是否足够响亮清晰,以便命令能够被理解?比如说是的。在这种情况下,它将处理它并自动化您给出的相应操作。但如果您的声音不清晰响亮,那么它会显示一条消息说,“我无法理解您在说什么。请再说一遍。”所以,这就是我们将在 pick command 函数中编写的内容。好的,让我们不要浪费太多时间。让我们在这里开始。所以,我们在这里有我们的变量,我们将使用 speech recognition。说出的词将被转换为文本。我说的任何话,它也会显示出来。也就是说,它会告诉我,我能从您的语音中提取这么多。您说的任何话。好的,比如说我说打开 great learning academy。在这种情况下,比如说它只能提取 open great learning,而无法理解 academy。所以它只会显示您说的是 open great learning。它实际上会在输出中写出来,显示您说的是 open great learning。好的。所以,在这种情况下,我们正在使用 speech recognition 库。这意味着我说的任何话,即使我希望该内容显示在输出框中。好的。所以 SR dot,这里是我的函数 reco。好的。那就是 R 应该是大写,因为 nicer。好的,它将帮助我做到这一点。下来。现在,我们正在使用 SR.microphone 来访问您的麦克风。好的,使用 SR.microphone 作为 source,使用 SR.microphone 作为。所以,让我们下来。首先,要打印什么?首先打印 L I S T E N I N G。好的,正在听您说话。正在听您说话 Shampy。好的,您可以放您的名字或任何您想说的。好的,正在听您说话 Shampy。太好了。接下来,我们有下一件事,即 r.pause threshold 等于 1。那么屏幕上的这个 pause 是什么意思?Pause threshold 用于。所以,一旦它打印了正在听您说话 Shambavei 的陈述,它将等待一段时间。它会等待一分钟,然后它会显示正在识别您的声音,如果您说了什么。那么在这种情况下,它会识别您,或者如果您什么都没说,它会显示正在识别您的声音,然后它会显示请再说一遍。好的,它将是这样的。所以我们在这里设置了一些暂停时间,然后这里是 audio 等于 r.listen,在括号中,是的,在括号中,我将使用 source。那个 source 是什么?我使用了 SR.microphone 的 source。好的,太好了。所以,这就是您所做的。现在,在这个里面,我将使用我的 try 和 except 块。所以,这里是我的 try 块。一秒。让我回去,是的,让我现在稍微向下。太好了。现在,我在这里要打印什么?正在识别,正在识别您的,正在识别您的声音。好的,让我们看看。这是陈述。它会在之后打印,在 try 语句中。然后您将在这里写 query 等于,这里是 R dot,这里是我的函数 recognize,让我们去 Google。这个 SR,嗯,一秒,这是 speech recognition 库,我写了它用于将说出的词转换为文本,并且它基于 API 工作,它根据 API 工作,所以在这里它将与 Google API 一起工作,所以在这种情况下,我正在使用 recognize_Google,这里是我的变量 audio,用逗号分隔,现在我们还必须设置语言,所以语言我设置为 English,那是 Indian 和 dashyan,好的,English India,好的,这是我设置的语言,我希望用它来交流,而且我也会用这种语言说话,无论您说什么语言,请在这里提及该语言。好的,谢谢。下来。现在我想要一个 autoprint 语句被打印出来,它会显示我实际说了什么。所以,现在,现在我将写一些东西在开头。在这里,我将写,比如说,我亲爱的朋友,我亲爱的朋友,您说,我亲爱的朋友,您说,然后我将把它放在括号中。那么我在哪个变量中识别声音呢?那就是 query,对吧?所以我在这里写 query 变量,因为那个变量将存储我说的任何话。这就是为什么我在这里使用 query。这里有一个反斜杠。反斜杠意味着这个程序,我写的,它将以无限循环运行。比如说我说打开 Google。所以,它为我打开了 Google。之后,它不会退出程序。它将再次从请告诉我开始。并且它将以正在听您说话 Shambi 或您说的任何话开始。现在,比如说第二次您说打开 great learning YouTube channel。所以它会再次为您打开它,它会说正在听您说话 Shambasy。所以,不是您说一句话然后它就停止运行的情况。好的。比如说您想同时打开多个东西。所以是的,您可以通过这个项目做到这一点。对吧?所以我已经提到了 query。接下来我们将写 except 语句。所以,这里是 except exception as e。好的。Except exception as e。继续。我将打印一个陈述。Print shambi。好的。是的。我现在在这里提及。Shambi 请。好的。让我们不要这样写。让我们写 Shambi。请再说一遍。好的。P L E S E。Shambi。请再说一遍。然后我将在这里添加一些点。好的。接下来,我将在最后返回 none,意思是无。好的。还有一秒。Tab。这里是 return query。Return query。好的。所以,太好了。希望我对此很清楚。返回 query。这里是相应的东西。现在这一切都已解决。这个特定的东西已经完成了。现在我将要做的是创建一个函数。并且该函数将帮助我访问电子邮件。所以,这里是 defaf。我的函数名是 send email。在括号中,我有两个参数 to 和 content。To 意味着您想发送给谁,content 意味着您想发送什么消息,您想发送什么电子邮件。好的。现在,这里是我的库。那个 server 等于我将访问 SMTP。这里是 SMTP。P 应该是大写,在括号中提及 SMTP。gmail.com。好的,那就是 gmail.com。好的,逗号。这里是 587。它是服务器。好的,587 是 smtp.gmail.com。好的,您需要这样设置。继续,您将写下一个是 server.start。好的,那就是 starts。这意味着它将帮助您。它将为您启动服务器,即 SMTP 服务器。并且只有通过它,您才能从这里发送电子邮件。好的。现在这里是 server.lo。那么您的电子邮件是什么?电子邮件 ID,您要从中发送电子邮件。现在,请确保您非常仔细地听我的话,因为在这里,即使一点点错误,它也不会为您发送电子邮件。好的。首先,在 login 函数中,您需要写您要从中发送的电子邮件。好的。所以,我有一个某种电子邮件,我将在这里快速提及它。好的。这里是 gmail dot。好的。在 @ 符号这里是 gmail.com,我的电子邮件已经提及,我将从中发送。之后,放一个逗号,放反引号,双引号或单引号逗号,然后在这里提及,现在是您要从中发送电子邮件的密码。所以,我将简单地提及我想要发送的电子邮件的密码。确保您做的事情是正确的,否则它将无法为您访问。好的,下来。接下来是 server.here goes send mail 函数,在 send mail 中,首先写您要发送的电子邮件,也就是说您自己的电子邮件,上面写的那个,放相同的电子邮件。好的。所以,我在这里放了上面提到的相同的电子邮件。所以,这里是逗号分隔。现在,什么电子邮件,现在?好的,接下来您需要在 to 字段中输入,然后您输入 content。好的。所以,是的,这些是电子邮件和密码,正如我告诉您的,您想使用它们来发送。这里是 server.clo,然后放括号。好的,所以?这是为发送电子邮件创建的函数。好的。现在我将向下滚动并从这里开始一些新的东西。初始化 Python 编程语言的主函数。好的。所以,呃,首先,我只想让这个 wish me 函数运行。我只想让这个 wish me 函数运行,它将根据时间问候我,无论是早上、晚上还是下午,任何合适的。好的,继续。我将设置一个无限循环。正如我告诉您的,我们将设置一个这样的无限循环。所以,这里是我的 while。下来。在这里,再次,query 等于它将是 take command。好的。所以,这意味着无论文本被说什么,无论您说什么,所有内容都将被转换为小写。现在,如果一个人说,如果我说,比如说,比如说打开 Wikipedia,如果我说那个在 query 中,这意味着当它问我,现在让我知道您想打开什么,那么在这种情况下,如果我说打开 Wikipedia,那么应该执行什么命令?首先,它应该说正在搜索,s a r i n g,那是搜索 Wikipedia,首先是 w i k i p e d i a,好的,它应该说搜索 Wikipedia。接下来。好的,这里是那个 query。好的,query 等于这里是 query.replace。好的,query.replace。现在,好的,那是 quer。现在,在这里设置变量,即 Wikipedia,这里是双引号,对吧?所以,无论您说什么术语,比如搜索 Wikipedia,如果我说打开 Wikipedia,它会说搜索 Wikipedia。好的。所以,在说了打开 Wikipedia 之后,在这种情况下,无论您想搜索什么术语,您都可以放进去。好的。这里是 results。rests results 变量。现在我将要做的是使用我们上面使用的 Wikipedia 库。点。这里是我的 summary 函数。在括号中,我将提及我的第一个词 query,以及您想要关于该特定主题说出的句子数量。比如说,我想要前两句话。好的。让我们只取前两句话,不多。好的,然后它会以...的形式说出来,根据 Wikipedia。根据 Wikipedia,然后它将开始说出您搜索的任何主题。好的。而且我也想打印结果。也就是说,它将要说什么,以及它从 Wikipedia 中提取了哪两句话,我也想将它们作为输出打印出来。所以它将被打印出来。打印之后,我也想让那些东西被说出来。我使用 speak in the results。好的。所以,我希望我对此部分非常清楚,关于这里需要做什么来处理 Wikipedia。接下来,让我们看看。如果您想打开记事本,我将在这里写 if open,这里是。如果 query 中有 open notepad,如果您看到它说 open notepad,那么应该发生什么?所以,现在我将提供一个路径。现在去搜索,在搜索选项中输入并搜索记事本。好的,看它已经为您打开了。现在继续点击这里打开文件位置。好的,您点击了打开文件位置,对吧?现在,让它打开。之后,我将告诉您接下来该做什么。好的。记事本已经为您打开了。现在,在这里右键单击,点击记事本,然后右键单击。好的。之后,让我们看看。只需给它一些时间来打开。现在,这里转到属性。好的。在此之后,转到属性。我在这里点击了属性。现在,只需做一件简单的事情。从这里。复制这个 uh system 32 notepad.exe。好的。从那里复制。好的。而这实际上已经完成了。System 32 部分已经完成了。好的。现在我将从这里关闭它。好的。一秒。我只需要立即做一次。所以,让我回去。好的。它在开始菜单中。然后是程序,我想。那是什么?好的,让我再做一次。我将打开。我将搜索记事本。您点击打开文件位置。是的,在这里下拉并查看。好的,从这里只需点击记事本。只需点击这个单次点击。现在在这里下拉。好的,所以看它告诉您它在 C 盘。它在 window C 盘。好的。所以,现在只需检查您在哪个 Windows C 或 D 盘中有它。现在在这里输入 C 盘,双斜杠。对我来说,它在 C 盘。好的,它会是这样的。抱歉。现在它在 Windows I N D O WS 中。对吧?之后我们搜索那个。对吧?它在 system 32 中,然后是 notepad.exe。对吧?所以我将在这里写 system 32,然后是双斜杠,它是 note。好的,它是 notepad.exe。这是完整的路径,对吧?我向您展示的。它在 system32/nopad.exe 中,并且从那里我看到它在 C 盘。好的。所以,对您来说,正如我们刚才快速搜索的那样,请提及相应的路径。比如说这是记事本。现在让我们看看,如果我想自动化 Paint。所以,如果我说打开 Paint。好的。打开 Paint 和 query。首先说出来。然后做什么?好的,我非常抱歉,我刚刚错过了一个陈述,那就是我需要写 os. OS 现在是将被使用的库,即操作系统。它将是操作系统,即 Windows start file。要启动哪个文件?要启动的文件是我在 inpath 变量中写的那个。所以,这意味着静态地,记事本将为我打开。对吧?让我们下来,在那里,即 in path 等于,现在我们有了 Paint,对吧?所以对我来说,Paint 也会在同一个地方,所以我会从这里复制 c goes,这里是 v,好的,并且而不是 notepad,我将写出 ms paint p a i n t,好的,对您来说,您也可以相应地搜索它,并且您也可以放上去。好的,您也可以再次搜索它,让我告诉您,转到 Paint,按 Enter,好的,抱歉,我打开了 Paint,但那不是必需的,让我关闭它,Paint,呃,转到 Paint,打开文件位置,看,就在记事本旁边,记事本下面我们也有 Paint,所以您也可以在这里放上它,没问题,在这个相应的情况下,对吧?太好了,让我们在这里关闭它,所以 Paint 也完成了。现在,这些是我们设备上,您的笔记本电脑或计算机上存储的两个 exe,两个我可以说函数或应用程序,无论您怎么称呼它们。现在,比如说,我们想在线访问任何东西。在线意味着我想访问任何东西在浏览器中。比如说,我想打开 YouTube。那么名字是什么?好的,这里是我的 if 条件。好的,就在这里。好的,我只需要做一件事,一件事情,我需要写 os. excuse O's dot,这里是什么函数名,必须放上去,它是 start file。好的,操作系统,从操作系统,即 Windows start file。要启动哪个文件?要启动的文件是我在 inpath 变量中写的那个。所以,这意味着静态地,记事本将为我打开。对吧?让我们下来,在那里,即 in path 等于,现在我们有了 Paint,对吧?所以对我来说,Paint 也会在同一个地方,所以我会从这里复制 c goes,这里是 v,好的,并且而不是 notepad,我将写出 ms paint p a i n t,好的,对您来说,您也可以相应地搜索它,并且您也可以放上去。好的,您也可以再次搜索它,让我告诉您,转到 Paint,按 Enter,好的,抱歉,我打开了 Paint,但那不是必需的,让我关闭它,Paint,呃,转到 Paint,打开文件位置,看,就在记事本旁边,记事本下面我们也有 Paint,所以您也可以在这里放上它,没问题,在这个相应的情况下,对吧?太好了,让我们在这里关闭它,所以 Paint 也完成了。现在,这些是我们设备上,您的笔记本电脑或计算机上存储的两个 exe,两个我可以说函数或应用程序,无论您怎么称呼它们。现在,比如说,我们想在线访问任何东西。在线意味着我想访问任何东西在浏览器中。比如说,我想打开 YouTube。那么名字是什么?好的,这里是我的 if 条件。好的,就在这里。好的,我只需要做一件事,一件事情,我需要写 os. excuse O's dot,这里是什么函数名,必须放上去,它是 start file。好的,操作系统,从操作系统,即 Windows start file。要启动哪个文件?要启动的文件是我在 inpath 变量中写的那个。所以,这意味着静态地,记事本将为我打开。对吧?让我们下来,然后再次是我的 ellift 条件。现在我们已经打开了 YouTube,打开 YouTube,让我们打开 YouTube。这里是 query open YouTube,这是我的 query,对吧?让我们下来。这里是 web browser.open。好的,web browser.open。并且我将简单地在这里写 youtube.com。YouTube.com。好的。所以,它会为我打开 YouTube。太好了,完成了。现在,比如说,您有一些经常使用的网站。好的,如何通过这个程序访问那个特定的,呃,如何访问那个特定的网站?所以我将写,比如说,我现在将用它来打开 great learning academy,打开 great learning academy,好的,打开 great learning academy 在 query 中,并且 query,好的,在这里是 web browser,这里是 web browser,现在您需要做的是,让我向您展示,让我只是打开一个 Google,非常快速地打开 Google。所以,这里是,现在我将要做的是,首先,好的,还有一件事,当您做那个,当您做那种事情时,比如说,当您指定访问 Gmail 中的电子邮件时,在这种情况下,您需要搜索 list secure app access,在这里 list secure app access,转到相应的网站,即 signin Google account,好的,signin Google account,现在您需要勾选此框。只有这样,您才能使用 SMTP 库发送电子邮件。好的,太好了,完成了。我刚才在做什么?我正在打开 Great Learning Academy,对吧?我只是打开它。所以,这里是 great learning academy。现在只需获取,就像现在快速获取网站和此链接一样。我将从这里关闭它。快速复制并粘贴到相应的位置。然后这里就快速完成了。所以,每当您看到 open greatle learning academy,它就会为您打开 great learning academy。好的,所以我希望我对此部分非常清楚。接下来我实际上需要什么?我将写 here elf。好的,elf。现在,接下来,比如说,我想打开 Google。所以,这里是 open Google,在 query 中。现在那是 qu e r y,对吧?现在实际上,我在这里写了 web browser.open。所以,现在我不需要这个 os.st start,因为现在我们正在做所有这些事情,在线。我们在浏览器中做所有这些事情,对吧?这就是为什么我们在这里使用 web browser 库。Open Google inquiry,对吧?让我们下来。这里是 web browser.open。好的,web browser.open。并且我将简单地在这里写 google.com。Google.com。好的。所以,它会为我打开 Google。太好了,完成了。现在,比如说,我想询问当前时间。比如,现在是什么时间?告诉我。所以,我将写 else tell me the time in query。Query 是一个变量。

我正在存储我需要知道的任何信息,或者我需要打开的任何信息。所以这就是为什么我到处提到查询。好的。现在这是我的变量 str time。假设它等于 datetime.datime.now。 Datetime.datime.now。它将帮助我获取当前时间。这是我的 str。它的意思是它允许我设置我的格式,我想要的时间格式是百分比 h 冒号百分比 m 冒号百分比。所以是小时、分钟和秒。好的。但它也会让你知道,比如说,下午 1 点。所以它会告诉你 13。如果是下午 2 点,它会告诉你 14。它只会在那种特定情况下让你知道。好的?因为它不会自动区分下午和上午。好的,这就是它无法自动区分下午和上午的原因。这就是它将时间显示为 13、14、15 等等的原因。好的,然后我想说的是。我想说,呃,我亲爱的,好的,那是我亲爱的朋友。我亲爱的朋友,时间是好的。我们在哪里存储它?那就是 str time。我亲爱的朋友,好的,所以我把它写出来,对吧? F R I 好的,请稍等 F uh F R I E entry 好的,我亲爱的朋友,时间是,这是相应的时间,对吧?所以它会说我亲爱的朋友,时间是,以及当前时间是什么,它会在这个特定的地方说那个时间,好的,这就是你访问当前时间的方式。接下来你还有一件事要访问,比如说我想打开 Great Learning YouTube 频道,所以我写 Open open and open great learning l e a 好的,那是 learning open greatle learning YouTube channel,这是我想说的命令,好的,在查询中,在 q 中,在 query fine 中,加上冒号,转到下一行,在这里我将写出网络浏览器打开,现在你想打开的 Great Learning 频道网站是什么?其次,首先把这个放出来。现在我会怎么做?让我快速去谷歌,就在这里,就在这里,向下滚动,它应该在这里提到。在这种情况下,我真的不需要去任何其他网络浏览器或类似的东西。所以让我们非常快速地向下滚动到这里,是的,就是这个 YouTube,所以让我们快速点击这个 YouTube,好的,所以让我们看看它会为 Great Learning Academy 打开什么,是的,我们有这个 Great Learning Academy,哦,一秒钟,它关闭了。好的。所以这就是你可以从这里复制的方式。好的。或者我建议你可以使用搜索,让我写在这里 Great Learning。对。我可以直接写。那将是一个好主意。好的。现在我会去那个相应的地方。暂停一下。然后你可以从这里复制这个网站。Ctrl C。好的。不要直接从网站上这样做,否则它会带你去其他地方,比如它有一个稍微不同的链接。好的。所以我建议你从 YouTube 搜索 Great Learning 并从这里复制并粘贴到相应的地方。好的。所以频道在这里设置好了。接下来我们有什么?现在,比如说你想访问任何社交媒体平台。好的,这是一件非常重要的事情。它现在在你的生活中扮演着重要的角色。所以看,呃,比如说我会写一个命令,那就是打开 LinkedIn,打开 LinkedIn,好的,打开 LinkedIn,然后在这里是我的查询,好的,打开 LinkedIn,在查询中,所以加上一个冒号,像这样,向下,这是我的网络浏览器打开,LinkedIn 的链接是 linkedin.com,或者你可以做一件事,你可以去,你可以在谷歌上搜索 LinkedIn,然后你也可以从那里复制链接,如果你不知道任何网站的链接或任何东西。所以你所做的是去谷歌并简单地输入链接,它会带你到重定向的地方或重定向的页面,无论需要什么。好的,太好了,完成了,现在我剩下这个程序,这个项目的最后一部分,那就是自动化我的电子邮件。所以电子邮件到 um 好的,电子邮件到,现在在这里我们将要做的,我将要写我要发送电子邮件的人的名字,好的,我将要写电子邮件或要发送电子邮件的那个人的名字,所以你只需要写那个,比如说我写电子邮件给,好的,让我们写电子邮件给另一个朋友,电子邮件给另一个朋友,然后在这里是查询,输入这个,然后向下,现在这里又是我的 try 语句,try,首先它会问我什么要发送,所以它会写出我应该发送什么,我应该发送什么,它会问我,然后我向下,在这里我输入那个内容变量,它等于 take command,take command 函数,它会做什么?它会从我这里接收一个命令,它会简单地运行我应该发送什么,我会说发送这个,这个,这个,这个,或者那个,那个,那个,好的,我们会做一些类似的事情,好的,所以 take command 在那种特定情况下会帮助我们,帮助我们。向下,然后是等于哪个人,你想发送电子邮件的电子邮件地址是什么?所以写上你想发送这封电子邮件的那个特定人的电子邮件地址。对?所以我只是把它写出来。我刚刚写了我想要发送这封特定电子邮件的人的电子邮件地址。对?我把它写下来了。这是我的 send email 函数,我们上面写了,在括号里是 to, comma。我已经声明了 to 和 content。对?最后它应该说什么?它会清楚地表明你的电子邮件信息已成功传输并送达。此确认意味着您的电子邮件已发送,没有任何问题,并已到达预期的收件人收件箱。好的,您重要的电子邮件通信已成功发送,确认其已正确送达。好了,一切都井井有条。在此 try 语句之后,我们需要添加一个 except 语句。Except,请稍等。我再加一行空格。这里是异常。加上冒号。转到下一行。我们应该打印什么?打印我的相应异常。我有什么。它应该说什么?它应该说我亲爱的朋友。我亲爱的朋友,呃,我亲爱的朋友,我无法发送电子邮件。好的。我亲爱的朋友,我无法发送电子邮件。请,我恳求你,解决这个关键错误。好的?请,我敦促你,解决这个重大错误,我一定会详细记录下来。好了,我亲爱的朋友,我无法发送电子邮件。请解决错误。所以,如果出现任何错误。所以,请解决那个特定的错误。我无法为你发送电子邮件,对吧?所以,太好了。我希望我已经把这个整个程序的一切都讲清楚了。我在这里写的所有关于事物是什么,我们如何设置它们,我们如何对它们进行分类,以及所有这些实际上是如何工作的。对?所以现在是时候快速运行这些程序,看看哪些函数在工作,哪些不在,并澄清一切。好了,让我非常快速地做一件简单的事情。让我们右键单击,好的,请稍等,在此之前,让我调高音量,这样你也可以听到我在说什么。所以这里是调高音量。太好了。好的。太棒了。现在让我们快速运行这个程序。所以让我们点击运行。好的。让我们看看它会说什么。它会花费很多时间。好的。好。>> Eand。>> 是的。>> 让我知道。我能帮你什么?你在找什么?>> 打开画图。让我们看看它会做什么。它为我打开了画图。现在看看这个项目有多棒。我在这里说的任何话,比如说我设置了第一个。它显示我先在听,然后它用晚上好问候我。所以,我亲爱的朋友,让我知道我能帮你什么。之后,它显示我正在听你说话,Shambodi。然后我说话了,它说识别你的声音,我亲爱的朋友,你说打开画图。它就为我打开了。对。好的。现在我要做的是终止这个程序,因为我已经做了很多语音识别,这里会捕捉所有这些。所以我会从这里终止它。好的,我将再次运行它。现在我们将尝试同时运行两三件事。好了,所以请仔细观看。让我去这里,关闭 YouTube 频道。也让我关闭这个。也让我关闭这个列表。安全的应用访问也是如此。好的,让我关闭所有东西。让我们回来并非常快速地运行它。听听。我亲爱的朋友,让我知道我能帮你什么。你在找什么?>> 打开 Great Learning Academy。给它一点时间打开。好的,给它一些时间,因为这取决于你的互联网连接,它会相应地工作。看这里,它在不断加载东西,内容正在显示,以及所有那些相应的东西。让我做一件事。我在这里加双斜杠。是的,少了一个斜杠。让我关闭这个并点击终止。让我们非常快速地运行它。>> 晚上好,我亲爱的朋友。让我知道我能帮你什么。你在找什么?>> 打开 Great Learning YouTube 频道。所以,看看我得到了什么。它只是为我打开了 Great Learning YouTube 频道。是的,我们在这里频道。嗯,让我在这里暂停一下。>> 是的,>> 让我暂停这个视频。对。所以,就是这样。是的,这是 Great Learning 的频道。对。所以,太棒了。我现在将再次关闭它。让我们去 PyCharm。我将再次关闭它,因为我设置了很多东西,它会捕捉所有东西。好的。所以,我将在这里终止它。现在,我要做的是检查当前时间。告诉我时间。好的,让我们也这样做。让我们也检查一下。晚上好,我亲爱的朋友。让我知道。我能帮你什么?你在找什么?>> 告诉我时间,>> 我最亲爱的朋友。当前时间是精确的 2011048。>> LinkedIn。打开这些东西需要一些时间。所以,我将从这里关闭它。好的。我将让它运行或去类似 LinkedIn 的地方。是的,没错。好的。好的。所以,因为我认为这需要太长时间,我稍后会运行它。首先,让我向你展示那些根据带宽运行得非常快的东西。好了,现在让我们来做电子邮件。好的,让我们来做电子邮件。Ed >> 晚上好,我亲爱的朋友,让我知道。我能帮你什么?你在找什么?>> 发送给另一个朋友。>> 我应该发送什么?>> 说你好。是的,>> 你的电子邮件已成功发送。>> 看,它说你的电子邮件已成功发送。让我们去这里。让我们打开它。看,我已经登录了那个电子邮件账户。所以,我可以从它那里发送电子邮件给任何人。好的,因为我已经设置好了那个特定的账户,我会打开它。我将从那里转到已发送文件夹。现在,我要做的是在这里。所以,我点击了电子邮件。看,它显示晚上 8:12。实际上,这是 0 分钟前。这意味着这是我制作这个视频时的当前时间。这是,说你好。我在那个特定的 PyCharm 项目中写的文本是说你好,这个说你好已经发送给了我在这里这个字段中输入的那个人的名字或电子邮件地址,对吧?所以我们已经做了画图,我们也做了 Great Learning Academy。看 YouTube 就像这样简单。它会打开 YouTube,它会打开谷歌。真的没什么大不了的。让我们打开谷歌,所以让我们为你们运行它。>> 晚上好,我亲爱的朋友,让我知道我能帮你什么。你在找什么?>> 打开谷歌。所以,它接下来会做什么?它只是会检查。它只是为我打开谷歌,对吧?所以,它只是打开那种东西,对吧?下载。http.google.com。我会关闭它,对吧?因为我希望你清楚地理解那个地方到底打开了什么。对?所以,我会关闭这个并从这里终止它。现在我们要做的就是,我将告诉你一两件你应该非常清楚的事情。好的。所以让我们非常清楚地看看这里。好的。所以让我们做一件事非常快速。让我们最后一次运行 LinkedIn,之后我将把它结束。所以这里是 LinkedIn。好的。需要做一件事。将这个 I 小写,就像这样,然后打开 LinkedIn 标签。现在我将非常快速地运行它。好的。让我们这样做。好>> 晚上好,我亲爱的朋友。让我知道我能帮你什么。你在找什么?>> 打开 LinkedIn。所以,看看它做了什么?它只是为我打开了 LinkedIn,对吧?所以,它为我打开了 LinkedIn。好了。现在,我将在适当的地方关闭它。然后我将结束它。好的。所以,我们运行了它。我们在所有情况下都快速尝试了一下。是的,它运行得非常好。运行得非常好。它运行得很好。我们也很享受。对。所以希望我通过这个项目清楚地说明了如何创建一个 Python 自动化项目,如何使用 Python 编程语言自动化事物。希望现在一切都清楚了。所以希望你喜欢这个项目,并且通过使用所有这些库和使用 Python 进行自动化,你从中获得了一些有用的东西。好了,本视频就到这里。在此之前,谢谢你,然后继续。所以让我向你介绍第一个主题,那就是 movie pi 库。首先,我们将详细讨论这个库。那么这个库是关于什么的呢?嗯,这个库实际上是为了视频编辑目的而开发的。当你想要做一些视频编辑时,这就是 movie pie 库,特别是 movie Python 库的作用。那么你可以用它做什么样的视频编辑呢?你可以连接视频。你可以简单地剪掉一个视频的一部分。你可以在视频中添加标题。你可以做视频处理,你可以创建自定义效果。所以这些都是你可以用 movie pie 库完成的所有不同的事情。好的。那么这个库支持哪些 Python 版本呢?所以你的 Python 应该是 2.7 或更高版本,但我推荐的版本是 3.4 以上。好的。所以,请确保你的 Python 版本高于 3.4。如果不是,那么就升级到新版本,当前可用的版本。或者如果你不知道如何升级,你可以简单地卸载 Python,然后在新版本的 Python 上安装到你的设备上。好的,我希望我对此很清楚。现在,当你想要做一些编辑,比如你想添加自定义效果,做一些视频处理,或者你想连接两个视频,连接意味着合并视频。好的,假设你有两个不同的视频,你想把它们合并在一起。这就是我们所说的连接。所以当你想要连接或者你想插入一个标题或者任何与视频编辑相关的简单任务时,如果你想做任何这些。那么 movie pie 库是所有这些情况中最受推荐的选择之一。接下来 movie pi 库还有另一个功能,这个功能实际上是我们将在这个 Python 项目的实际实现中使用 movie pi 库的主要原因。根本原因,主要理由是,这个功能极其通用的 Movie Pi 库还方便地让你能够轻松地读取和无缝地写入最广泛认可和最常用的音频和视频格式,当然也包括动画 GIF。你拥有非凡的能力,可以在 Movie Pi 库的宝贵帮助和强大功能下,对几乎所有可用的视频格式以及流行的 GIF 格式进行读取、写入和细致地执行所有这些多样而复杂的运算。所以这确实是我们今天在当前项目中特别选择使用这个极其有用的 movie pie 库的主要和首要原因。主要任务是什么?我们想要将任何视频格式,MP4、MP3,无论什么,转换为 GIF 格式的项目目标是什么?对?所以对于那个特定的情况,我的第一步是什么?我的第一步将是,我必须首先读取我的文件,我想要转换的完整文件,对吧?比如说我有一个 MP4 文件,现在我必须读取那个特定的文件,我想,嗯,我必须先读取它,所以当你想要将一个文件转换为任何其他文件格式时,这不仅仅是为了 GIF,这是一个普遍的事情,当你想要将任何文件从一种格式转换为另一种格式时。第一步是你必须读取那个文件。好的?movie pie 库允许你读取任何类型的文件格式。这就是为什么我们在项目实际实现中使用这个 movie pie 库来将视频转换为 GIF。好的,我希望我对此很清楚,使用这个 movie pie 库的原因。现在,我已经提到你需要确保你的 Python 版本大于 3.4。好的。接下来,安装过程是什么?对于安装,你只需要一个命令,那就是 pip install movie pie。我也会向你展示安装库的实际实现。但在这里,只是为了让你了解,我告诉你安装这个 Movie Pi 库的命令是 pip install movie pie。好的,我希望我对此 movie pie 库非常清楚。它是什么,它特别用于什么,它的功能是什么,为什么我们在今天的项目中要使用它,以及安装过程。我希望我对此都很清楚。现在让我带你到我们讨论的下一个话题,那就是 video file clip 函数。好的,让我告诉你一件事关于这个函数。这个函数只是 movie pie 库的一部分。对?几秒钟前我们了解了 movie pie 库。对?所以这个 movie pie 库,这个 video file clip 函数是 movie pie 库的一部分。好的。所以首先,如果你想使用这个 video file clip 函数,你需要做的第一件事就是导入 movie pie 库。之后,你可以根据自己的需要使用这个函数。好的,现在我将谈论它。video file clip 函数允许你将视频转换为任何其他格式。例如,如果你想将 MP4 视频转换为 GIF。所以 video file clip 函数允许你这样做。好的。接下来我将谈论参数,这个特定函数有哪些参数?好的,让我们来谈谈参数。所以首先你需要文件名。所以无论你有什么文件名,你想转换为 GIF,你可以使用它。我们 uh 好的,现在如果你只是输入文件名,请确保你也包含扩展名。扩展名意味着你的文件格式是什么?是 MP3 吗?是 MP4 吗?是什么?好的,请确保也包含在文件名中。第二,如果你想指定那个特定文件的路径,是的,你也可以这样做。你可以根据需要指定任何特定文件的路径。所以这两种方式都可以。你可以提供文件路径或文件名。这些选项中的任何一个都适用于这个特定参数。好的。接下来你有 has mask。现在这实际上是 uh 我们只设置为 true,如果你在视频文件中包含了一个掩码。好的。接下来你有 audio。所以如果你的剪辑,你的视频文件没有音频,我们就把这个 audio 设置为 false。好的。或者如果你不想读取 so,在这种情况下,你将 audio 设置为 false。好的。我再说一遍。如果你的视频剪辑没有音频,或者如果你不想读取音频,你就把这个 audio 参数设置为 false。好的。在这种情况下,你将 audio 设置为 false。接下来,你有 target resolution。所以,你可以设置帧,你可以设置分辨率,你可以设置所需的宽度和所需的高度。这取决于你。你希望那个视频剪辑的长度和宽度是多少。好的,你可以相应地设置。接下来,你有 resize algorithm。所以,无论有什么算法,如果你想调整它的大小。所以,你可以调整大小,但默认使用的算法是 by cubic。好的。所以,by cubic 是使用的默认算法。接下来,你有 FPS source。所以,当你想要从元数据中获取它时,在这种情况下,你使用这个 underscore source 参数。现在在这些参数中,有两三个参数是特别使用的。第一个是你的文件名。第二个是你的音频。这两个是你在使用 video file clip 函数时最常用的。我希望我对此很清楚。现在这是一个函数。这是一个方法。所以它不需要任何安装。一旦你安装了 Movie Pi 库,所有这些函数都会自动可用,你可以使用你需要的任何函数。好的?所以它不需要任何安装。我已经向你介绍了参数,包括哪些是最常用的。所以现在我将带你去我的 PyCharm IDE,在那里我们将看到一个将视频转换为 GIF 的项目的实际实现。所以让我们去我的 PyCharm IDE,首先我们将了解安装过程。之后,我将向你展示我们项目的实际实现。好了。所以我们现在在 PyCharm IDE 中,从这里我将编写我的代码,并向你展示如何导入和安装所有东西。所有东西都将在我的 PyCharm IDE 中完成。好的。现在,有一件事我想指出。比如你可以使用任何你个人喜欢的集成开发环境。如果你想使用流行的选择,如 VS Code、Jupyter Notebook 或 Spyder,你可以使用任何你觉得舒适和高效的东西。但我强烈建议,你绝对要避免使用任何基于在线的集成开发环境,因为特别是为了成功完成这个项目,你应该有一个视频文件随时可用,几乎任何你想要转换为动画 GIF 文件的视频格式。至关重要的是,这个特定的视频文件应该与你的主 Python 脚本文件位于同一个文件夹中,而这正是你将积极编写和开发项目代码的地方。好的。所以,在这种特定情况下,你确实需要注意这些事情,特别是因为这实际上无法在在线 IDE 上完成。这就是为什么我建议你根据自己的方便使用任何离线 IDE。好的。现在我将要做的是,我正在使用 PyCharm。所以在这个 PyCharm 上,我有终端,我可以使用那个终端来安装我相应的库。好的。所以,我将回到或者去这个特定的终端。从这个终端,我可以做什么?你可以简单地安装库。所以安装我的 movie pi 库的命令是 pip install movie pi。好的,这是你必须使用的命令。输入该命令后,按 Enter。现在它会做什么?它会为你安装这个特定的库。这需要一些时间,取决于你的互联网带宽,它会完成。但对我来说,需求已经满足,因为我已经在我设备上安装了它。所以它显示我需求已满足。但如果你还没有做那件事。所以它会花费你一些时间,最后它会显示你已成功安装。好的。所以,我将要做的是,我将稍微放大一下,我也会在这里写出命令,这样如果你愿意,你可以参考一下。pip install movie pie。好的。P 不会是大写。所有东西都是小写的。好的。非常好的。希望我对此非常清楚。现在进一步向下,我将导入我们刚刚安装的库。那就是 movie part。好的。所以,我将写出你,从 from movie part doeditor as movie part dot editor。我将导入星号。我写的第一行是什么?它的意思是?所以 movie part 是我们都非常熟悉的库,对吧?我几分钟前也提到了我们刚刚安装了这个 movie pie 库。现在我们实际上想做什么?我们实际上想将一个 MP4 格式的视频剪辑转换为 GIF 格式的视频剪辑。对?我们正在做这件事。所以现在在这个简单的例子中,我只是使用了 movie part.editor。好的,我使用了 movie part.editor。所以这个 movie part.editor 将实际帮助我完成这些事情。好的。现在当我写 import asterisk 时,这意味着我将导入我们在这个 movie pi.editor 文件中的所有函数。好的。所以当我写 up here movie pi.editor import asterisk 时。所以 import asterisk 意味着从我的 movie pi.editor editor 库中。我将导入我在这里拥有的所有必需函数,因为我需要那些函数,因为我现在,这对于你一遍又一遍地写 import this function 或 import that function 来说是一项繁琐的任务。所以一次性导入你所有的相关函数。现在进一步,你可以使用你选择的任何相应函数。让我向下。所以现在我将创建一个变量 convert video name。那么这个变量实际上会存储什么?这个变量将存储你想要转换为 GIA 的视频 cry 的名称。好的,我将使用 MP4 格式。好的,你可以选择任何你喜欢的。所以,我将写 video file。那将是 file clip。好的,video file clip。这将是我的相应函数名,而那个函数是我从 movie pi.editor 库中导入的。所以这个 video file clip 我之前稍微提过它,关于它是什么,如何使用它,以及你在这里拥有的东西。好的,所以 video file clip,完成了。现在在括号里,你将输入你想要转换的文件名。所以,我有一些 MP4 文件格式。我想转换那个 MP4 文件格式。但那个特定的东西我将在我的程序完成后写出来。好的。现在让我们向下。现在我将再次使用 convert video_ame。好的。这里我们将有 write_GF。好的。Write_GF。这是关于什么的?所以 convert video name。这是相应的,作为你的变量,对吧?而这个 write_GF 是什么?所以这个 write_GF 是相应的函数,它将帮助你将我的 MP4 文件格式写成 GIF 文件格式。好的,这就是这个 arrf 函数的用途。所以,通过这个,我只是使用了这个 convert video name 变量。原因是,因为这个 convert video name 变量,它存储着我想要转换为 geo 格式的文件。对?因为它是一个变量,它存储着我想要转换为特定 GIF 格式的相应文件格式和相应文件。所以现在在那个特定的键上,你可以简单地使用它。所以这个 video clip file 函数将存储你想要转换的文件名,而这个 write gf 将实际存储文件,你必须根据你的选择给它一个名字,也就是说,你想把那个 MP4 转换成 geo 格式的文件叫什么名字?好的,所以希望我对此非常清楚。首先,关于这些函数是什么,以及你如何写这些东西。现在进一步,我将写出我的视频文件名,我拥有的。现在要确保的一件事是,那个特定的视频应该存在于你的 Python 文件实际存储的同一个文件夹中。好的,肯定应该在那里。它应该在那里。我再说一遍。它应该在你保存 Python 文件的那个特定文件夹中。你应该有一个 Python 文件,你在那里编写代码。而你想要转换为 GIF 的视频剪辑也应该在同一个文件夹中。好的,所以我希望我对此部分非常清楚。关于编写程序。现在我们将继续编写我们的文件名,然后我们将转换它们并检查这个项目的最终输出。好的。所以希望到目前为止,我对此非常清楚。关于我们写过的所有代码。好了。那么我这个动手实践,这个视频项目,我的最后一个任务是什么?那就是我要放上我的视频文件名,并给它一个名字,我想要的 GIF 文件将以什么名字创建,然后我们将运行我们的程序,并等待一段时间,因为这取决于你正在创建的那个视频的持续时间。好的,如果你使用一个非常大的视频来转换视频到 GIF,它可能会花费一些时间。好的,它可能会花费。所以现在我要做的是,我将去我的笔记本电脑的桌面。好的,现在在这里的桌面上,我有一些文件,比如,比如我希望你能看到这个文件和这个相应的。好的,让我们检查一下这些文件的属性。好的,所以如果我进入属性,看,我现在有一个 MP4 文件格式。对?现在我将要做的是,首先我将复制这些文件,然后我将把它们放到需要它们的位置。现在我刚才的意思是什么,让我告诉你。所以,有一个位置,你的 Python 文件保存在那里,你在那里写项目。对?我希望你那里有那个位置,你在那里写文件,你在那里写 Python 代码,而那个文件保存在你笔记本上的某个位置,某个路径,对吧?所以,我必须把那些 MP4 文件保存在我的 Python 文件保存的同一个路径上,我正在那里写视频到 GIF 转换的代码。好的。正如我在一开始建议你的,我告诉你有一个 MP4 文件格式,对吧?现在,我将告诉你如何把这个文件放到那个位置,以及从哪里找到那个位置。所以,比如说这个 lang py,这是我写代码的文件。好的,我会点击它,我会右键单击。好的。现在右键单击。我会去这里,点击复制路径,它会告诉你你的文件实际保存在哪里。好的。所以你可以从这里找到它。对我来说,我已经知道我的这个文件,lang.py,在哪个窗口,哪个位置保存了。好的。所以,我会做什么?让我再次打开那个桌面。比如说,首先,我将转换这个视频。这是一个非常短的视频,26 秒,而且是来自 Great Learning 本身。好的。视频是 A IML trends in 2022。所以让我们从这里复制出来。我将和你一起复制出来。现在我要做的是去相应的位置。所以对我来说是 Windows C,然后是 users。我是 user,然后我在 PyCharm projects。然后在这里是我的相应位置。好的。嗯,太好了。所以我可以这样做,然后稍后最小化其他东西。但是的,这很好。我将做 Ctrl + v。所以,看这里。Aiml trends in 2022。这个文件实际上已经来到我这里的这个特定位置了。我将再次检查属性。让我给你看看。名字是 A IML 2022。文件格式是 MP4。好的。进一步它是 26 秒长。所以我会展示它到详细信息,然后从这里你就能知道。好的,长度是 26 秒。我将立即向你展示三个输出演示。现在让我先向你展示这是关于什么的,以及这个文件实际上看起来是什么样的。所以,请给我一秒钟。是的。所以这基本上就是文件的样子。我没有给你看完整的视频,但是的,这就是这个文件看起来的样子。好的,它是一个来自 Great Learning 本身的非常短的视频。所以,现在这个完成了,我将对我的另外两个视频也做同样的事情。所以,这个完成了,接下来我要做的是,2022 年最热门的数据科学职业,Valerie。好的,所以让我们快速复制这个视频,然后我要去我的相应位置。那就是 Windows C,然后是 users。这里有 users 和我的 Python projects。这里是我的文件夹。我将把它粘贴在这里。一秒钟。所以,看这里,它是 2022 年最热门的数据科学职业,Valerie。让我们现在检查它的属性。所以,这里是。好的,让我把它拿出来。太好了。所以,是的,它仍然是一个 MP4 文件,正如我之前告诉你的,2022 年最热门的数据科学职业,Valerie。至于详细信息,它有 28 秒长。好的,我将点击确定。我也可以运行它并向你展示这是什么,以及这个视频看起来是什么样的。太好了。是的,我希望你对这个视频本身非常熟悉,它看起来是什么样的。现在,我的第三个在哪里?我还有一个。那就是 2022 年最热门的数字营销职业,Celery。好的,让我们快速复制那个出来,然后我将带你到 users,这里是我的 Python projects,这里是我的相应文件夹,我将把文件粘贴在这里。所以,是的,我们在这里。让我打开它的属性,让我们看看。所以,马上,是的,它仍然是一个 MP4 文件。名字是 2022 年最热门的数字营销职业,Celery,这里是详细信息。它有 16 秒长。好的,太好了。所以,是的,这些都是我想要的三个视频。我将去 PyCharm。现在当你在这里查看时,你会看到这三个视频都在这个 PyCharm 文件夹中,我的文件保存在那里。好的,所以让我们在这里检查一下。在这里,你有 2022 年最热门的数据科学职业,2022 年最热门的数字营销职业,还有一个应该是 A IML。在这里。A IML 20 和 22。太好了。看,所有这些文件都完成了。我首先要做的是处理那个非常短的。那就是 2022 年最热门的数字营销职业,Celery。好的,让我们这样做。所以,在这里这个部分,我将输入那个特定的文件名。好的,我将输入文件名。是的。看,我刚开始输入 most mo,它就给了我选项。我将选择数字营销那个。好的,因为那是我们拥有的最短的视频。所以,是的,我马上输入了文件名,2022 年最热门的数字营销职业,Celery.mpp4。好的,请确保你也包含扩展名。扩展名意味着它是 mpp4。所以,是的,你必须做同样的事情,加上 .mpp4。好的,完成了。在这里的 write_gif 函数中,我告诉你,在这里你将输入你的 GIF 将拥有的名字,那个上面的视频将被转换成什么名字。好的。所以,我将使用 gl_gif1 作为我的文件名。所以,这样你就可以给你的文件名起名字 gl_gif1。太好了。希望我对此非常清楚。是的。文件格式是什么?文件格式是 GIF。所以我必须在这里提到 underscore GIF 1.GIF。好的。你必须这样做。是的,就这样。是时候运行我们的项目了。所以让我们在这里点击运行。之后,我将再次解释事情,直到它需要一些时间进行转换。然后我将解释,好的,所以是的,它实际上正在被转换。它正在被转换。它会向你展示那个过程,执行了多少秒。好的,现在,直到那个时候,我可以再次给你一个概述,这里做了什么,直到这个地方。对?所以正如幻灯片所说的,movie file 库实际上帮助我们完成了所有这些事情。它帮助你将任何相应的文件转换为任何其他相应的命令文件。比如说,这里我们正在转换 MP4。所以,是的,在那个特定的地方,MP4 被转换为 GIF 格式。太好了。这就是文件在这里完成的。现在,看看这里是什么。它开始构建一个文件 gl_gia1.gif。好的。使用 image io,对吧?现在看,它显示了百分比,它需要多长时间来转换你的文件,以及完成了多少百分比,以及所有这些东西,它需要时间。好的,直到那时我可以向你解释我们做了什么,然后我们可以继续处理其余的事情。所以,嗯,这里是的,我正在谈论我在这里做了什么。所以,这个文件,我们拥有的 most in demand digital marketing carriers,那是我们的 MP5。所以这个 movie pie 库,movie file.editor,我们在 Python 编程语言中拥有它,它实际上帮助我将这个文件转换为 GIF 格式。对?所以在这个里面,我们有一些函数,只有通过那些函数,它才帮助我将我的任何文件格式转换为我的 GIF 文件。好的。所以这里可以做的是,我拥有,比如,我的 MP4 文件对 most in demand digital marketing carriers。太好了。现在我们拥有的那个文件是 MP4 文件。我首先想要那个文件,那个视频文件名,把它放在这里,这样我们就能知道我们要转换的是哪个文件。所以,我在 video file clip 函数中做了什么?我输入了我的文件名,伙计们。确保你也在这里输入你的文件名,伙计们,因为这是你必须做的最重要的事情。如果你不这样做,可能会导致错误的输出。好的。所以,请确保你实际上是输入了带扩展名的文件名。所以我这样做了,我把那个东西保存在我们相应的变量名上。现在,在保存在那个相应的变量名之后,这里正在做的是,我们正在使用 write_gif 函数进行转换,我们只是将这个相应的转换为 GI,好的,这已经完成了。现在我要做的是,看,现在进程以退出代码零完成。这意味着我的文件已经被转换了。我怎么检查呢?所以去同一个位置,这是我的位置,我的文件名是什么?我的文件名是 gl_gif1。让我放大一下。呃,它去哪儿了?就在这里。就在这里。好的,我只是复制一下。我把它复制并粘贴到我的桌面上。太好了。现在这是我已经转换的文件。我将这样做。然后我将去属性检查一下。那是什么?那是另一种类型。我的文件是 GIF。让我打开它。然后一秒钟。让我把它拿出来。对?我的文件名是什么?我的文件名是 gif.gif。对?所以我的文件名是 gif,尺寸已经在这里显示了。现在为什么它没有显示任何持续时间?为什么它没有显示?因为它是 GIF 文件。GIF 文件没有持续时间,因为它们会不断循环。它们会不断重复。对?所以这就是为什么在这里我的 GIF 文件不会这样打开。呃,对不起。我没有得到我的 GIF 文件的任何持续时间。所以项目类型是 GIF 文件,对吧?尺寸与我的原始文件相同。尺寸不会改变。实际上什么都不会改变。好的。什么都不会改变。它将保持原样。好的。所以我想我已经让你清楚地了解了这里是如何转换的。对?我希望我对此部分很清楚。现在,我要做的是去那个特定位置,那个文件在那里,然后我将立即双击这个文件。所以,让我做一件事。让我在这里关闭它。太好了。现在我实际上可以,现在当你必须打开这个 GIF 文件时,你将右键单击,然后你将用你相应的视频文件格式打开它,无论你在那个地方有什么。好的,太好了。所以,是的,我希望我对此部分非常清楚,关于将其转换为 GIF,对吧?所以,无论你有什么支持 GIF 文件并且可以运行 GIF 文件的相应应用程序或工具,你都可以将其转换并作为 GIF 文件运行,对吧?所以这部分应该对你来说很清楚。接下来,我要做的是更改我的文件名。好的,我将更改名称并向你展示另一个例子。让我们来做 AI/ML。好的。在这里,我将把名字叫做二。好的。这次我将运行这个项目。所以它又需要一些时间来将相应的 MP4 文件转换为 GIF 格式。它又需要一些时间来转换。好的。所以,现在让我们非常快速地在这里开始。转换将在短时间内开始,因为它取决于视频长度。现在这个 AI/ML twins 文件大约是 28 或 26 秒,对吧?所以现在看,它正在开始构建我的 GIF 文件,对吧?它已经开始了。所以现在它需要一些时间,它将在这里将这个文件转换为 GIF 格式。好的,它需要一些时间,它将简单地转换它。所以直到那时,我希望我对此非常清楚。这些事情是如何完成的,它们实际上是如何发生的。我们可以使用哪些方法,以及你如何简单地将任何相应的视频文件转换为 GIF 文件?好的,我只是把它移下来了,因为它实际上在做它的事情。太好了。所以,不仅是 MP4 文件,而且是的,你也可以使用更多视频格式,并且根据你的方便,你可以将任何相应的视频格式转换为 GIF 格式。所以,这就是你可以制作的方式。

一个项目。你可以动手将视频转换为 GIF。现在,这并不难,对吧?你只需要在这里写三到四行代码。仅此而已。对吧?所以,在这种情况下,它的工作方式相同。但请确保你使用的是支持运行 GIF 文件的应用程序或软件来打开你的文件。好吗?因为正如我们都知道的 GIF,你的文件会播放,然后会重新开始,并持续播放,持续播放。它不会停在某个特定的点。就像它没有结束时间一样。对吧?GIF 文件没有结束时间。无论你花费多少时间,它们都会一遍又一遍地播放。所以,请确保你在正确的软件中打开文件,那种真正支持 GIF 文件格式的软件。对吧?所以,一旦文件格式被转换,一旦 74 文件被转换为 GIF,我们就可以在各自的文件夹中查看它。但是,是的,关于那个设置只有一件重要的事情。你必须确保你拥有的视频文件实际上保存在你保存文件的同一个文件夹中。你编写程序的那个文件。主要的事情是,无论你的文件保存在哪里,你的视频文件也应该保存在同一个位置。否则,你将得不到输出。它会显示位置错误。好。是的,我想我的文件现在已经转换好了。是的,它已经转换好了。我将转到这个特定的文件。让我关闭这个。好的,完成了。是的,这是我的位置。是的,它是 glyph 2。我将打开它。我将点击属性。是的,现在它是我的 GIF 文件。GIF。好的。在这里,你可以将其更改为你想要打开它的相应位置。你可以相应地进行操作。没关系,对吧?你可以用任何东西打开它。我将从这里关闭它。好的。我将去点击详细信息。是的,对于详细信息也是完全一样的。项目类型是 GIF 文件,这是文件所在的相应文件夹,所有信息都写在那里。尺寸也与我们设置的相同,对吧?太好了。所以,我们对这个关于转换 GIF 文件部分已经很清楚了。所以你可以说将 MP4 文件转换为 GIF 文件。这就是你可以做文本的方式,对吧?现在让我们来总结一下这个视频到 GIF 文件转换 Python 项目。>> 好的,让我们看看什么是 QR 码。所以 QR 码代表快速响应码,对吧?QR 码的全称是快速响应码,它是一种机器可读的图像,可以使用智能手机摄像头即时读取。如果你有智能手机摄像头,是的,你可以开始读取它。你可以开始读取任何 QR 码。那么什么是 QR 码?它包含,你知道,某些信息。每个 QR 码都有一定数量的黑方块。你可以看到这些是我们拥有的黑方块,它们将包含某些信息,对吧?这就是我们使用 QR 码的方式。它将获取所有信息并创建一个像这样的 QR 码。我们在 PTM 中使用 QR 码。我们在 Google、Google Pay、Paytm、Phone Pay 中使用 QR 码,基本上到处都使用。我们知道这些 QR 码有效。但是如何?所以基本上这些 QR 码块包含某些信息。对吧?现在当这个代码被摄像头扫描时,它会将该信息翻译成人类可以轻松理解的东西。对吧?是的。那么这里发生了什么?所以基本上 QR 码会创建一个特定的代码块,所有信息都存储在那里,并且可以被摄像头读取,然后从那个摄像头变成人类可以轻松理解的东西。为什么?这就是 QR 码的含义。所以让我们看看我们将如何做到这一点。所以为了做到这一点,我们将安装两个库。一个是 PI QR code,对吧?我们在 Python 中有这个库。那么这个 PI QR code 模块是什么?它是一个 PYQR code 库。它是一个 Python 中的 QR 码生成库。这个模块自动化了创建 QR 码的大部分过程。这个模块试图尽可能严格地遵循 QR 码标准,并且 PIQR code 中使用的术语和编码直接来自标准。所以这些是这个特定库的直接来自文档的基本解释,基本上我们使用这个库来创建我们的 QR 码。所以我们将要做的是我写了 pip install piqr。这就是你可以安装它的方式。现在我们已经安装了 pipng。为什么是 piping?这是为了图像保存你的图像并创建你的图像。所以这就是为什么我们使用了它,对吧?所以我们已经安装了 pipgene。所以我们将要做的是从 piqr 导入 QR code。所以我们写了 import piqr,对吧?我将它尽可能地放大。然后我们做了什么?我们导入了 png。好的。从那里我们有 pyqr import QR code。对吧?现在我们将要做什么?一个代表 QR 码的字符串。假设我给了 Great Learning Academy 的链接。让我告诉你我如何获得链接。对吧?如果我双击这里,对吧?你能看到我得到什么吗?我得到 w.greatlearning.in/academy。对吧?所以如果我回去,让我告诉你它将如何工作。你能看到我得到什么网站吗?我得到 wg greatlearning.in/academy。对吧?我在这里写了 http 然后 wg greatlearning.in/academy。在这里我们将有一个名为 site 的变量。好的。然后你可以做什么?假设一个特定的公司有他们的网站,他们已经在那里上传了他们的菜单,对吧?既然他们已经在那里上传了他们的菜单,他们现在想要使用那个特定的菜单通过 QR 码。那么他们将如何做到这一点?要制作 QR 码,你需要提供什么?你需要提供链接。所以我们现在要做什么?我们将写一个名为 site 的变量,site = http P.Greatlearning.in,因为我想为这个特定的网站创建一个 QR 码。好的。现在,如何生成 QR 码?你只需要写,让我删除这部分。让我把它放在这里。好的。所以,我们所做的一切,我们将生成一个 QR 码。如何做到?好的。好的。那么,如何做到?我再次写了我们特定的变量 URL_qr = pyqr create。所以现在试着理解我们已经使用了,好的,所以我们写了 pyqrd.create,然后我们写了 with site 我想重定向你。所以 create 函数用于创建 QR 码。所以我们将要做什么?我们写了 pyqr.create,然后我们创建了 site。好的,那是什么?那里面有什么?那就是你想将你的客户或所有流量重定向的地方。在你完成了 QR code.create 之后,并且在其中,它将创建 QR 码。现在我想将 SVG 文件命名为,比如在这里,我更改了名称,对吧?好的。好的。现在我将谈论,什么是 SVG 文件?什么是 Kle?矢量图形。好的,这是一个尤其在图像处理中使用的术语,你可以说它是一种基于可扩展标记语言的矢量图像。所以这是你现在不需要理解的东西,但你可以得到这个想法。我们使用 SVG 来获取矢量图形。对吧?好的。现在我将要做什么?我将以 PNG 文件名保存它。对吧?所以在这里你可以看到我也得到了一个 SVG 文件,并且在这里我也得到了创建的 PNG 文件。如果你不想要,你知道 SVG 文件,那么你可以做什么?只需注释掉它。所以如果你只想创建 PNG 文件,你需要写什么?在 URL_qr 中,你创建了你的 QR 码。png,对吧?好的。PNG。我给 PNG 文件起了名字并设置了比例为五。实际上,我刚刚将比例设置为五或六。如果我想向你展示我得到了什么,让我向你展示。好的。而且,如果你正在使用 Google Collab,并且你想检查你保存了哪些文件,它们是否已经存在,这里有一个盒子图标,对吧?你能看到这个文件夹吗?只需点击那个盒子,伙计们。你能看到我得到了我的 SVG 文件和 PNG 文件,对吧?让我告诉你为什么它没有显示出来。好的。好的。它在这里显示了。好的。