首页 > 编程语言 >嗨翻-Python-第三版-早期发布--全-

嗨翻-Python-第三版-早期发布--全-

时间:2024-06-17 19:10:12浏览次数:25  
标签:Python 代码 第三版 列表 -- 一个 字符串 我们

嗨翻 Python 第三版(早期发布)(全)

原文:annas-archive.org/md5/417e7d9e18255015d2c5d146fdf36e20

译者:飞龙

协议:CC BY-NC-SA 4.0

序言

安装最新的 Python 3

你在这里所做的取决于你正在运行的平台,假定是其中之一的 WindowsmacOSLinux

好消息是所有三个平台都支持最新的 Python,即 3.10 版本。没有坏消息。

Image

如果你已经运行了 3.10 版本或更高版本,请翻到下一页 – 你已准备就绪。如果你尚未安装 Python 或使用的是旧版本,请选择下面适合你的段落,继续阅读。

在 Windows 上安装

微软出色的 Python 开发人员通过 Windows Store 应用程序确保最新版本的 Python 始终对你可用。打开 Store,搜索“Python”,选择最新版本,然后点击 Get 按钮。耐心等待进度指示器从零到 100%,安装完成后,移至下一页 – 你已准备就绪。

在 macOS 上安装

最新的 Mac 附带了旧版本的 Python。不要使用这些版本。而是前往 Python 的官网 www.python.org/,然后点击“Downloads”选项。Python 3 的最新版本将开始下载,因为 Python 网站能智能地检测到你是从 Mac 连接过来的。下载完成后,在 Downloads 文件夹中运行等待你的安装程序。点击 Next 按钮,直到没有更多 Next 按钮可点击,安装完成后,移至下一页 – 你已准备就绪。

注意

不需要移除 Mac 预安装的旧版本 Python。这次安装将替代它们。

在 Linux 上安装

Head First Coders 是一个由技术人员组成的团队,他们的工作是让 Head First Authors 走上正确的道路(这可不是一件简单的事)。这些程序员热爱 LinuxUbuntu 发行版,因此在这里进行了讨论。

没有什么奇怪的,最新的 Ubuntu 已安装并更新了 Python 3。如果是这种情况,很好,你已经准备好了。如果你使用的是除 Ubuntu 外的 Linux 发行版,请使用系统的软件包管理器将 Python 10(或更高版本)安装到你的 Linux 系统中。一旦完成,移至下一页 – 你已准备就绪。

让我们用两件事完成你的安装:一个是必需的后端依赖,另一个是现代的、Python-aware 文本编辑器。

Python 本身并不足够

为了探索、实验和学习 Python,你需要在 Python 中安装一个运行时后端叫做 Jupyter。正如你马上会看到的,这很简单。

在创建 Python 代码时,你可以使用几乎 任何 程序员的编辑器,但是在阅读本书内容时,我们推荐你使用一个特定的编辑器:微软的 Visual Studio Code,全球知名的 VS Code

Image

安装最新的 Jupyter Notebook 后端

注意

别担心,你很快就会了解这是用来做什么的!

无论你正在运行哪个操作系统,请确保连接到互联网,打开一个终端窗口,然后键入:

python3 -m pip install jupyter

屏幕上会快速显示大量的状态消息。如果你看到接近结尾的消息显示“成功安装”,那么你就成功了。如果没有,请查阅 Jupyter 文档并重试。

图片

安装最新版本的 VS Code

拿出你最喜欢的浏览器,然后浏览到 VS Code 的下载页面:

code.visualstudio.com/Download

注意

虽然有替代品可以替代 VS Code,但在我们看来,当涉及到本书的内容时,VS Code 无与伦比。而且,不,我们是某种全球阴谋来推广微软的产品!!

选择与你的环境匹配的下载,然后等待下载完成。按照网站的说明安装 VS Code,然后翻页学习如何完成你的 VS Code 设置。

根据你的喜好配置 VS Code

图片

第一次运行 VS Code。从菜单中选择文件,然后首选项,然后设置来访问编辑器的设置偏好。

注意

在 Mac 上,从“Code”菜单开始。

你应该看到类似这样的东西:

图片

直到你熟悉 VS Code 之前,你可能希望配置你的编辑器以匹配Head First Coders偏好的设置。以下是本书中使用的设置:

  • 缩进指南已关闭。

  • 编辑器的外观主题设置为Light

  • 编辑器的缩略图已禁用。

  • 编辑器的出现高亮已关闭。

  • 编辑器的渲染行高亮设置为none

  • 终端和文本编辑器的字体大小设置为14

  • 笔记本的显示单元格状态栏设置为隐藏

  • 编辑器的灯泡已禁用。

注意

你不必使用这些设置,但是如果你想在屏幕上看到本书中看到的内容,那么建议进行这些调整。

添加 2 个必需的 VS Code 扩展

图片

尽管你不必复制推荐的编辑器设置,但你绝对必须安装两个 VS Code 扩展,即PythonJupyter

当你完成调整你首选的编辑器设置后,通过点击 X 关闭设置选项卡。然后,点击主 VS Code 屏幕左侧的扩展图标来搜索、选择和安装扩展:

图片

VS Code 的 Python 支持是最先进的。

安装 Python 和 Jupyter 扩展实际上会导致安装几个额外的 VS Code 扩展,如下所示:

图片

这些额外的扩展增强了 VS Code 对 Python 和 Jupyter 的支持,超出了标准扩展的内容。虽然目前您不需要知道这些额外扩展的作用,但要知道:它们有助于将 VS Code 打造成一个功能强大的 Python 编辑器。

Image

安装了 Python 3、Jupyter 和 VS Code,您就准备好了!

注意

是的,这是关于 Geek Notes 的 Geek Note(我们不会开任何递归笑话,谢谢)。

第一章:为什么选择 Python?:相似但不同

图片

Python 从零开始计数,这听起来应该很熟悉。 实际上,Python 与其他编程语言有很多共同之处。有变量循环条件函数等等。在我们的开篇章节中,我们带你快速浏览 Python 的基础知识,介绍语言而不深入细节。你将学会如何在 VS Code 和 Jupyter Notebook 中创建运行代码。你会看到很多编程功能已经内置到 Python 中,你将利用它们完成工作。你还会了解到虽然 Python 与其他编程语言分享了很多想法,但它们在你的 Python 代码中的体现可能会有所不同。现在,不要误解:我们说的是不同的,而不是不同的。继续阅读了解更多…

图片

当然了。但,这还不是全部。

正如与 Python 的访谈所证实的那样,有很多理由使 Python 受欢迎。我们列出了我们从访谈中得到的要点在本页底部。

当然,还有其他理由可以考虑 Python 作为你下一个最喜爱的编程语言,但我们的列表已经足够现在使用了。

让我们花点时间更详细地考虑这些要点。一旦你调查完我们的列表,拿一支铅笔——是的,一支铅笔——到下一页的顶端来见我们!

图片 Python 代码易于阅读。

图片 Python 带有标准库。

图片 Python 拥有实用、强大和通用的内置函数(BIFs)。

图片 Python 带有内置数据结构。

图片 Python 拥有 Python 包索引(PyPI)。

图片 Python 并不太认真。

注意

不要低估最后一个的重要性。

准备好运行一些代码

在你运行任何代码之前,还有一点点前期工作要做。

为了帮助保持事情井井有条,让我们在你的计算机上创建一个名为Learning的文件夹。你可以把这个文件夹放在硬盘的任何地方,只要你记得你把它放在了哪里,因为你经常会用到它。

创建了你的Learning文件夹后,启动 VS Code。

图片

注意

如果你跳过了介绍而感到难过,不要紧。你不是第一个这样做的,也不会是最后一个。 图片

图片

每次在本书中使用 VS Code 时,根据需要打开你的Learning文件夹。现在就这样做

为你的第一次 Jupyter 体验做准备

好的。您正在运行 VS Code,并且已打开了您的Learning文件夹。首先选择文件菜单,然后选择新建文件…菜单选项来创建一个新的笔记本。您将看到三个选择:

图片图片

VS Code 创建并打开了一个新的、无标题的笔记本,称为Untitled-1.ipynb,它会出现在屏幕上,大致如下所示:

图片

鼓声响起,您现在可以输入并运行一些 Python 代码了。

图片

没必要,只需按下 Shift+Enter 即可。

Jupyter 提供了设计精良的键盘快捷键,使您与笔记本的交互变得轻松,比如同时按下ShiftEnter键。

注意

当您在本书中看到“Shift+Enter”时,请按住 Shift 键,然后轻按 Enter 键(在释放两者之前)。

按下 Shift+Enter 运行单元格中的代码

当您按下Shift+Enter时,当前选定单元格中的代码将运行。然后焦点会移动到笔记本中的下一个单元格。如果不存在“下一个单元格”,Jupyter 会为您创建一个新的单元格:

图片图片

代码运行了,但没有产生输出。

这三行代码是 Python 变量赋值的示例。变量的名称在**=**运算符的左侧,其值在右侧。

这些变量的值由此代码定义

图片

仍然没有输出,但是此代码正在执行。

导入语句已引入random库,并且def语句已定义了draw函数。让我们运行一下这个函数,看看会发生什么…

所以… Python 代码确实很容易阅读… 和运行

除了 Jupyter,还有其他运行 Python 代码的方式,随着您在本书中的学习,您将了解其中一些方式。但是,在我们看来,使用带有 Jupyter 扩展的 VS Code 是学习该语言时阅读、运行、实验和玩耍 Python 代码的完美方式。所以准备好在 Jupyter 和 VS Code 中花费大量时间

继续前进之前,请花一点时间从 VS Code 菜单中选择文件然后选择保存,将您的笔记本保存为Cards.ipynb

注意

现在就这么做!

如果您想要一堆卡片怎么办?

您的draw函数是一个很好的开始,每次执行该函数时从牌堆中抽取一张牌。但是,如果您想抽取五张牌呢?或者十张?或者二十张?或者所有五十二张呢?

虽然手动多次调用您的draw函数可能有点蠢,大多数程序员会选择使用循环。稍后在本书中您将更多了解 Python 的循环。现在,这是如何使用 Python 的for循环执行一些代码固定次数的方法:

图片

从表面上看,for循环的缩进块运行了五次。但是,你能发现输出中的问题吗?

图像

是的,循环代码画了相同的牌两次。

当然,这里的假设是抽取的牌不会放回扑克牌堆中。所以... 除非你在玩“魔术牌”(或者有人在搞破坏),否则这段代码随机选择相同的牌不太可能是所需的。

如果你的目标是模拟一副扑克牌,那么当前的draw函数显然不够格,对吧?

The Big 4: list, tuple, dictionary, and set

Python 对数据结构的出色内置支持是传奇的,并且通常被认为是大多数 Python 程序员热爱Python 的主要原因。

作为你的开篇章节,我们现在不会给你过多深入讨论这些数据结构。后面本书有很多页(实际上是整整的章节)专门讲解The Big 4

虽然我们还没有特别强调它们的使用,但你已经遇到了列表元组。虽然我们稍早有些狡猾地称它们为数组,但它们确实是 Python 中的真正,诚实可靠的列表

图像

你也见识过不少元组。每次调用draw函数时,它都会给你一个元组

图像

你可能会觉得元组看起来有点奇怪,我们也得承认我们也觉得它们看起来有点奇怪。不过,不要让这担心你。

本书后面你将更多地了解列表和元组。尽管列表和元组各有其用途,但在模拟一副扑克牌时,它们并不是一个很好的选择。这里需要一些其他的数据结构。但是,哪一个呢?

注意

提示:这一页的标题里有一个重要的线索。

用什么数据结构来模拟你的扑克牌堆呢?

虽然 Python 的字典数据结构非常受欢迎,但它主要提供查找功能(这个特性稍后在本书中将会有大量介绍)。尽管如此,和列表以及元组一样,字典并不是模拟你的扑克牌堆的最佳选择。

这留给你的是set

在 Python 中,集合就像数学课上的集合:它们包含一组唯一的值,不允许重复。正如下面的代码片段展示的那样,当你使用 Python 集合时,你会继承一个叫做add的方法,这个方法 - 准备好了吗 - 将一个项目添加到现有集合中。

看看这个循环,它使用上一页的三个列表构建一副扑克牌。

图像图像

这应该不会让人感到意外。

与任何循环相关联的代码块可以包含任何其他代码,包括另一个循环。这是理所当然的。但是,你注意到 Python 使用缩进使得确定哪个块属于哪里变得很容易了吗?

使用 BIFs 更多地了解你的变量

Python 的内置函数有很多用途。虽然你在这一章的前二十页中学到的东西还不多,但你已经了解了一些lenprintrangeset

我们知道你已经耐心等待了这么久......所以让我们看看len的实际效果:

图片

正如你无疑可以想象的那样,len被广泛使用。然而,最常用的 BIF 很可能是print,它除了其他功能外还能在屏幕上显示对象。让我们看看当print被要求显示你的deck变量时会发生什么:

图片

链式调用 BIF(Built-in Functions)来完成更多任务

你可以同时使用多个 BIF(如果需要的话)。一个了解的很好的 BIF 是sorted,它返回任何对象数据的排序副本。

sorted BIF 经常与print BIF 结合使用,显示一些数据的有序版本。不过需要注意,sorted 返回的有序数据总是一个列表,不管排序的是什么数据。这意味着在集合上使用sorted并不会产生一个有序的集合,而是产生一个由原始无序集合数据组成的有序列表。原始集合保持不变,仍然是一个无序集合。

记住:“BIF” 是 “built-in function” 的缩写。

图片

print sorted 的链式调用是一个很好的组合,但准备好在接下来的链式调用(显示在下一页上)中键入比你想象的更多的次数。这确实是一个常见的组合,而且非常有用。

打印和 dir 组合的曼波舞

当提供任何 Python 对象的名称时,dir BIF 返回该对象的属性列表,对于deck变量来说,这些属性与集合对象相关联。

正如你在下面所见,与 Python 集合相关联的属性非常多。请注意,dir的输出与print BIF 的调用链接在一起,确保显示的输出横跨你的屏幕而不是向下滚动,从而减少你可怜的手指需要滚动的量。这可能或可能不是一个值得庆祝的事情,但嘿!每一点帮助都是好的。

图片图片

在查看print dir输出时,有一个简单的规则要遵循:暂时忽略以双下划线开头和结尾的属性。稍后在本书中你会了解它们的存在原因,但是暂时忽略,忽略,忽略!

使用 dir 输出获取帮助

看上去你可能不会这样认为,但在使用 Python 时,你很可能会比使用其他任何 BIF 更频繁地使用dir BIF,特别是在 Jupyter 笔记本中进行实验时。这是因为dir 能够列出与任何对象相关联的属性列表。通常,这些属性包括可应用于对象的方法列表。

虽然随机执行与deck变量相关的任何方法可能很诱人(尽管有点疯狂),但更明智的方法是阅读与该方法相关的文档...

图像

现在不用担心:我们不会让你去翻阅成千上万页的在线 Python 文档。那是help BIF 的工作:

图像

现在感觉像是一副卡牌了

现在你的卡牌组已经是一个集合,你可以更好地模拟它的行为。

遗憾的是,从牌堆中随机选择一张卡片变得复杂,因为本章前面介绍的random.choice技术在集合中不起作用。这有点令人遗憾,因为希望可以使用random.choice(deck)来从你的牌堆中选择一张卡片,但是——遗憾的是——这不会起作用。

注意

现在,不用担心为什么会这样。原因有点技术性,我们会在本书的后面重新讨论。

注意

这是为了确保我们的读者继续阅读,对吧?!?[编辑]。

不用担心。一个快速的技巧让你首先将你的卡牌集合转换为一个列表,然后可以与random.choice一起使用。这不能再简单了:

图像

已经选择了一张卡片(对我们来说是三个梅花,但如果你在跟随的话可能是另一张卡),我们真的应该将这张卡从牌堆中移除,这样后续的随机选择就不会再选中它了。在前一页的底部显示了一个关键提示,说明了哪个集合方法可以帮助你。

图像

“card”究竟是什么?

如果你想知道card变量是什么,还有另一个 BIF,叫做type,它报告当前分配给card的值的类型:

图像图像图像图像

括号是可选的。

可以将你的条件语句包裹在括号中,但这样做会使代码难以阅读。大多数 Python 程序员只在需要澄清代码含义时才使用括号。

但是,等等!还有更多...

现在你可能已经被 Python 所吸引,因为你已经看到它不仅易于阅读还易于运行你的 Python 代码。但是,你还没有完成。

图像

在本章的其余部分,你将继续快速浏览 Python 的其他显著特性。

由于这是一本Head First书籍,我们告诉你这些内容是不够的,我们希望你能体验它们。因此,在 VS Code 中,关闭你的Cards笔记本,然后创建一个名为WhyPython.ipynb的新笔记本。本章剩余部分将在这个新笔记本中进行。

注意

要在 VS Code 中创建新的笔记本,请选择“文件”,然后从菜单中选择“新建文件...”。选择第三个选项创建一个新的无标题笔记本。执行“文件”,保存以将无标题名称更改为“WhyPython.ipynb”。

图像

是的。每一个... 单词。

哦,我们只是开玩笑。图像

本章的目标是让您对 Python 有足够的了解,以便了解 Python 为什么如此受欢迎。因此,本章的覆盖范围非常高级

但是,不用担心:稍后在本书中,您将详细回顾所有这些材料。现在,集中精力理解您所看到的主要内容。

准备好您的新笔记本,在 VS Code 中开始深入研究。

Python 附带了一个丰富的标准库

Python 标准库(PSL)是指随 Python 捆绑安装的大量 Python 函数、类型、模块、类和包的名称。一旦安装了 Python,这些都是保证存在的。

当您听到程序员把 Python 称为“电池已包含”时,他们部分指的是 PSL。其中有很多内容:docs.python.org/3/library/index.xhtml

图像

在本书中,“PSL”是“Python 标准库”的简称。

图像

这确实是一个非常恰当的描述。

Python 安装包括 PSL,PSL 非常完整,大多数情况下,您可以依赖它提供的功能完成大量工作。这意味着 Python 本身就足够了,标准安装的 Python 可以直接使用,无需额外安装。因此,电池已包含

图像

顺便说一句:Python 不是“玩具语言”

这是对 Python 的常见批评,认为它并不是“真正”的编程语言,或者某种“玩具”。如果这些观察甚至有一点真实性,您不会期望任何人任何地方都在使用 Python 进行任何有用的事情,更不用说依赖 Python 来推动他们的业务了。

Python 可能确实看起来不同,但这并不意味着它不能完成工作。Python 很有趣,但这并不意味着它是一个玩具。远非如此。

图像

那里确实发生了很多事情。

我们的目标是让您对 PSL 有所了解,而不是让您深入探索它的细节。

您不必知道所有这些内容,也不必记住上一页的内容,尽管有三点您应该考虑。

注意

明确一点:我们不是在谈论咖啡……

图像 您仅仅触及了表面

PSL 包含了很多内容,前两页内容提供了最简短的一瞥。在阅读本书时,我们会提到 PSL 的使用,以确保您不会错过任何内容(您还将在附录中找到资源,可以进一步探索 PSL)。

图片 PSL 代表一个大量经过测试的代码库,你不需要自己编写,直接使用即可。 由于 PSL 已存在数十年,其中的模块已经被全球各地的 Python 程序员彻底测试过。因此,你可以放心地使用 PSL 模块。

图片 PSL 是可以信赖的,因此你可以依赖它的模块是可用的。

除了一些非常特定的边缘情况(例如一个微型嵌入式微控制器提供最小的 Python 环境),你可以确信使用任何 PSL 模块的代码将可移植到其他支持 PSL 的系统上。

让我们使用你的最新笔记本快速查看 PSL 中的两个模块。

使用 Python,你只需编写你需要的代码

PSL 是 Python 努力确保你只在绝对必要时才编写新代码的一个典范。如果 PSL 中的模块解决了你的问题,使用它:抵制从头开始编码的冲动

当涉及到重用代码时,可以挖掘的不仅仅是 PSL。

图片

Python 的包生态系统令人垂涎欲滴

对于 PSL 中已包含的内容并不满足,Python 社区支持第三方模块、类和包的在线集中存储库。这被称为Python 包索引,位于这里:pypi.org/

称为PyPI(发音为“派皮”),这个索引是一个庞大的软件集合。一旦找到你想要的东西,安装就像小菜一碟,而且随着本书的进展,你会得到大量从 PyPI 安装的实践。

现在,花十分钟访问 PyPI 网站(如下所示),四处看看。

图片图片

好的。如果这对你有帮助,当然,遵循你的 Python 之道!

严肃地说,当一种编程语言以一群喜剧演员的名义命名时,有时事情会变得有点儿荒谬。这并不是一件坏事。

Python 文档中充斥着对蒙提·派森的引用(抱歉)。在其他文档偏爱foobar时,Python 文档更偏爱鹦鹉、垃圾邮件鸡蛋。或者是鸡蛋垃圾邮件?不管怎样,正如文档所述:你不必喜欢蒙提·派森才能使用 Python,但喜欢会更好。图片

图片图片

Python 带有两个彩蛋,展示了 Python 程序员有时并不太认真,而且也不介意其他人对他们开玩笑。要看到我们的意思,请返回你的 WhyPython 笔记本,最后,在两个新的代码单元格中,运行以下每一行代码。享受吧!

图片图片

而且我们可以帮助你。

在下一章,我们介绍——并且立即开始用 Python 代码解决一个现实世界的问题。在一起,我们会在需要时更详细地重新访问本章的材料,随着本书的进展来构建一个解决方案。

在继续之前,请花些时间阅读下一页的章节总结,然后通过本章的填字游戏测试你的记忆技能。

见你在下一章,第二章,实际上这是你的第二章,因为我们从零开始计数(就像 Python 一样)。

卡牌套牌填字游戏

Image

祝贺你完成了开章的探索,这一章被编号为零,以纪念 Python 和其他许多编程语言一样,从零开始计数。在你深入下一章之前,花几分钟时间尝试这个填字游戏。所有的答案都可以在本章的页面找到,解答在下一页。祝你玩得开心!

Image

横向

2. A built-in function which tells you what something is.

3. Objects surrounded by [ and ].

4. Shorthand for built-in function.

7. Reports on an object’s size.

8. Generates collection of numbers.

9. The Python Package Index.

11. Includes a module in your code.

12. Objects surrounded by { and }.

14. This chapter’s missing Big 4.

15. This operator can find things.

16. Use together with Shift to run.

17. Enlightenment, Python-style.

竖向

1. Objects surrounded by ( and ), and it is one of the Big 4, too.

2. The optional part of an if statement.

5. Loops a specific number of times.

6. The name given to Python’s default variable.

9. It’s not a Pumpkin Skinny Latte, but shares the same acronym

10. Displays to screen.

12. It’s what the card variable is.

13. It’s either True or False.

14. Makes up the combo mambo.

卡牌套牌填字游戏解答

ImageImage

横向

2. A built-in function which tells you what something is.

3. Objects surrounded by [ and ].

4. Shorthand for built-in function.

7. Reports on an object’s size.

8. Generates collection of numbers.

9. The Python Package Index.

11. Includes a module in your code.

12. Objects surrounded by { and }.

14. This chapter’s missing Big 4.

15. This operator can find things.

16. Use together with Shift to run.

17. Enlightenment, Python-style.

竖向

1. Objects surrounded by ( and ), and it is one of the Big 4, too.

2. The optional part of an if statement.

5. Loops a specific number of times.

6. The name given to Python’s default variable.

9. It’s not a Pumpkin Skinny Latte, but shares the same acronym

10. Displays to screen.

12. It’s what the card variable is.

13. It’s either True or False.

14. Makes up the combo mambo.

就在你以为你已经完成时...

拿起你的剪刀,这里有一个便于剪下来的 Jupyter Notebook 键盘快捷键图表,我们认为这些是必不可少的。随着你对 Jupyter 的了解增加,你会开始使用所有这些快捷键。目前,Shift+Enter 仍然是最重要的组合键。

注意

就像我们要求你剪掉背面的内容一样好!

第二章:深入:让我们一起做个浪花

图片

学习新语言的最佳方式是编写一些代码。 如果你打算写一些代码,你将需要一个真实的问题。碰巧我们正好有一个这样的问题。在本章中,你将以我们友好的、邻里的游泳教练开始你的 Python 应用开发之旅。你将从 Python 字符串开始,学习如何按照你的意愿操作它们,同时朝着用 Python 解决教练问题的方向前进。你还将看到更多 Python 内置的列表数据结构,了解变量的工作原理,并学会如何阅读 Python 的错误信息,而不会深陷其中,所有这些都是通过解决一个真实问题和真实的 Python 代码来实现的。让我们(冒头)深入…

图片

这听起来很有趣。

你随后与教练的聊天开始逐渐揭示一些细节…

当涉及监控年轻游泳者的进展时,教练手动完成所有操作。在训练过程中,他在可靠的剪贴板上记录每位游泳者的训练时间,然后在家里手动将每位游泳者的时间输入到他最喜爱的电子表格程序中,以进行简单的性能分析。

就目前而言,这个分析是直接的。会话时间被平均,简单的条形图允许快速视觉检查游泳者的表现。教练坦言自己是电脑新手,称他在“折腾电子表格方面”比教小游泳者要好得多。

图片

现在的工作情况是怎样的?

目前,教练无法扩展他的游泳俱乐部会员,因为他的行政开销太大。

要理解为什么会这样,请看一下教练为目前 12 岁的达里乌斯(Darius)准备的电子表格,他目前处于 13 岁以下年龄组中游泳:

图片

乍看之下,这看起来并不那么糟糕。直到你考虑到,每次训练后教练都要创建六十多这样的电子表格。

俱乐部只有二十二名游泳者,但由于每个人可以游不同的距离/泳姿组合,二十二名游泳者很容易变成超过六十张电子表格。这是大量手动处理电子表格工作。

正如你可以想象的那样,整个过程极其缓慢…

命运决定对你微笑。

对世界上最大的在线购物网站进行快速搜索,发现了一个描述为互联网连接的数字智能秒表的新设备。作为产品名称,这有点啰嗦,但这款智能秒表允许教练记录识别游泳者的游泳时间,然后将其作为带有.txt扩展名的 CSV 文件传输到云端。作为这些文件中匹配到达里乌斯的电子表格页面的示例,这里是文件内容:

ImageImageImage

上一页的数据看起来很有希望。

如果你能够解决如何处理一个文件,那么你就可以重复处理任意数量格式相似的文件。

重要问题是: 你从哪里开始?

Image

书房谈话

Mara: 好的,伙计们,让我们就如何最佳处理这个数据文件提供一些建议。

Sam: 我猜这有两个部分,对吧?

Alex: 怎么说?

Sam: 首先,我认为文件名中包含一些有用的数据,所以需要处理一下。其次,文件本身中包含的计时数据也需要提取、转换和处理。

Mara: “转换”是什么意思?

Alex: 这也是我的问题。

Sam: 我和教练核实过,“1:27.95”表示一分 27 秒 95 百分之一秒。在处理这些数值时,特别是计算平均值时,需要考虑这一点。因此,需要进行某种数值转换。还要记住文件中的数据是文本

Alex: 我会把“转换”加到待办事项列表上。

Mara: 我猜文件名需要分解以获取游泳者的详细信息?

Sam: 是的。“Darius-13-100m-Fly”前缀可以在“-”字符上分解,从而得到游泳者的姓名(Darius)、他们的年龄组(13 岁以下)、游泳距离(100 米)和泳姿(蝶泳)。

Alex: 那是假设我们能读取文件名吗?

Sam: 那不是理所当然的吗?

Mara: 不是很确定,所以我们仍然需要为此编写代码,尽管我很确定 PSL 可以在这方面提供帮助。

Alex: 情况变得有点复杂了……

Sam: 只要我们一点点来就好了。

Mara: 我们只需要一个行动计划。

Alex: 如果我们打算用 Python 完成所有这些工作,我们还需要多学习一点。

Sam: 我可以推荐一本很棒的书…… Image

文件和电子表格是“相关的”

在我们着手处理第一项任务之前,花点时间回顾一下文件名中嵌入的数据,以及文件数据如何与教练的电子表格相关联:

Image

我们的第一个任务:提取文件名中的数据

现在的计划是专注于一个文件,具体来说,这个文件包含了达里乌斯在 13 岁以下组别的 100 米蝶泳成绩数据。

回想一下,包含你需要的数据的文件名叫做 Darius-13-100m-Fly.txt.

让我们使用 VS Code 创建一个名为 Darius.ipynb 的 Jupyter 笔记本,你可以在你的 Learning 文件夹中创建它。随着我们一起完成任务 #1,在你的笔记本中跟随着操作。

记住:要在 VS Code 中创建一个新的笔记本,请从主菜单中选择 文件,然后选择 新建文件...,然后选择 笔记本选项。

图像

一个字符串并不真的是一个字符串...

在上述代码行中赋值运算符(=)右侧的值看起来确实像一个字符串。毕竟,它是用引号括起来的字符序列,在大多数其他编程语言中,这正是字符串的 定义。但在 Python 中不是这样。

在 Python 中,赋值运算符右侧的值是一个 字符串对象,这与字符串相差无几。但是,对象在 Python 中不仅仅是数据值。

要理解我们在这里谈论的是什么,你需要借助 combo mambo。

在 Python 中,一切都是对象。

图像

一个字符串是一个带有属性的对象

你已经知道如何列出任何对象的属性:使用 print dir combo mambo。

图像

看看这里你所看到的东西,花点时间欣赏一下

如果你看着那长长的属性列表,觉得这里有很多东西要学习,不妨考虑一下这个:字符串内建了很多功能,你不需要为其编写代码。

图像图像

没问题。顺便问一下,问题很棒。

这是 Python 的 dot 运算符,允许你在对象上调用方法。这意味着 fn.upper() 调用了变量 fn 引用的字符串的 upper 方法。

这与像函数一样调用的 BIFs 有些不同。例如,len(fn) 返回由变量 fn 引用的对象的大小。

调用 fn.len() 是错误的(因为没有这样的方法),就像尝试 upper(fn) 一样是错误的(因为没有这样的 BIF)。

想一下这个:方法是对象特定的,而 BIFs 提供了可应用于任何类型对象的通用功能。

图像

是的,没错。

upperlower 方法返回的值都是 new 字符串对象,它们有自己的 value 部分和 methods 部分。虽然是从变量 fn 所引用的数据创建的,但新字符串是 fn 引用的字符串的 copies

这一切都是有意设计的:Python 就是应该这样工作。

从文件名中提取游泳者的数据

回想一下为任务 #1 提出的三个子任务:

图像

既然你已经把文件名存储在变量 fn 中,我们暂时把子任务(a)视为已完成。

通过“-”字符分解文件名是子任务(b),你猜想其中的一个字符串方法可能会有所帮助。但是,是哪一个呢?总共有 47 个!

'capitalize', 'casefold', 'center', 'count', 'encode',
'endswith', 'expandtabs', 'find', 'format', 'format_map',
'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal',
'isdigit', 'isidentifier', 'islower', 'isnumeric',
'isprintable', 'isspace', 'istitle', 'isupper', 'join',
'ljust', 'lower', 'lstrip', 'maketrans', 'partition',
'removeprefix', 'removesuffix', 'replace', 'rfind',
'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase',
'title', 'translate', 'upper', 'zfill'
注意

这是一个很长的字符串方法列表。虽然“upper”和“lower”方法的作用很容易猜到,但像“casefold”、“format_map”或“zfill”这些方法的作用就不那么清楚了。你需要的是一个能帮助完成子任务(b)的方法。

图像

听起来很有趣。

让我们看看 split 方法对字符串做了什么。你有两个选择:你可以运行 split 看看会发生什么,或者你可以阅读 split 的文档。

不要试图猜测方法的作用...

阅读方法的文档!

当然,大多数程序员宁愿吃玻璃片也不愿意查阅和阅读文档,他们认为生命太短暂,尤其是在需要编写代码时。通常,这项活动最令人讨厌的是查找部分。因此,Python 通过 help BIF 实现了方便查找和显示相关文档。

遗憾的是,Python 不能替你阅读文档,所以你还是得自己动手。但是 help BIF 能够帮你避免离开 VS Code,打开浏览器,然后搜索文档的过程。

要查看任何方法的文档,请使用 help BIF,就像这样:

图像图像

根据对文档的快速阅读,似乎 split 方法就是你需要的。让我们快速试一试。

图像

你确实阅读了“split”方法的文档,对吧?答案就在那里...

split 方法返回一个单词列表...

在这种情况下,你可以将“单词”视为“字符串对象”的同义词。

在 Python 中,列表是用 方括号 括起来的数据。

让我们回顾一下刚刚在你最近 试驾 中展示的两次调用 split 方法的情况。我们不禁要建议你,这样做就像数 1-2-3 那样简单:

图像

是时候再做一次勾选了吗?

看着你的子任务列表,拿起笔,在子任务(b)旁边画一个令人满意的勾,这是很诱人的想法,不是吗?

图像

但这样做可能还为时过早。仔细查看你调用 split 方法后得到的列表:

图像图像

嗯,也许吧...

让我们花一两分钟时间了解一下 split,确保你理解它的工作原理。

从底向上读取错误信息

你最近 练习 中的最后一个示例出现了运行时错误信息,可能让你百思不得其解:

图像图像

哦... 好吧。

随你喜欢。

只需记住始终从底部向上阅读 Python 的错误消息,你就会没事的(魔法药水除外)。此外,请注意 Python 通过名称traceback引用它的错误消息。

现在... 这个特定的回溯想要告诉你什么?

在链式方法调用时要小心

最后一个例子背后的想法是稳固的:指定一个split调用链,在“-”和“.”处分割字符串对象。

图片

当然,这行代码失败了,这有点令人沮丧,因为这个想法是正确的,你想要尝试将你的字符串两次分割,试图分开字符串“Fly”和“txt”。但是,请看你收到的错误消息:

图片图片

是的,这确实是发生的情况。

第一个split正常工作,使用“-”分割字符串对象,生成一个列表。然后将此列表传递给链中的下一个方法,这也是split。问题是列表没有split方法,因此尝试在列表上调用split毫无意义,导致 Python 放弃了它的尝试并抛出**AttributeError**

现在你知道了,你要如何修复它?

修复破碎的链条

看看Head First Coders认为你的选择是什么。

图片

小隔间谈话

Alex:我认为我们应该暂停开发,同时学习所有关于列表的知识...

Sam:嗯,列表在 Python 中很重要,但我不确定这是一个列表问题,尽管回溯告诉我们这样。

Mara:我同意。我们正在尝试操作fn字符串,而不是列表。回溯提到列表有点令人困惑,因为split总是返回一个列表。

Alex:而且我们不能在列表上调用split,对吧?

Sam:不,你不能,因为列表不包括内置的split方法,而字符串则包括。这就是回溯告诉你的:列表没有split方法。

Alex:所以,我们运气不佳?

Mara:不,我们只需要稍微重新思考一下...

Sam:记住:fn是一个字符串。所以首先问问自己字符串中是否有其他有用的东西。

Alex:我怎么再次做到这一点?

Sam:与你的老朋友print dir组合起舞吧。

字符串可以做更多事情

正如 Python 训练我们总是从底部向上阅读一样,第一个引起我们注意的方法是rstrip。使用help BIF 可以在你的 VS Code 笔记本内部了解一些关于rstrip的内容:

图片图片

让我们尝试另一个字符串方法

不屈不挠,让我们回到字符串方法列表继续搜索:

图片

rstrip方法一样,询问help BIF 以了解removesuffix的详细信息:

图片

让我们在你的笔记本上试试这种方法。

图片

唯一剩下的就是创建一些变量

还有一个最后的子任务要完成,即第(c)部分:

图片

你上一行代码生成了一个包含你需要的四个值的列表,但是如何将这四个值分配给各个单独的变量?

图片图片

确实如此。

在处理列表时,可以使用熟悉的方括号表示法。而且,与大多数其他编程语言一样,Python 从零开始计数,因此[0]指的是列表中的第一个元素,[1]指第二个,[2]指第三个,依此类推。

让我们立即将这些新学到的列表知识付诸实践。

不要忘记跟进!

看起来任务#1 已经完成。但真的吗?

让我们回顾一下任务#1 的子任务,即从文件名中提取所需的数据:

图片

考虑到你上次测试驱动的代码,你可能已经完成了任务#1。

使用 VS Code 和 Jupyter 解决了你需要的代码后,将任务#1 的代码复制粘贴到一个新单元格中就变得很简单。而且你需要复制的代码量并不多,是吗?

图片

我们都准备好开始庆祝达到这一点了,但看起来有人有问题...

图片

**parts**变量感觉有点关键。**

这么说吧,这是一个合理的问题,因为parts被创建来临时保存数据项列表,然后与方括号表示法结合使用,以提取单个数据项。完成这些操作后,parts列表就不再需要了。

那么,你能不用parts吗?

如果“parts”变量不需要,这是否意味着它是多余的?!?(抱歉)。

你能不用 parts 列表吗?

简短回答:是的。

当然,要理解简短答案背后的意义会更复杂一些。但是,别担心,一会儿一切都会明了的。

首先要记住的是,调用链末尾的split方法会生成一个列表:

图片

然后将列表分配给parts变量名,使你能够使用方括号表示法访问所需的数据:

图片

split方法始终会生成一个列表,因此你可以像下面所示那样做,以达到与上面所示相同的效果,从代码中删除parts变量:

图片

虽然**parts**变量不再存在,你能想到为什么这个版本的代码可能不是最优的吗?

我们可以想到三个原因

最新的代码确实可以工作,但代价高昂。

图片 最新的代码速度很慢

原始代码生成列表一次,将其分配给 parts 列表,然后根据需要使用该列表。这是高效的。最新的代码生成列表四次,这是非常低效的。

图片 最新的代码更难阅读

原始代码在做什么是很清楚的,但对于最新的代码来说就不一定了,尽管它是 Python 的一个聪明之处,但需要一些脑力体操才能弄清楚发生了什么。结果是代码看起来更加复杂。

图片 最新的代码是维护的噩梦

如果要求你将后缀从 ".txt" 改为 ".py",在处理原始代码时这很容易(因为这只需一次编辑)。而对于最新的代码,你需要进行四次编辑(多次编辑),这可能充满风险。

图片

我们不要太仓促。

是的,最新的代码不值得那么多麻烦,但是从代码中删除 parts 变量的想法仍然有其价值,因为一旦对 swimmeragedistancestroke 进行了赋值,它就再也没有用处了。

这可能还有另一种方法来做这件事……

多重赋值(也称为展开)

尽管这个概念不是 Python 独有的,但多重赋值的概念是该语言的一个强大特性。在 Python 的世界中,也被称为展开,该特性允许你在赋值操作符的左侧同时赋值给多个变量,并且右侧的数据值数量要与左侧变量数量相匹配。

下面是一些示例代码,演示了这个工作原理:

图片图片

请注意以下内容:你可以将任意数量的变量名与值匹配(只要赋值操作符两侧的数量相等)。Python 将右侧的数据值视为一个列表,但不要求你将列表放在方括号中。

图片

是的,这就是它的含义。

Python 程序员描述列表在赋值之前被“展开”,这是他们的说法,即列表的数据值逐一取出,并逐一分配给变量名。

单个列表被展开,其值被逐一分配给多个变量名。

Task #1 完成了!

再次回顾一下子任务清单:

图片

这是一行非常强大的代码。我们告诉教练工作正在进展。

图片

是的,他们是。我们在路上!

当然,我们忘了告诉教练还有一点工作要做。让我们提醒大家 Task #2 包含了哪些内容(在下一页显示)。

Task #2:处理文件中的数据

乍一看,这里似乎有些工作要做。但是,别担心:我们将在下一章节一起处理所有这些子任务:

  1. 从文件中读取行

  2. 忽略第二行

  3. 按“,”拆分第一行以生成时间列表

  4. 取每个时间并将其转换为“mins:secs.hundredths”格式的数字

  5. 计算平均时间,然后将其转换回“mins:secs.hundredths”格式(用于显示目的)

  6. 显示来自任务#1 的变量,然后显示来自任务#2 的时间列表和计算出的平均值

在你深入研读第三章之前,你有足够的时间去做一些事情。去泡一杯你最喜欢的茶,吃一块派,浏览一下章节摘要,然后悠闲地解决本章的填字游戏。

图片

字符串填字游戏

图片

本章的所有线索答案都可以在这章的页面找到,并且解决方案在下一页。祝你玩得愉快!

图片

横向

3. 在拆分字符串时非常方便。

6. 多重赋值的另一个名称。

11. 要成为变量,必须具备其中之一。

12. 万物皆属于此。

13. 可用于去除文件名的扩展名。

纵向

1. 从字符串末尾删除一组字符。

2. 就像其他语言中的数组。

4. 多于一个。

5. 游泳教练用这个做手脚。

7. 球和 ________。

8. “双下划线”的简称。

9. 我们喜欢的括号。

10. 对象的内置函数的复数名称。

字符串填字游戏解答

图片图片

横向

3. 在拆分字符串时非常方便。

6. 多重赋值的另一个名称。

11. 要成为变量,必须具备其中之一。

12. 万物皆属于此。

13. 可用于去除文件名的扩展名。

纵向

1. 从字符串末尾删除一组字符。

2. 就像其他语言中的数组。

4. 多于一个。

5. 游泳教练用这个做手脚。

7. 球和 ________。

8. “双下划线”的简称。

9. 我们喜欢的括号。

10. 对象的内置函数的复数名称。

第三章:数字列表:处理列表数据

图片

你写的代码越多,你就会变得越好。这就是这么简单。 在本章中,您将继续创建 Python 代码以帮助教练。您将学习如何从教练提供的数据文件中读取数据,将其行读入一个 Python 最强大的内置数据结构之一:列表。除了从文件的数据创建列表外,您还将学习如何根据需要动态扩展您的列表。并且您将使用 Python 最受欢迎的循环结构之一:for循环来处理列表。您将从一种数据格式转换为另一种,并且甚至会结交新朋友(您自己的 PythonBFF)。您已经喝了足够的咖啡和吃了足够的派,所以现在是时候卷起袖子,回到工作中去了。

任务#2:处理文件中的数据

完成任务#1 后,是时候转移到任务#2 了。还有一些工作要做,但是,与上一章的活动一样,你可以像上一章详细描述的那样一点一点来处理:

  1. 读取文件中的行

  2. 忽略第二行

  3. 通过“,”拆分第一行以生成时间列表

  4. 将每个时间转换为“分:秒.百分之几”的数字格式

  5. 计算平均时间,然后将其转换回“分:秒.百分之几”的格式(用于显示目的)

  6. 显示来自任务#1 的变量,然后显示来自任务#2 的时间列表和计算出的平均值

图片

是时候开始工作了。

当教练完成热身时,你可能还没有完成,但到今天的游泳课结束时,你肯定会有所进展。

在学习 Python 如何从文件中读取数据之前,请先获取本章数据的副本。

获取教练的数据副本

如果没有数据可以处理,学习如何从文件中读取数据是没有意义的。因此,请访问本书的支持网站,并获取教练数据文件的最新副本。有 61 个单独的数据文件打包成一个 ZIP 归档文件。从这里获取一份副本:

图片

下载完成后,请解压缩文件,然后将生成的 swimdata 文件夹复制到您的Learning文件夹中。这样可以确保接下来的代码能够在已知位置找到数据。

swimdata 文件夹中的每个文件都包含一个游泳者在特定青少年距离/泳姿组合上的记录时间。回顾前一章开头显示的数据文件,显示了达里乌斯在 100 米蝶泳的 13 岁以下比赛中的时间:

图片图片

是的,确实。

有一个称为open的 BIF 可以处理文件,打开它们以供读取、写入、追加或以上任意组合。

open BIF 本身很强大,但与 Python 的...嗯... with语句结合使用时效果更佳。

open BIF 可以处理文件

无论您的文件包含文本数据还是二进制数据,open BIF 都可以打开文件以从中读取、写入或附加数据。默认情况下,open 从文本文件读取,这非常完美,因为这正是您想要对 Darius 的数据文件进行的操作。

图片

您可以直接在代码中调用 open,打开一个命名文件,处理其数据,然后在完成时关闭文件。无论您使用哪种编程语言,这种打开-处理-关闭的模式都非常常见。事实上,Python 有一种语言语句可以使得处理打开-处理-关闭模式特别方便:with 语句。

尽管 with 语句有比最初看到的更多,但现在您只需要知道其中一件事:如果您使用 with 打开文件,Python 会 自动 在完成时关闭文件,无论在文件上执行任何处理时发生了什么。

图片

像往常一样,跟着做。

代码不多,但事情很多...

代码不算很长,但是——正如上一页底部的注解所示——有很多事情发生:

图片

让我们强调三个重要要点:

图片 with 语句在其代码块运行 打开文件。

您可能会问“哪个代码块?”您是对的。我们还没有告诉您,但 with 语句的代码块是所有缩进在其下的代码。在这种情况下,代码块只有一行,这没问题(代码块可以是任意长度)。

如果您是从使用花括号界定代码块的编程语言中转到 Python,那么以这种方式使用缩进可能会让您感到不安。不要让它困扰您,因为这真的不是什么大不了的事。

图片

不是我们不想谈论缩进。

我们觉得 Python 不仅仅是使用缩进(或者更准确地说,空白)来界定代码块。是的,这是语言的一个重要方面,但大多数 Python 新手很快就会习惯。当我们需要的时候,我们会提到它,否则我们会继续进行。说了这么多,让我们回到要点上。

图片 with 语句在其代码块运行 关闭文件。

这是一个很酷的功能,因为我们忘记做这件事了。知道 with 语句在你的代码块执行完毕后会收拾残局,这很好。

图片 代码创建了两个变量: df data

df变量指的是通过成功执行open BIF 所创建的文件对象data变量则指的是通过readlines方法从df文件对象读取的行列表。尽管df变量现在指向一个关闭的文件对象,但这两个变量在代码块结束后仍然存在。

变量会根据需要动态创建

dfdata变量都是通过赋值创建的。尽管我们很容易看出data是如何生成的,多亏了赋值操作符(=),但df的情况并不那么清楚。

图片

关键词是“as”。

多亏了那个with语句,as关键字获取了open BIF 的返回值,并将其赋给了你代码中标识的变量名df。这段代码就好像运行了这样一段代码:

df = open(FOLDER+FN)

as关键字和with一起做了同样的事情(而且看起来更好)。

让我们仔细看看df是什么,以及了解一下它能做什么:

图片图片

并不是说文件对象就没有吸引力...

只是,在这种情况下,文件对象仅仅是一个手段:将文件的行加载到data变量中。那么,data是什么,你可以用它做什么?

图片

你已经知道(来自前一章),Python 列表理解方括号表示法。在你深入研究它之前,让我们看看data包含什么:

注意

你可能已经考虑在这里对“data”执行组合曼博,但现在你还不需要。目前,你只需要方括号表示法。

图片图片

不要忘记按 Shift+Enter 来执行代码单元。

图片

是的,借助“with”语句的一点帮助。

尽管这只是一个单行代码块,但这里发生了很多事情。

不仅已经创建了列表,并将其分配给了你的data变量,并填充了包含在游泳者文件中的数据,而且那个with语句已经完成了任务#2 的前两个子任务。这是多么啊!

看一下(在下一页)。

已经开始处理任务#2

这两行代码产生了很大的影响。这里再次列出它们:

图片

data列表中第一个位置的数据值是一个表示游泳者时间的字符串:

图片

你可以安全地忽略文件中的其他内容,因为你所需的数据就在上面的字符串中。现在是时候用一些勾号来表示你在任务#2 上的进展了:

图片

对于任何已经花费一定时间使用 Python 字符串技术的人来说,第三个子任务不应该太难。碰巧,你刚刚在上一章节中处理了字符串材料,所以你已经准备好了。但在你处理该子任务之前,我们需要讨论with语句的一个特定部分:冒号。

你的新死党,Python 的冒号

冒号(**:**)表示即将开始一个代码块。

与许多其他编程语言不同,Python 不使用花括号(**{****}**)来界定代码块。相反,Python 使用缩进(或更确切地说是空白)。事实上,在 Python 中,花括号界定数据,不是代码。

在 Python 中,代码块在缩进结束时结束。

在你的with语句中,该块只包含一行代码,但它可能包含任意数量的代码行。缩进到与前一行相同级别的代码属于同一代码块。

冒号在这里至关重要(这就是为什么它是你的新死党)。就像现实生活中,如果你忘记了你的好朋友,坏事就会发生。如果你忘记了那行末尾的冒号,Python 就拒绝运行你的代码!

把冒号和缩进看作相辅相成:没有其中一个,另一个也无从谈起。

FYI:Python 文档将“代码块”称为“套件”。

注意

我们也觉得这很奇怪。

ImageImage

是的,两个问题都是。

是的,我们确实在上一章介绍了字符串,而且,是的,我们现在专注于列表。

回想一下split方法会从字符串生成一个列表,这正是你现在需要使用它的原因。如果你上面的times变量不是一个列表,你可能做错了什么。

当你准备好了,请翻页看我们想出来的代码。

Image

那几乎太容易了

由于你在上一章节处理字符串的先前经验,我们希望最近的Sharpen不会太费力。

在调用strip之前调用split非常重要,这会从data的第一个槽中的数据值产生一个新列表(data[0])。事实上,你的最新链式代码与上一章的代码非常相似:

ImageImage

将最新链式的结果赋给times变量后,你已完成子任务(c)。现在是另一个复核的时候。

Image

暂停一下,回顾一下这个任务的代码

下面是如何在 VS Code 中将迄今为止的代码合并到一个单独的代码单元格中:

Image

如果你在笔记本中尝试这两个with语句,你会发现它们都用相同的字符串集合填充了times引用的列表。那么,为什么不使用两行版本的代码,而不是三行版本呢?毕竟,就像前一章中的parts列表一样,一旦data列表被使用一次后就不再需要了……

图片

不,这不难阅读。这是一场噩梦。

这里链了三种方法,第一种方法创建了一个列表,从中取出第一个槽的数据(使用方括号表示法),然后剥离它再拆分它……但是,“它”再次指的是什么呢?!?

这一行代码很难阅读、理解、解释维护。我们同情未来某个时刻被要求“修复”此代码的可怜程序员(很可能是)。

将时间字符串转换为时间值

在上一页的代码运行之后,times变量引用的是一个字符串列表:

图片

times 列表中的每个槽中的值看起来确实像是游泳时间,但实际上并不是。它们是字符串。要对此列表执行任何数值计算,比如计算平均值,需要将这些字符串转换为数值。

让我们仔细看看只有一个值(第一个)。如果你能想出一个转换这个第一个时间的策略,然后就可以将其应用于列表的其余部分。

图片

注意

有多种方法可以做到这一点,所以如果你的想法与我们的不同也不用担心(我们的方法在后面详细说明)。

将时间转换为百分之一秒

目前,尽管我们的大脑把它们看作时间,所有游泳时间都是字符串。但我们的计算机不是这样的(更不用说 Python 了)。我们的数字朋友们在转换时需要一点帮助,以下是我们建议的方法:

图片

将这个转换策略转化为 Python 代码是非常简单的。我们来看一下。

用 Python 转换为百分之一秒

我们在上一页用了很多视觉效果,并将视觉的步骤转换为 Python 代码几乎是一对一的匹配。下面显示的代码执行了从你的times列表中获取的第一个游泳时间的计算,代码输入到了Average.ipynb笔记本的单个单元格中。

图片

为了帮助你弄清楚,我们在这段代码中添加了一些注释。当 Python 遇到 # 字符时,它会忽略直到当前行结束的所有内容(注意 VS Code 如何友好地显示绿色的注释)。

将这段代码输入到你的笔记本中,如果你决定排除注释也不要感到内疚(别担心,我们不会告诉)。我们把它们放在那里是为了与预览页面的转换步骤的代码匹配起来。

图片

将这段代码输入笔记本中的空单元格,按下Shift+Enter来运行它。屏幕上显示8795。棒极了。

图片

如果您可以转换一个游泳时间...

您可以将它们全部转换。并且,在此处使用循环是没有额外学分的明智选择。

像大多数编程语言一样,Python 提供了许多循环方式,for循环是其中的一个最爱。让我们来看一个简单的循环,它从times列表中获取每个字符串并显示在屏幕上。

图片图片

酷,不是吗?

for循环足够聪明,可以知道正在处理的列表的全部长度。

使用len BIF 来计算列表在被循环前有多大的诱惑总是存在的,但对于for来说这是一个不必要的步骤。for循环从列表中的第一个值开始,按顺序获取每个值,处理该值,然后移动到下一个值。当列表耗尽时,for循环终止。

这就是我们喜欢的魔法。

图片

Python 确实支持 while。

但是,在 Python 中,while循环的使用远少于等效的for循环。

在解决上述练习的解决方案代码之前,让我们花一点时间比较for循环和while循环。

比赛开始... for 循环对抗 while 循环

这是之前的for循环,以及它的输出:

图片

这是一个完全相同的while循环:

图片

不仅while循环的代码行数是for循环的两倍,而且看看所有你需要关注的额外内容!与for循环不同,while循环有很多地方可能会出错。并不是说while循环不应该使用,只是在大多数情况下,记得先选择for循环。

现在您已经行驶如飞!

现在你已经完成了任务#2 的子任务的中点:

图片

在任务#2 的子任务(e)的第一部分中,您有选择。

图片

任何一种方法都可以。

但是,如果您认为转换后的时间可能会在以后需要,也许创建一个新的转换时间列表是更好的选择...

您认为呢?

图片

让我们保留一份转换的副本

老实说,任何一个来自上一页底部的两种方法都可以用于任务#2 的子任务(e)的第一部分:计算平均时间。但是,我们猜想这些转换后的值至少还需要使用一次,所以最好在执行转换时将它们放入另一个列表中。

要做到这一点,您需要学习更多关于列表的知识。具体来说,如何创建一个新的空列表,并且在迭代times列表时逐步添加数据值。

创建一个新的空列表

步骤 1:为你的列表想出一个有意义的变量名。步骤 2:将空列表分配给你的新变量名。

让我们称你的新列表为converts。以下是如何在一行代码中执行步骤 1 和 2:

图片

请记住,type BIF 用于确定变量引用的类型。快速调用type确认你正在使用一个列表,并调用len BIF 确认你的新列表是空的

图片图片

你还记得如何显示你的新列表的内置方法吗?

显示你的列表方法列表

现在是组合舞曲的时候了!

就像 Python 中的任何对象一样,print dir 组合会列出对象的内置属性和方法。而在 Python 中,一切皆为对象,列表也是对象!

图片图片

第一个非双下划线方法名称是append。你可能猜到它的作用,但让我们使用help BIF 来确认:

图片

啊哈!

最后一行输出(“将对象附加到列表末尾。”)就是你需要知道的一切,即使尝试花时间进行实验也是很诱人的,其中一些方法听起来很酷。但是,现在不要这样做。

注意

当然,如果你想尝试其他方法,我们不会阻止你。

让我们继续完成构建转换后游泳时间值列表的任务。

图片

不,你不需要担心。

在前一章中,我们非常强调 Python 中的列表与其他编程语言中的数组相似。这使得我们可以介绍使用方括号标记与列表一起工作的常见技术方法。

然而,数组不同,在那里通常需要声明数组可能会变得多大(例如,1000 个插槽),以及它将包含哪种类型的数据(例如整数),在 Python 列表中无需声明这两者。

Python 列表是动态的,这意味着它们按需增长(因此无需预先声明插槽的数量)。Python 列表不包含数据值,它们包含对象引用,因此你可以在 Python 列表中放置任何类型的任何数据。你甚至可以混合搭配类型。

现在是计算平均值的时候了

你不需要成为程序员才能知道如何在给定数字列表的情况下计算平均值。代码并不复杂,但这个事实本身并不能证明你实际编写它的决定是正确的。当你遇到一个编程需求,感觉好像可能已经有人编写了它,问问自己这个问题:我想知道 Python 标准库中是否有任何有用的东西可以帮助吗?

重复使用现有代码没有任何羞耻感,即使对于你认为简单的事情也是如此。考虑到这一点,以下是如何从converts列表中计算平均值的方法,借助 PSL 的帮助:

嘿,还记得那个方便的 PSL 吗?不,不是美味的季节拿铁,是另一个 PSL!

图片

尽管计算平均值很容易,如上所示,你不必编写循环、维护计数、保持累计总数,也不必执行平均值计算。你只需将数字列表的名称传递给mean函数,该函数将返回你的数据的算术平均值(即平均值)。很酷。就这样。

图片

是的,格式为分:秒.百分之几。

实际上,你需要反向处理之前的过程,将原始游泳时间字符串转换为其数值等效形式。

这并不难,对吧?

将平均值转换为游泳时间字符串

有经验的 Python 程序员足够了解如何在将百分之几秒转换回分:秒.百分之几字符串格式时应用一些“技巧”。稍后在本书中,你将学习这些技术,现在展示它们可能会使本章的长度翻倍。因此,现在让我们(大多数时候)坚持你已经掌握的 Python 来执行这个任务。

图片

在笔记本中跟着走,当你通过五个步骤进行转换时。这是你要做的事情:

图片

图片 首先将百分之几的值转换为其相应的秒数。

图片

图片 将平均值分解为其组成部分。

图片图片

图片 计算分钟数。

图片

图片 计算秒数。

图片图片

图片 现在知道了分钟数、秒数和百分之几,构建游泳时间字符串。

图片图片

是的,比你想象的要容易。

你可以去学习如何在 Python 中编写自动化测试,然后编写任意数量的测试来检查你的计算结果…

或者你可以简单地再看看游泳教练的电子表格,确认你计算的游泳时间“1:26.58”与教练电子表格计算的平均值匹配。

此过程如下所示。

图片

距离上次打勾已经有一段时间了…

恭喜!你终于可以对子任务(e)打上实至名归的勾。

所有剩下的就是将上一章节的代码与本章节看到的代码结合起来。一旦完成,子任务(f)也将完成:

图片

任务#2(终于)完成了!

干得漂亮!通过创建(和执行)Times.ipynb笔记本,前一章节开始时标识的两个任务现在已经完成。所有人都打勾了!

图像 从文件名提取数据

图像

图像 处理文件中的数据

图像

当然,达到这一点并不一定意味着你完成了……

图像

不,我们没有忘记。

下一章为达到你可以处理制图需求的基础铺设了基础,因此我们请求教练谅解。

目前,你的代码只能处理一个特定数据文件的数据。教练数据集中还有其他 60 多个文件。如果有一种方式可以根据需要随时使用这些代码,那就太好了。

当你前往下一章时,你可以考虑这样做,届时我们将一起解决这个问题。

现在,让我们用另一个总结和一个超时事话题的纵横字谜来结束这一章节。享受吧!

第四章:文件列表:函数、模块与文件

Image

你的代码不能永远留在笔记本中。它想要自由。 当谈到解放你的代码并与其他人共享时,一个定制的函数是第一步,紧随其后的是一个模块,它让你组织和分享你的代码。在本章中,你将直接从到目前为止编写的代码中创建一个函数,并在此过程中创建一个可共享的模块。你将立即使用你的模块处理教练的游泳数据,使用for循环、if语句、条件测试和PSL(Python 的标准库)。你还将学习如何为你的函数添加注释(这总是一个好主意)。有很多事情要做,所以让我们开始吧!

Image

Cubicle Conversation

Sam: 我已经向教练更新了至今为止的进展。

Alex: 他满意吗?

Sam: 在某种程度上,是的。他对事情已经开始感到高兴。然而,正如你可以想象的那样,他只对最终产品感兴趣,对教练来说,最终产品就是条形图。

Alex: 现在最近的笔记本产生了我们需要的数据,这应该很容易做到,对吧?

Mara: 嗯...差不多吧。

Alex: 为什么?

Mara: 当前的笔记本Times.ipynb为 13 岁以下年龄组的达里乌斯游 100 米蝶泳提供数据。但是,需要执行转换和平均计算来处理任何游泳者的文件。

Alex: 当然很简单:只需将笔记本顶部的文件名替换为另一个文件名,然后按下Run All按钮,然后 – voila! – 你就得到了你的数据。

Mara: 你认为教练会乐意这样做吗?

Alex: 呃...我没有考虑教练如何运行这些东西。

Sam: 我们正在朝着正确的方向前进,我们确实需要一个可以处理任何游泳者文件名的机制。如果可以做到这一点,我们就可以继续为条形图创建代码了。

Alex: 所以我们还有一段路要走...

Mara: 是的,但还没做到很远。正如你已经提到的,我们需要的所有代码都在Times.ipynb笔记本中...

Alex: ...你不想把它给教练...

Mara: ...好吧,不是它当前的形式。

Alex: 然后怎么办?

Sam: 我们需要一种方式来打包这段代码,使其可以与任何文件名一起使用,并且可以在笔记本之外访问...

Alex: 啊,当然了:我们需要一个函数!

Sam: 这使我们进展了一部分。

Mara: 如果函数放在一个 Python 模块中,它可以在很多地方共享。

Alex: 对我来说听起来不错。我们从哪里开始?

Mara: 让我们首先将现有的笔记本代码转换成一个可以调用的函数,然后共享。

如何在 Python 中创建一个函数

除了实际的函数代码之外,你还需要关注函数的签名。有三件事需要记住。你需要:

图像 想出一个好的、有意义的名称

Times.ipynb笔记本中的代码首先处理文件名,然后处理文件内容以提取教练所需的数据。因此,让我们称这个函数为get_swim_data。这是一个很好的名字,是一个有意义的名字...天哪,它几乎是完美的!

图像 确定任何参数的数量和名称

您的新get_swim_data函数接受一个参数,用于标识要使用的文件名。让我们称这个参数为fn

图像 在 def 语句下缩进函数的代码

def关键字引入了函数,让您可以指定函数的名称和任何参数。在def关键字下缩进的任何代码都是函数的代码块。

注意

把“def”看作“定义函数”的简写可能会很有用。

请务必向您的函数添加注释

全部披露:我们说了一小白谎...我们让你误以为你只需要将代码复制到函数中,适当缩进即可。但是,您还应该在函数开头添加注释。

您已经看到一个单独的**#**字符如何在代码中开启单行注释。当您需要添加多行注释时,您可以将注释括在三引号中,信不信由你,它也是一个字符串对象。

注意

当您用三引号括起时,一个字符串可以跨越多行。

当 Python 遇到未分配给变量名的字符串对象时,它会简单地忽略它,这使得使用三引号括起的字符串非常适合多行注释。这里是一个例子:

图像图像

很好的问题(发现得也很好)。

元组是 Python 内置的数据结构之一,在第一章中简要介绍过。当时我们有点过于泛化,暗示元组很像列表。稍后在本书中我们会详细介绍元组。现在,请回忆一下它的样子:

图像

现在,你的第二个问题是什么?

图像

这是另一个很好的观察。

不,我们没有忘记声明参数的类型。事实上,在 Python 中,您不需要声明参数的类型,因为每个函数参数都可以是任何类型。

Python 是一种动态类型语言。这意味着,除其他外,类型决策不会在运行时进行,这与那些古板的静态类型语言截然不同,在编译时必须了解一切。

注意

根据您的编程背景,这可能使您感到有争议。我们的建议是不要让这件事困扰您。本页的“极客注”讨论了一个 Python 3 功能,可以被认为是在静态类型坚定派中间。

为您函数的代码创建一个文件

在 Jupyter Notebook 的代码单元格中,你可以定义任何函数。实际上,当你试图确定需要创建的代码时,首先在笔记本中进行实验是我们推荐的方法。

Image

然而,你在 Times.ipynb 笔记本中已经有了添加到 get_swim_data 函数中的所有必要代码,所以不需要进一步的实验。相反,让我们使用 VS Code 创建一个名为 swimclub.py 的新 Python 文件。

注意

在 VS Code 中,选择“文件”,然后“新建文件”,然后选择“Python 文件”作为类型。当出现空编辑窗口时,将文件保存为“swimclub.py”(并确保将文件保存到你现有的“学习”文件夹中)。

这是我们复制到 swimclub.py 中的代码,我们对其进行了一些微小的调整(请注意注释):

ImageImage

是的,完全正确。

只需对函数的代码进行一点小修改,确保它真的有用。

函数可以将结果返回给它们的调用代码

除了在传入数据时接受数据 ,函数还可以将数据传递给调用它们的代码(也就是在传出数据 )。发送到函数中的参数将被分配给函数签名中定义的参数名称,而任何结果将通过 return 语句返回到调用代码。

在继续之前更新并保存你的代码...

在转到下一页之前,请确保在你的 swimclub.py 文件中的 get_swim_data 函数的最后一行添加以下代码行。请小心匹配此代码行的缩进,以与函数中的所有其他代码使用的缩进相匹配:

Image

使用模块来共享代码

如果你查看 swimclub.py 文件中的代码,你会发现它包含一个单一的 import 语句,一个单一的常量定义和一个单一的函数。一旦将代码移入单独的文件中,它就成为了一个 Python 模块。恭喜你:你已经创建了你的第一个 Python 模块,名为 swimclub。

Image

基本就是这样。

事情可能会变得更加复杂,但正如你刚刚看到的那样,在 Python 中创建一个 可共享的模块 就像把一些代码放入文件中并给它命名那样简单。如此简单,简直应该有个法律来禁止它。.. Image

Image

这是一个完全合格的名称。

当你用“模块点函数”来引用你的函数时,你是在使用包含它的模块的名称来限定函数的名称。这在实践中非常常见,虽然还有其他常见的导入技术。随着你继续阅读本书,你会看到这些技术的例子。

Image

很好。也注意到了。

这可能不是你在这里期待的解释,但这些括号确实是必须的。

让我们稍微深入一点,这样你就能理解发生了什么。

当需要时,函数返回一个元组

当你调用一个看起来返回多个结果的函数时,实际上并不是这样。相反,你会得到一个包含所有结果的单个元组(不管有多少结果)。

图片图片

这是个好建议。

虽然我们并不是在暗示这里有一些心灵感应的事情发生,但是我们确实有了同样的想法...

图片

往往有一个“更好”的方法。

上一页的代码是有效的,并且按照你的期望工作。(你确实在笔记本上尝试过了,对吧?!?)通过一些小的变化,你可以使这两个示例更加Pythonic,你将在下一页探讨这些变化。

注意

“Pythonic”:代码利用 Python 所提供的功能编写,而不是明显看起来是为了符合其他编程语言“正确方式”而编写的 Python 代码。

希望一旦应用这些变化,你的代码就不会感觉那么笨重了。

图片

希望有一个文件名列表。

你的get_swim_data函数,属于swimclub模块,接受任何游泳者的文件名并将结果作为元组返回给你。

现在需要的是文件名的完整列表,你应该可以从底层操作系统中获得。Python 当然可以帮到你。

让我们确定文件名列表

当涉及到操作系统的工作(无论你使用的是WindowsmacOS还是Linux),PSL 都为你提供了支持。os模块让你的 Python 代码以跨平台的方式与操作系统进行交互,现在你将使用os模块获取swimdata文件夹中的文件列表。

记得要在你的Files.ipynb笔记本中跟上进展。

图片

你希望知道你的swimdata文件夹中的文件名,并且os模块提供了方便的listdir函数来完成这个任务。当你传入一个文件夹的位置时,listdir会返回该文件夹包含的所有文件的列表:

图片

你原以为swim_files列表中会有 60 个数据,这是可以理解的。毕竟,你的文件夹里有 60 个文件。然而,在我们的Mac上,当我们再次检查swim_files的大小时,我们感到震惊:

图片

现在是一些侦探工作的时间...

你原本以为你的文件列表有 60 个文件名,但是len BIF 报告你的swim_files变量中有 61 个项目。

为了试图弄清楚这里到底发生了什么,让我们首先在屏幕上显示swim_files列表的值:

图片图片图片

多好的主意。

让我们使用组合输出来查看列表中内置了什么。

你可以对列表做什么?

这里是你的swim_files列表的print dir组合输出:

ImageImageImage

是的,这可能是个问题。

由于swimdata.zip文件最初是在 Mac 上创建的,.DS_Store文件被自动添加到了 ZIP 存档中。这种特定于操作系统的问题总是令人担忧。

在继续之前,重要的是要移除swim_files列表中不需要的文件名。

Image

确实如此。

在你学习本书时,你会看到大多数内置方法的实际应用。但是现在,专注于完成这个练习所需的部分就可以了。

Image

那会很好,不是吗?

我们可以不顾一切地着手创建一些条形图,但现在可能为时尚早。

到目前为止,你的get_swim_data函数已经运行良好,但你能确定它对任何游泳者的文件都适用吗?让我们花一点时间确保我们的get_swim_data函数如预期般工作,无论它接收到哪种数据文件。

是你的数据有问题还是你的代码有问题?

现在你已经找出了问题文件,让我们打开它的内容,看看是否能找到问题的根源。这是在 VS Code 中打开的Abi-10-50m-Back.txt文件:

Image

这是抛出错误的代码行。你能看出问题在哪里吗?

ImageImage

一个错误的假设是问题的根源。

按照你的代码编写,假定每个游泳时间都符合分钟:秒.百分秒的格式,但 Abi 的 50 米游泳时间显然不是这种情况,这就是为什么你会遇到**ValueError**错误。

现在你知道问题所在,那解决方案是什么?

小隔间对话

Sam:在这里,我们有什么选择?

Alex:我们可以修复数据,对吧?

Mara:怎么了?

Alex:我们可以预处理每个数据文件,以确保没有缺少的分钟,也许在分钟数缺失时加上零和冒号作为前缀?这样,我们就不必改动任何代码了。

Mara:那样会起作用,但是……

Sam:...会很混乱。而且,我不太想要处理所有的文件,因为绝大多数都不需要修改,感觉这可能有些浪费。

Mara:虽然作为一个策略,我们不需要改动任何现有的代码,但我们需要创建代码来进行预处理,也许可以作为一个单独的实用工具。

Sam:还要记得,数据是固定格式的,并且由教练的智能秒表生成。我们确实不应该去修改数据,所以我们最好还是保持原样。

Alex:那么,我们要修改我们的get_swim_data函数了吗?

Mara:是的,我觉得这是个更好的策略。

Sam:我也是。

Alex:那么,我们需要做什么?

Mara:我们需要确定我们的代码中需要进行哪些更改……

Sam:……以及这些代码改动需要做哪些内容。

Alex:好的,听起来不错。所以我们要仔细查看我们的get_swim_data函数,看看需要改变哪些代码?

Mara:是的,然后我们可以使用一个if语句来根据当前处理的游泳时间是否具有分钟值来做出决策。

图像

注意

翻页看我们的选择。 图像

决策,决策,决策

这就是if语句的作用,日复一日:它们做出决策。

图像

是的,在这里需要这个。

让我们更仔细地看一下两种可能的游泳时间格式。

首先,这是达里奥在他的文件中记录的一个时间:

'1:30.96'

这里是阿比的数据中的一个时间:

'43.35'

很容易看出区别:阿比的数据不显示任何分钟。考虑到这一点,可以提出一个条件来检查在做决策时。你能想出是什么条件吗?(提示:考虑你的好朋友冒号)。

让我们在字符串中查找冒号“in”

如果冒号出现在任何游泳时间字符串中,则该时间具有分钟值。尽管字符串带有许多内置方法,包括可以执行搜索的方法,但在这里我们不要使用任何这些方法。因为搜索是如此常见的需求,Python 提供了in运算符。你之前见过in,在for循环中使用过:

注意

“find”和“index”字符串方法都执行搜索。

图像

使用infor标识正在迭代的序列。然而,当in在循环外使用时,它具有搜索的功能。考虑以下in的使用示例:

图像图像

我们也喜欢 **in** 关键字。

这是 Python 的超能力。

图像

绝对,在稍作整理之后。

确保将以上代码添加到你的swimclub.py模块中的get_swim_data函数中,并不要忘记保存你的文件。

完成这些后,返回你的笔记本,并跟随下一页的测试驱动

你处理了 60 个文件吗?

你可能对你最近的代码很有信心,它正在处理swimdata文件夹中的所有文件。我们也是如此。然而,确认这些事情通常是件好事。总是有很多方法可以做到这一点,但让我们通过为你的for循环的结果编号来在屏幕上显示每行输出来实现。

为了实现这一点,让我们再使用另一个专门为此目的创建的 BIF,叫做enumerate

图像图像

教练的代码正在形成中……

您的swimclub模块现在已经准备就绪。给定一个包含游泳时间字符串的文件名,您的新模块可以生成可用的数据。教练期望从这些数据中创建一些柱状图,所以让我们在下一章中实现这个功能。

一如既往,在你浏览了本章总结并尝试了本章的填字游戏之后,你可以继续前进。

图片

关于作者

保罗·巴里拥有信息系统学士学位以及计算机硕士学位。他还有教育学与教学的研究生资格。自 1995 年以来,保罗一直在卡洛技术学院工作,并自 1997 年起在那里讲课。在从事教学工作之前,保罗在爱尔兰和加拿大的 IT 行业工作了十年,其中大部分工作是在医疗保健领域。

标签:Python,代码,第三版,列表,--,一个,字符串,我们
From: https://www.cnblogs.com/apachecn/p/18253056

相关文章

  • 【杂记】配置文件
    properties配置文件application.properties是springboot项目默认的配置文件,所以springboot程序在启动时会默认读取application.properties配置文件,而我们可以使用一个现成的注解:@Value,获取配置文件中的数据。@Value注解通常用于外部配置的属性注入,具体用法为:@Value("${配置文......
  • Python-与-Jax-现代推荐系统构建指南-全-
    Python与Jax现代推荐系统构建指南(全)原文:annas-archive.org/md5/da17d05291861831978609329c481581译者:飞龙协议:CCBY-NC-SA4.0前言你是如何找到这本书的?是在网站上看到广告吗?也许是朋友或导师建议的;或者你在社交媒体上看到了提到它的帖子。也许你是在书店的书架上发现......
  • 无监督学习实用指南-全-
    无监督学习实用指南(全)原文:annas-archive.org/md5/5d48074db68aa41a4c5eb547fcbf1a69译者:飞龙协议:CCBY-NC-SA4.0序言机器学习的简要历史机器学习是人工智能的一个子领域,计算机通过数据学习,通常是为了在某些狭义定义的任务上提高性能,而无需显式编程。机器学习这个术语早......
  • 机器学习口袋参考-全-
    机器学习口袋参考(全)原文:annas-archive.org/md5/dd771df8c19ec4613e3638bc1f862b92译者:飞龙协议:CCBY-NC-SA4.0前言机器学习和数据科学目前非常流行,是发展迅速的目标。我大部分职业生涯都在使用Python和数据,并且希望有一本实体书可以提供我在工业界和工作坊教学中使用的......
  • Python-机器学习秘籍第二版-全-
    Python机器学习秘籍第二版(全)原文:annas-archive.org/md5/343c5e6c97737f77853e89eacb95df75译者:飞龙协议:CCBY-NC-SA4.0前言当本书的第一版于2018年出版时,填补了机器学习(ML)内容日益丰富的关键空白。通过提供经过充分测试的、实用的Python示例,使从业者能够轻松地复制和......
  • 消息队列
    为什么使用消息队列消息中间件(MessageMiddleware)是分布式系统中重要的组件,用于在不同系统或组件之间传递消息。它有助于解耦生产者和消费者,使它们可以独立扩展和演化。常见的消息中间件有:ApacheKafka:高吞吐量、分布式的发布-订阅消息系统,适合处理大数据。RabbitMQ:基于AMQP......
  • 魂断代码读书笔记1
    《梦断代码》的第一章“死定了”集中描绘了Chandler项目在2003年7月的初期阶段面临的种种混乱和困难。作为一个开源项目,Chandler并没有商业项目那样的资金支持和明确的管理体系,因此在技术和管理上遇到了很多问题。技术问题在技术层面,Chandler项目遇到了许多挑战。首先是技术选型......
  • 获取Windows设备CPUID信息
    CPUID目录简介代码实现基于C/C++的实现基于C#的代码实现基于Python的代码实现简介CPUID是一个CPU(中央处理器)的指令,用于获取处理器的详细信息。它通常用于操作系统、虚拟机监控程序(如虚拟机管理程序或超级监视器)、调试程序和性能分析工具等,来获取关于处理器硬件......
  • NIO操作文件读写
    第一章第一节,Buffuer案例一 从buffur读出数据,创建了一个 FileInputStream 对象,并通过调用 getChannel() 方法获取了与之关联的 FileChannel。然后,我们创建了一个 ByteBuffer,并使用 channel.read(buffer) 方法从文件中读取数据到缓冲区。最后,我们通过循环将缓冲区中......
  • Semantic-SAM: Segment and Recognize Anything at Any Granularity论文阅读笔记
    Motivation&Abs现有的结构限制了模型以端到端的方式预测多粒度分割mask;同时目前没有大规模的语义感知&粒度感知数据集,同时不同数据集之间语义和粒度的固有差异给联合训练工作带来了重大挑战。本文提出通用图像分割模型,能够以任何粒度分割识别任何内容,给一个点作为prompt能够生......