本章涵盖了
- 在您的系统上设置 Python、VS Code 和 Copilot
- 引⼊ Copilot 设计流程
- Copilot 的价值在于基本的数据处理任务
本章将帮助您在自己的计算机上开始使用 Copilot,并熟悉与其的交互方式。在设置好Copilot 后,我们将要求您尽可能跟随我们的示例进行操作。实践是最好的学习方式,我们相信您可以在本书的剩余部分与我们一同学习。
一旦您设置好 Copilot,我们将通过一个有趣的示例来展示 Copilot 在解决标准任务中的强大能力,您将看到如何与 Copilot 进行交互,并了解我们如何在不编写任何实际代码的情况下编写软件。
2.1 设置您的计算机开始学习的时间
学习如何编写软件需要你实际去编写软件,而不仅仅是阅读相关内容。如果这是一本关于如何弹吉他的书,你会一直阅读而不尝试弹吉他吗?我们认为不会。只是阅读这本书而不跟着实践并亲自尝试,就像看着一名马拉松选手完成比赛后,以为自己已经准备好去跑一场马拉松一样。我们不再使用类比了,但是说真的,在我们继续之前,你需要安装并运行你的软件。
现在最让我们担心的是,我们刚刚达到了新手最容易失败的普遍阶段,即使那些渴望学习编程的人也是如此,而我们真的希望看到你成功。现在,你可能会想,“等等,真的吗?我们才刚刚开始。”是的,这正是关键所在。在 Leo 的流行的 Coursera 课程中学习 Java 编程,你能猜到大多数新学习者离开的时候吗?是课程结束时需要实时在地球上绘制地震标记的具有挑战性的作业吗?不是的。实际上,大多数学习者离开的是热身作业,他们必须设置他们的编程环境。因此,我们理解这可能是你面临的一个障碍。我们希望通过这个不那么明显的推动,我们可以帮助你实现你购买这本书时心中的所有目标。一切都始于安装软件。
2.1.1 您编程环境中软件的概述
为了轻松设置和使用 Copilot,我们将安装适用于新手和软件工程师的软件编辑工具。您将使用的工具包括 GitHub、Copilot、Python 和 Visual Studio Code。当然,如果您已经安装了所有这些工具,请跳转到第 2.5 节。
Github 账号
GitHub 是一个行业标准的开发、维护和存储软件的工具。然而,在本书中我们不会使用GitHub。我们只是注册 GitHub 账户是因为你需要一个账户来访问 Copilot。注册 GitHub 账户是免费的,但是在撰写本文时,Copilot 是收费的。如果你是学生,他们将免除这个费用。如果你不是学生,在撰写本文时,你可以获得 30 天的免费试用。
你可能会问为什么他们要收费,这有一个很好的答案。建立 GPT3 模型是很昂贵的(想象一下成千上万台电脑运行一年来建立模型),而且 GitHub 提供模型的预测也会产生成本(许多机器接收你的输入,通过模型运行它,并生成你的输出)。如果你还没有准备好使用 Copilot,你可以在注册后大约 25 天的时间内做一个日历提醒,如果那时你还没有使用 Copilot,就取消订阅。另一方面,如果你已经成功学会了如何使用 Copilot 编写软件,并且正在工作中或者只是作为一种爱好来提高你。
Python
真的,任何编程语言都可以用于这本书,但我们选择了 Python,因为它是世界上最流行的编程语言之一Python更容易阅读、理解和编写。对于这本书,Copilot 主要生成代码,而不是你自己。然而,你会想要阅读和理解 Copilot 生成的代码,而 Python 非常适合这样做。
Visual Studio Code (VS Code)
您可以使用任何文本编辑器进行编程。然而,如果您想要一个良好的编程环境,在这里您可以编写代码,轻松地从 Copilot 获得建议,并运行您的代码,我们推荐使用 VS Code 工具。VS Code 被初学者用于学习软件,并且受到学生们的喜爱[2]。它也被全球的专业软件工程师使用,这意味着您可以在完成本书后继续使用这个环境来工作和学习。
为了使 VS Code 适用于本书您需要安装一些扩展以便使用 Python 和 Copilot 进行工作,VS Code 的一个很棒的特点是很容易安装这些扩展。
2.2 设置您的系统
这是一个四步骤的过程。为了简化本章节,我们只提供了该过程的主要步骤。然而,更详细的说明可在以下位置找到。
- 访问 GitHub 的文档,网址为 https://docs.github.com/en/copilot/getting-started-with-ithub-copilot。
- 这本书的网站(https://www.manning.com/books/learn-ai-assisted-python-programming)提供了设置 PC 和 macOS 系统的详细说明。由于这些工具的网站在我们编写本书后可能会发生变化,我们建议您同时使用 GitHub 链接和书籍网站。
- 在在线书籍论坛(https://livebook.manning.com/book/learn-ai-assisted-python-programming/discussion)上,您可以寻求帮助并查看一系列常见问题的答案。
您需要完成的主要步骤如下:
- 设置您的 GitHub 账户并注册 Copilot
- 前往 https://github.com/signup 并注册一个 GitHub 账户。
- 进入 GitHub 的设置并启用 Copilot。这是你需要验证你是学生或者注册 30 天免费试用(在撰写本文时可用)的时候。
- 安装 Python
- 前往www.python.org/downloads/。
- 下载并安装最新版本的 Python(写作时为 3.11.1)。
- 安装 VS Code
- 前往https://code.visualstudio.com/download,选择适用于您操作系统的主要下载(例如,Windows 下载或 Mac下载)。
- 下载并安装最新版本的 VS Code。
- 安装以下 VS Code 扩展(详细信息请参见 https://code.visualstudio.com/docs/editor/extension-marketplace)。
- Python(由 Microsoft 提供)——请按照 https://code.visualstudio.com/docs/languages/python上的说明正确设置 Python 扩展(特别是选择正确的解释器)。
- GitHub Copilot(由 GitHub 开发)
- GitHub Copilot 实验室(由 GitHub 提供)——请注意,大部分书籍不需要使用Copilot 实验室,所以如果与写作时有所改变,请不要灰心。我们与 Copilot 实验室的交互也可以通过与 ChatGPT 或 Github Copilot Chat 进行交互来完成。
- GitHub Copilot Chat(由GitHub提供)——撰写时,GitHub Copilot Chat 尚未对所有人开放。本功能将在后面的章节中使用,但如果仍然无法使用,我们可以使用 ChatGPT 进行相同的对话。在使用此功能时,我们将提供更多详细信息。
我们知道这里的步骤很简要。如果遇到任何问题,我们鼓励您参考之前提到的资源,获取更详细的设置说明。
2.3 在 Visual Studio Code 中使⽤ Copilot
现在您已经设置好了系统,让我们来熟悉一下图2.1中显示的 VS Code 界面。(您可能需要点击左上角的资源管理器图标以获得相同的视图。)图2.1中标识了以下区域:
- 活动栏——最左边是活动栏,我们可以在这里打开文件夹(也称为目录)或安装扩展(就像您在前一节中安装 GitHub Copilot 扩展一样)。
- 侧边栏 - 侧边栏显示当前在活动栏中打开的内容。在图2.1中,活动栏选择了资源管理器,因此侧边栏显示当前文件夹中的文件。
- 编辑窗格 - 这些是我们用来创建软件的主要区域。编辑窗格中的编辑器类似于其他文本编辑器,您可以使用剪贴板编写、编辑、复制和粘贴文本。然而,它的特殊之处在于它被设计成与代码配合使用。正如我们将在下一个示例中看到的,您主要将在此窗口中通过要求 Copilot 生成代码,然后测试该代码来工作。
- 输出和终端面板-这是界面上用于查看代码输出或发生的任何错误的区域。它有问题、输出、调试控制台和终端标签。我们主要使用问题标签,可以看到代码中潜在的错误,以及终端标签,可以与 Python 进行交互并查看代码的输出。
我们在图 2.1 的右下角突出显示了 Copilot 的标志,因为如果您在前一节正确设置了 Copilot,您应该能看到这个符号(或类似的符号)。
2.3.1 设置您的⼯作⽂件夹
在 VS Code 的左侧活动栏顶部,您会找到资源管理器作为顶部图标。点击资源管理器后,应该会显示“未打开文件夹”。点击按钮打开文件夹并选择计算机上的一个文件夹(或创建一个新文件夹 - 我们喜欢文件夹名为 fun_with_Copilot)。一旦您打开了这个文件夹,您的工作区将是您打开的文件夹,这意味着您的代码和任何数据文件(比如我们将在本章后面使用的文件)都应该在那个文件夹中。
⽂件未找到或⽂件丢失错误
如果你收到⼀个说你缺少⽂件的错误,请放⼼:这些是每个⼈都会犯的错误。在编写软件时,它们可能会⾮常恼⼈。可能是你只是没有把⽂件放在你的⼯作⽂件夹中-这种情况很常⻅。通过将⽂件复制或移动到正确的⽂件夹中,这个问题很容易解决。然⽽,有时候,你会在⽂件夹中找到⽂件,但当你在 VS Code 中运⾏代码时,Python 似乎找不到它。如果这种情况发⽣在你身上(在写书时我们也遇到过!),请确保使⽤ VS Code 中的资源管理器打开包含代码和所需⽂件的⽂件夹(如图2.1中的侧边栏所示)。
2.3.2 检查您的设置是否正常⼯作
让我们检查一下我们是否正确设置了一切,并且 Copilot 正常工作。要做到这一点,首先创建一个新文件来保存我们的程序。您可以通过转到文件 > 新建文件(图2.2),然后选择 Python 文件(图2.3)来完成这个操作。
创建完成后,我们希望确保已保存文件。转到文件 > 另存为,让我们将此文件命名为first_Copilot_program.py。
接下来,在文本编辑器中输入:
# output "Hello Copilot" to the screen
- 1
我们写的提示和代码将使用粗体字来区分我们所写的内容和 Copilot 可能给出的代码和注释。开头的 # 符号很重要(你应该在你输入的内容中包含它)。它表示你所写的是一个注释(根据你的 VS Code 颜色方案,它的颜色会与我们即将生成的代码不同)。注释不是代码:计算机执行
代码而不执行注释。程序员使用注释来提供对代码所做的人类可读的摘要,以帮助其他软件工程师阅读代码。如今,它的作用已扩展到提示 Copilot。在写注释之后(有时甚至在写注释时),Copilot 会尝试给出建议。你可以将其视为更复杂的自动完成,就像当你在搜索引擎中输入“New York T”时,它会自动完成为“New York Times”。
的开头。稍等片刻,您应该会看到一些内容出现。在被接受之前,Copilot 的建议以浅灰色斜体显示。如果您还没有收到建议,可能需要再次按 Enter 键来触发 Copilot 提供代码的建议。以下是我们的情况:
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
如果您仍然没有看到 Copilot 的建议,请尝试按下 Ctrl-Enter(按住 Ctrl 键同时按下 Enter 键)。当您按下 Ctrl-Enter 时,屏幕右侧应该会出现一个新窗口。该窗口将位于您的编辑器窗口右侧,并被称为 GitHub Copilot。如果该窗口没有出现,可能是您的设置有问题,请前往书籍网站确认您是否正确执行了所有步骤,或者寻找(或请求)帮助。
如果您看到了 Copilot 的建议,请按 Tab 键接受 Copilot 的建议。一旦您这样做,之前以浅灰色斜体显示的建议现在应该以标准字体显示:
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
您可能会看到与我们不同的代码。我们提到这一点是因为有时 Copilot 在这里的代码上会犯一个小错误,可能会给您类似于这样的代码:
print "Hello Copilot"
- 1
你可能会认为这个细微的差别(在“Hello Copilot”周围没有括号)并不重要,但实际上是重要的。在 Python 3 之前,这是 print 语句的正确语法,而当 Python 3 被引入时,它切换到了带有括号的代码。由于我们正在运行 Python 3,你需要在代码中加上括号才能使其正常工作。你可能会问为什么 Copilot 会犯这个错误:问题在于 Copilot 在训练过程中使用了一些旧的 Python 代码。如果这看起来很烦人,我们同意。但这是 Copilot 之前的初学者程序员所经历的挫折的一种暗示。Copilot 建议的大部分语法都是正确的。但如果你是一个从头开始编写代码的初学者,缺少括号或者某个地方缺少冒号可能会浪费你很多时间。
现在我们有了正确的代码,
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
你可能猜到了,它会将“Hello Copilot”打印到屏幕上,我们应该测试一下。首先,你需要保存你的文件,方法是点击文件 > 保存。
在运⾏之前,请务必保存您的⽂件。我们很尴尬地承认,我们曾花费⼤量时间来修复本来正确但未保存的代码。
要运行您的程序,请转到文本编辑器的右上角,然后单击图2.1中显示的运行代码图标。按下图标后,在底部的终端部分,您应该看到类似于以下内容的内容:
> & C:/Users/YOURNAME/AppData/Local/Programs/Python/Python311/Python.exe
c:/Users/YOURNAME/Copilot-book/first_Copilot_program.py
Hello Copilot
- 1
- 2
- 3
- 4
- 5
以 > 开头的顶行是计算机运行代码的命令,它只是告诉计算机使用 Python 运行你的first_Copilot_program.py。第二行是运行命令后的输出,它显示"Hello Copilot",这正是我们希望看到的。
恭喜!你已经写了你的第一个程序!我们现在知道你的编程环境已经正确设置好了,我们可以继续进行我们的第一个编程任务了。但在此之前,我们想要讲解一些我们在使用 Copilot 时遇到的常见问题的处理技巧,这样在你进行下一个示例时就可以使用这些技巧了。
2.4 解决常⻅的 Copilot 挑战
在你使用 Copilot 的经验中,现在谈论 Copilot 的常见挑战可能还为时过早,但你在编写第一个程序时可能已经遇到了一些挑战。在接下来的示例和下一章中,你肯定会遇到其中一些问题,所以我们现在想把这些问题给你。
在我们使用 Copilot 的过程中,我们遇到了一些常见的挑战。随着 Copilot 的改进,这些挑战可能会减少,但在撰写本文时,它们仍然是问题。尽管表 2.1 中的挑战并不详尽,但我们希望我们关于如何应对这些常见挑战的提示能帮助您快速上手。我们将在本书的网站上保持一个持续更新的列表,所以如果您觉得我们漏掉了什么,请随时在论坛上与我们联系!
2.5 我们的第⼀个编程问题
这一部分的目标有两个:(1)让您了解与 Copilot 互动的工作流程,(2)让您通过看到 Copilot 轻松解决一个复杂任务而对其强大能力有所认识。
在下一章中,我们将更详细地讨论使用 Copilot 的工作流程,但通常在使用 Copilot 编写代码时,您将按照以下步骤进行操作:
- 使用注释(#)或文档字符串(“”") 向 Copilot 编写提示。
- 让 Copilot 为您生成代码。
- 通过阅读和测试来检查代码是否正确。
- 如果它有效,请进行下一步,以完成您希望它完成的事情。
- 如果不起作用,从 Copilot 中删除代码,回到第1步并修改提示(并查看表 2.1 中的建议)。
因为你刚刚开始使用 Copilot,我们对向你展示这样一个庞大的示例持谨慎态度,但我们相信你会珍视看到安装了 Copilot 后它的强大之处。因此,我们希望你尽力跟上,以便自己体验使用Copilot 的感觉,但如果你遇到困难,只需阅读并在下一章节中继续使用 VS Code 与 Copilot 一起工作。后面的章节将更详细地解释使用 Copilot 的过程。
此外,Copilot 将在本节中生成大量代码,我们不希望您在本书的后期之前理解这些代码。我们提供代码仅供您查看 Copilot 给我们的内容,但不必试图在本章中理解代码。开始之前,让我们创建一个新文件。如果你还没有打开 VS Code,请打开它。然后创建一个新的 Python 文件,并将其保存为 nfl_stats.py。
2.5.1 展示 Copilot 在数据处理任务中的价值
我们想从一些基本的数据处理开始,因为这是你们许多人在个人或职业生活中可能做过的事情。为了找到数据集,我们去了一个很棒的网站叫做 Kaggle [4],上面有大量免费可用的数据集。其中许多包括了重要的数据,比如不同国家的健康统计数据,帮助追踪疾病传播的信息等等。我们不会使用那些数据,因为我们希望在我们的第一个程序中使用一些更轻松的东西。由于我们两个都是美式足球的粉丝,我们觉得应该使用美国国家橄榄球联盟(NFL)的进攻统计数据库。
让我们从 www.kaggle.com/datasets/dtrade84/nfl-offensive-stats-2019-2022 下载数据集,开始吧。
要下载数据集,您需要注册一个 Kaggle 账户。如果您不想创建账户,只需阅读本节内容,不使用 VS Code 和 Copilot 自动生成代码即可。下载完成后,您可能需要使用计算机上的默认 zip解压工具解压 zip 文件。将数据集文件从 zip 文件中复制到您在 VS Code 中打开的当前文件夹(即您在资源管理器中打开的文件夹)。(如果您使用的是 Mac,并且文件保存为 .numbers 文件,则需要使用“文件”>“导出”将文件保存为当前工作目录中的 CSV 文件。)该数据集包含 2019 年至 2022 年的 NFL 信息(图2.4)。
nfl_offensive_stats.csv 文件是一种称为逗号分隔值文本文件的东西(见图2.4中的部分文件)。这是一种存储数据的标准格式。顶部有一个标题行,解释了每一列的内容。我们(或计算机)知道列之间的边界是使用逗号分隔单元格。还请注意,每一行都放在自己的行上。好消息是:Python 有一堆用于读取 CSV 文件的工具。
第⼀步: 亚伦-罗杰斯在 2019-2022 年的传球码数是多少?
让我们首先探索一下这个文件中存储了什么。要预览文件中的内容,您可以在 Kaggle 网页上查看这些统计数据的“详细信息”,在 VS Code 中打开它,或者在类似 Microsoft Excel 的电子表格软件中打开它。(如果您使用 Excel 打开它,请确保不要保存该文件。我们需要将文件保留为 .csv 格式。)无论您选择以哪种方式打开它,这是标题(顶部)行的开头(也显示在图 2.4 中):
game_id, player_id, position, player, team, pass_cmp, pass_att, pass_yds, ...
- 1
有更多的列,但这些列已经包含了我们执行第一个任务所需的所有内容。我们现在知道有一个列是关于球员的,还有一个列是关于传球码数的。亚伦·罗杰斯是一个球员,在他参加的每场比赛中都会获得传球码数。但是从 2019 年到 2022 年,他总共有多少传球码数呢?直接查看文件并不容易回答这个问题。所以,我们希望计算机能够帮助我们简化这个过程!
我们希望它总结出所有 Aaron Rodgers 是球员的比赛行中的传球码数(pass_yds)。目前,我们只要求数据库中的所有码数,即使它涵盖了多个赛季。如果需要的话,我们以后可以更改这个。这个问题可能是一个很好的问题,可以交给在标准大学级入门编程课程的第四周学习编程的程序员,但我们有 Copilot!所以,我们不需要从头学习如何编写这段代码,我们只需要让Copilot 为我们生成它。为了实现这一点,我们需要在请求中非常具体,以确保 Copilot 知道我们在请求什么。我们只会要求它执行少量的工作,然后重新提示它执行下一步。稍后我们将讨论如何编写好的提示,但现在,只需将这段文字放在您的新文件的顶部即可。
"""
open the csv file called "nfl_offensive_stats.csv" and read in
the csv data from the file
"""
- 1
- 2
- 3
- 4
顶部和底部的 “”" 括起来的是一个叫做文档字符串的东西。文档字符串是一种注释的替代方式(类似于以 # 开头的文本)。它们通常用于描述函数(有关函数的详细信息,请参见第 3 章),但在这个示例中,我们使用它们来避免 Copilot 不断生成注释(请参见表 2.1 中的仅注释问题)。根据这个提示,Copilot 应该开始生成代码。对我们来说,它生成了这个代码块:
import csv
with open('nfl_offensive_stats.csv', 'r') as f:
reader = csv.reader(f)
nfl_data = list(reader)
- 1
- 2
- 3
- 4
首先,为了阅读本书的目的,我们想提醒您,提示信息的显示方式与 Copilot 生成的不同。这是有意为之,以便您可以区分我们所写的内容(以及您应该写的内容)和 Copilot 所写的内容。
其次,Copilot 生成的代码相当合理。我们不希望您在本书的这一点上理解代码,但您可能会看到我们想要打开的文件的名称以及一些关于打开和读取文件的代码。在本书的后面,我们将学习如何阅读代码。现在,只需继续跟随即可。
现在我们已经从文件中获取了数据,我们将给它一个新的提示,要求它计算出这个数据集中Aaron Rodgers 的所有传球码数的总和。因为计算机不知道什么是足球,也不知道 Aaron Rodgers 是个四分卫之类的具体信息,所以我们的提示会非常具体。在本书的过程中,我们将教你如何编写这样的提示。以下是新的提示:
"""
In the data we just read in, the fourth column is the player
and the 8th column is the passing yards. Get the sum of
yards from column 8 where the 4th column value is
"Aaron Rodgers"
"""
- 1
- 2
- 3
- 4
- 5
- 6
请注意,我们告诉计算机哪些列是玩家的,哪些是传球码数的。这是为了告诉计算机如何解释数据。另外,请注意我们明确表示只想要求和码数,前提是球员的名字是 Aaron Rodgers。在本书中,随着我们的进展,我们将教你如何编写类似的提示。根据这个提示,Copilot 生成了以下代码:
passing_yards = 0
for row in nfl_data:
if row[3] == 'Aaron Rodgers':
passing_yards += int(row[7])
print(passing_yards)
- 1
- 2
- 3
- 4
- 5
提醒:Copilot 是⾮确定性的
请记住,Copilot 是⾮确定性的,所以 Copilot 给你的结果可能与我们得到的结果不⼀样。这将是本书剩下部分的⼀个挑战:如果你得到了错误的结果,⽽我们得到了正确的结果,你该怎么办?我们相当有信⼼ Copilot 会在这⾥给你⼀个正确的答案,但如果你从 Copilot 那⾥得到了错误的答案,继续阅读本节的剩余部分,⽽不是在 VS Code 中与 Copilot⼀ 起⼯作。当 Copilot 给你错误的答案时,我们绝对会给你修复代码所需的所有⼯具,但这个技能将在本书的剩余部分中教授,所以我们不希望你现在陷⼊困境。
当我们运行这段代码(回想一下如何从图 2.1 中运行代码),我们得到的结果是 13852,这是正确的答案。(我们仔细核对了答案,但如果你对足球很熟悉,你可能可以用估计值来判断这个数字是否合理。四分卫每个赛季传球码数为 3,000-5,500 码,而这是三个赛季的数据,所以在三个赛季中累计 13,852 码似乎是一个高水平四分卫的合理范围。)特别有趣的是,我们计划给 Copilot 一个第三个提示,让它打印结果,但 Copilot 猜到了我们想要做的事情,并自己完成了。
我们希望你从这个例子(以及本章的其他内容)中得到的是:
- Copilot 是一个强大的工具。我们没有编写任何代码,但我们能够让 Copilot 生成执行基本数据分析所需的代码。对于使用过电子表格的读者来说,你可能可以想到一种使用类似 Excel 的电子表格应用程序来完成这个任务的方法,但这可能不像编写这样的代码那么容易。即使你以前没有使用过电子表格,你也必须承认,编写基本的、可读的提示就能产生正确的代码和输出,这真是令人惊讶。
- 将问题分解成小任务是重要的。对于这个例子,我们尝试使用一个大的提示(未显示)来编写这段代码,或者将其分解为两个较小的任务。较大的提示几乎与我们使用的两个较小的任务的文本完全相同,只是作为一个单独的提示。我们发现,Copilot 通常可以给出较大提示的正确答案,但有时会出错。这在我们将要展示的下一个例子中尤为明显。然而,将问题分解成较小的任务显著增加了 Copilot 生成正确代码的可能性。在本书的剩余部分中,我们将看到如何将较大的问题分解成较小的任务,因为这是您需要的最重要的技能之一。实际上,下一章将帮助您开始理解给 Copilot 合理任务的方法。
- 我们仍然需要在一定程度上理解代码。这是因为有几个原因。其中一个原因是,编写良好的提示需要对计算机知道和不知道的基本了解。我们不能只给 Copilot 一个提示,说:“给我 Aaron Rodgers 的传球码数。”Copilot 可能无法找出数据存储在哪里,数据的格式是什么,哪些列对应于球员和传球码数,或者 Aaron Rodgers 是一名球员。我们必须向 Copilot 明确说明这一点才能取得成功。另一个原因与确定Copilot 生成的代码是否合理有关。当我们两个人阅读 Copilot 的回答时,我们知道如何阅读代码,因此可以确定 Copilot 生成的代码是否合理。你需要在一定程度上能够做到这一点,这就是为什么第 4 章和第 5 章专门讲解阅读代码的原因。
- 测试很重要。当程序员谈论测试时,他们指的是确保他们的代码在可能出现意外情况下也能正常工作的实践。我们在这个部分没有花太多时间,只是检查 Copilot 的答案是否在一个数据集上是合理的,但一般来说,我们需要花更多时间进行测试,因为这是代码编写过程中的关键部分。可能不用说,但代码中的错误范围从令人尴尬的(如果你告诉你的铁杆 NFL 球迷朋友一个球员的传球码数错误)到危险的(如果汽车中的软件行为不正确)到昂贵的(如果企业基于错误的分析做出决策)。即使你已经学会了如何阅读代码,我们也有第一手经验,即使代码看起来正确,它可能并不正确!为了解决这个问题,我们必须对 Copilot 创建的每一个代码片段进行测试,以确保它能够按照预期工作。我们将在后面的章节中学习如何对 Copilot 的代码进行严格测试。
我们必须测试每一个示范 Copilot 的能力,我们将继续这个例子。请随意跟着写提示并在 Copilot 中运行代码,或者只是阅读。
第⼆步:所有四分卫在这段时间的表现如何?
了解阿伦·罗杰斯的表现如何是有趣的。但更有意义的一步是将他的数据与同一时间段的其他四分卫进行比较。我们只想与其他四分卫进行比较,因为他们是负责传球的球员。当然,跑卫可能每个赛季只传一次球,当他们这样做时通常很有趣,但这并不是他们的工作。为了只包括四分卫,我们需要回到数据。第三列是位置,QB 代表四分卫。因此,让我们删除 Copilot 给我们的所有代码(在我们最初的注释结束后的所有内容)并重新开始。我们不会像之前那样展示每个步骤。相反,以下清单是与 Copilot 的整个交互的结果,我们的提示与它给我们的代码分开突出显示。
请注意,我们给 Copilot 三个提示。第一个是处理输入数据,第二个是处理数据,第三个是输出响应。在编程任务中,这种输入数据、处理数据、提供输出的循环非常常见。
从 Copilot 的结果来看,我们必须指出我们教授编程已经多年了,这个结果相当令人印象深刻。我们可能会要求学生在我们的大学级课程的期末考试中解决类似的问题,我们怀疑不到一半的学生能正确完成。不过不深入细节,Copilot 选择了一种很好的存储数据的方式,使用了一个字典(不是普通的英语字典,而是 Python 中存储数据的一种方式),这在这里是一个很好的选择,并且使用了一种巧妙的排序数据的方式来帮助显示结果。
考虑到结果,如果你运行代码,输出的前五行是:
Patrick Mahomes 16132
Tom Brady 15876
Aaron Rodgers 13852
Josh Allen 13758
Derek Carr 13271
- 1
- 2
- 3
- 4
- 5
如果你关注足球,这些结果对你来说应该不会感到意外。为了看看 Copilot 能够如何适应我们的愿望,让我们试着做一个小的改变。假设由于汤姆·布雷迪已经被公认为有史以来最好的四分卫之一,你宁愿在这个比较中省略他。
为了进行这个更改,我们只需要修改底部的提示。转到代码中指定的位置。
"""
print the sum of the passing yards sorted by sum
of passing yards in descending order
"""
for player in sorted(passing_yards, key=passing_yards.get, reverse=True):
print(player, passing_yards[player])
- 1
- 2
- 3
- 4
- 5
- 6
删除代码,只保留注释,并在文档字符串中添加另一行。
"""
print the sum of the passing yards sorted by sum
of passing yards in descending order
Do not include Tom Brady because he wins too much
"""
- 1
- 2
- 3
- 4
- 5
Copilot 随后建议我们:
for player in sorted(passing_yards, key=passing_yards.get, reverse=True):
if player != "Tom Brady":
print(player, passing_yards[player])
- 1
- 2
- 3
这正是我们希望在代码中改变的内容。(感谢汤姆·布雷迪在这个例子中的配合。)在打印结果的时候,代码排除了所有关于汤姆·布雷迪的数据。当我们保存文件并再次运行时,现在的前五行是:
Patrick Mahomes 16132
Aaron Rodgers 13852
Josh Allen 13758
Derek Carr 13271
Matt Ryan 13015
- 1
- 2
- 3
- 4
- 5
第三步:让我们将这些数据绘制成图,以便更好地进行比较
让我们通过要求 Copilot 更进一步来强调 Copilot 是一个强大的工具。所有四分卫统计数据的打印输出可能对某些目的是有用的分析。但是,以可视化图形的方式呈现这些信息可能是更好的方式。我们能否要求 Copilot 绘制它呢?假设我们只关心表现最好的四分卫,所以我们决定将超过 4,000 码作为四分卫在此时间窗口内需要投掷的最低码数的任意限制,以便包括在我们的图表中。诚然,要求 Copilot 绘制数据可能会引入一些新的挑战,因为它涉及超越纯文本,但让我们试一试。
在我们刚刚编写的代码末尾,添加以下注释:
"""
plot the players by their number of passing yards only for
players with more than 4000 passing yards
"""
- 1
- 2
- 3
- 4
以下清单显示了 Copilot 根据我们的提示给出的代码。
我们多次给 Copilot 提供了这个提示,并且它始终生成了一个合理的图表,但是每次的代码和图表都有所不同。这只是一个代表性的结果,在这个结果中,代码明显比你在本章早些时候看到的代码更高级。事实上,我们需要更深入地理解代码才能够详细地解读它,所以我们在本书的这一点上将跳过任何尝试阅读或解释代码的尝试。我们可以告诉你,在高层次上,它正确地导入了一个用于绘制图表的 Python 模块(称为 matplotlib),在中间使用了一个相当聪明的数据处理的 Python 模块(称为 numpy),甚至还有能力旋转选手的名字,以便它们可以作为 x轴标签打印出来。
如果你运行这段代码,可能会遇到一个问题。因为 Copilot 是从 GitHub 上的代码中学习的,它不知道你个人机器上安装了哪些 Python 模块。编写 Copilot 学习代码的程序员可能已经安装了matplotlib,并且 matplotlib 是在这里使用的正确模块,但是 matplotlib 不是 Python 的默认安装模块。如果你没有安装它,当你尝试运行代码时会出现找不到 matplotlib 模块的错误。
Python 模块
Python 模块扩展了编程语⾔的功能。Python 中有许多模块,它们可以帮助你做任何事情,从数据分析到创建⽹站再到编写视频游戏。通过代码中的 import 语句,你可以识别出代码想要使⽤ Python 模块。Python 不会⾃动为你安装所有的模块,因为你可能不会使⽤其中⼤部分。当你想要使⽤⼀个模块时,你需要⾃⼰安装包含该模块的软件包。
要修复此错误,您需要安装 matplotlib。好消息是,Python 已经使安装新包变得很容易。转到 VS Code 右下角的终端,然后输入:
pip install matplotlib
提醒: 对于某些操作系统,您可能需要使用 pip3 而不是使用 pip。在 Windows 机器上,如果您按照我们的安装说明进行操作,我们建议使用 pip。在 Mac 或 Linux 机器上,我们建议使用 pip3。
当您运行此命令时,您会看到安装了一堆模块,包括 numpy(这段代码要使用的下一个模块)。 (matplotlib 需要自己的 Python 模块,因此它除了安装 matplotlib 本身外,还会安装您使用 matplotlib 所需的所有模块。)当您再次尝试运行代码时,您将得到一个类似于图 2.5 的图形。
在这个条形图中,我们可以看到 y 轴是通过码数,x 轴是球员的名字。球员按照码数从少到多排序(最少为 4,000 码)。诚然,这并不完美,因为缺少 y 轴标签,x 轴上的名字在底部被截断,但考虑到我们给 Copilot 的只是一个简短的提示,这已经相当令人印象深刻了。我们可以继续添加提示来改进图表的格式,但我们已经实现了本节的主要目标,即展示 Copilot 在帮助我们编写代码方面的强大能力,并对如何与 Copilot 进行交互有了一定的了解。
确实,在这一章中,我们取得了很大的成就!如果你已经完成了编程环境的设置,并跟着我们的示例一起操作,你应该感到自豪。你已经迈出了编写软件的重要一步!除了设置环境的细节,我们还编写了软件来解决我们的第一个问题。此外,你还观察到了使用 Copilot 编写软件的过程,这个过程从编写良好的提示开始,以帮助 Copilot 给出我们想要的代码。在本章的示例中,Copilot 给出了我们想要的代码,而我们不需要更改提示或调试代码来弄清楚为什么它不能正常工作。这是一个展示使用 AI 助手进行编程的强大之处很好的方法,但你经常会发现自己需要测试代码、更改提示,并且有时需要尝试理解代码为什么出错。这就是我们将在接下来的章节中更多了解的 AI 助手编程过程。
总结
- 您安装了 Python 和 VS Code,并设置了 Copilot,这样您就可以跟着书本一起工作,并开始自己编写代码了!
- VS Code 界面有文件管理、代码编辑和运行代码的区域,这些区域将在整本书中使用。
- 提示是我们告诉 Copilot 生成代码的方式,当写得仔细时,可以是创建软件的高效方法。
- 数据分析是一项常见的编程任务,CSV 文件是计算机存储数据以供处理的常见方式。
- Copilot 可能会生成需要您安装额外 Python 模块的代码。
- Copilot 是一个强大的工具,可以生成与大学生完成他们的第一门编程课程所产生的代码一样复杂(甚至更复杂)的代码。
本章涵盖了
- 在您的系统上设置 Python、VS Code 和 Copilot
- 引⼊ Copilot 设计流程
- Copilot 的价值在于基本的数据处理任务
本章将帮助您在自己的计算机上开始使用 Copilot,并熟悉与其的交互方式。在设置好Copilot 后,我们将要求您尽可能跟随我们的示例进行操作。实践是最好的学习方式,我们相信您可以在本书的剩余部分与我们一同学习。
一旦您设置好 Copilot,我们将通过一个有趣的示例来展示 Copilot 在解决标准任务中的强大能力,您将看到如何与 Copilot 进行交互,并了解我们如何在不编写任何实际代码的情况下编写软件。
2.1 设置您的计算机开始学习的时间
学习如何编写软件需要你实际去编写软件,而不仅仅是阅读相关内容。如果这是一本关于如何弹吉他的书,你会一直阅读而不尝试弹吉他吗?我们认为不会。只是阅读这本书而不跟着实践并亲自尝试,就像看着一名马拉松选手完成比赛后,以为自己已经准备好去跑一场马拉松一样。我们不再使用类比了,但是说真的,在我们继续之前,你需要安装并运行你的软件。
现在最让我们担心的是,我们刚刚达到了新手最容易失败的普遍阶段,即使那些渴望学习编程的人也是如此,而我们真的希望看到你成功。现在,你可能会想,“等等,真的吗?我们才刚刚开始。”是的,这正是关键所在。在 Leo 的流行的 Coursera 课程中学习 Java 编程,你能猜到大多数新学习者离开的时候吗?是课程结束时需要实时在地球上绘制地震标记的具有挑战性的作业吗?不是的。实际上,大多数学习者离开的是热身作业,他们必须设置他们的编程环境。因此,我们理解这可能是你面临的一个障碍。我们希望通过这个不那么明显的推动,我们可以帮助你实现你购买这本书时心中的所有目标。一切都始于安装软件。
2.1.1 您编程环境中软件的概述
为了轻松设置和使用 Copilot,我们将安装适用于新手和软件工程师的软件编辑工具。您将使用的工具包括 GitHub、Copilot、Python 和 Visual Studio Code。当然,如果您已经安装了所有这些工具,请跳转到第 2.5 节。
Github 账号
GitHub 是一个行业标准的开发、维护和存储软件的工具。然而,在本书中我们不会使用GitHub。我们只是注册 GitHub 账户是因为你需要一个账户来访问 Copilot。注册 GitHub 账户是免费的,但是在撰写本文时,Copilot 是收费的。如果你是学生,他们将免除这个费用。如果你不是学生,在撰写本文时,你可以获得 30 天的免费试用。
你可能会问为什么他们要收费,这有一个很好的答案。建立 GPT3 模型是很昂贵的(想象一下成千上万台电脑运行一年来建立模型),而且 GitHub 提供模型的预测也会产生成本(许多机器接收你的输入,通过模型运行它,并生成你的输出)。如果你还没有准备好使用 Copilot,你可以在注册后大约 25 天的时间内做一个日历提醒,如果那时你还没有使用 Copilot,就取消订阅。另一方面,如果你已经成功学会了如何使用 Copilot 编写软件,并且正在工作中或者只是作为一种爱好来提高你。
Python
真的,任何编程语言都可以用于这本书,但我们选择了 Python,因为它是世界上最流行的编程语言之一Python更容易阅读、理解和编写。对于这本书,Copilot 主要生成代码,而不是你自己。然而,你会想要阅读和理解 Copilot 生成的代码,而 Python 非常适合这样做。
Visual Studio Code (VS Code)
您可以使用任何文本编辑器进行编程。然而,如果您想要一个良好的编程环境,在这里您可以编写代码,轻松地从 Copilot 获得建议,并运行您的代码,我们推荐使用 VS Code 工具。VS Code 被初学者用于学习软件,并且受到学生们的喜爱[2]。它也被全球的专业软件工程师使用,这意味着您可以在完成本书后继续使用这个环境来工作和学习。
为了使 VS Code 适用于本书您需要安装一些扩展以便使用 Python 和 Copilot 进行工作,VS Code 的一个很棒的特点是很容易安装这些扩展。
2.2 设置您的系统
这是一个四步骤的过程。为了简化本章节,我们只提供了该过程的主要步骤。然而,更详细的说明可在以下位置找到。
- 访问 GitHub 的文档,网址为 https://docs.github.com/en/copilot/getting-started-with-ithub-copilot。
- 这本书的网站(https://www.manning.com/books/learn-ai-assisted-python-programming)提供了设置 PC 和 macOS 系统的详细说明。由于这些工具的网站在我们编写本书后可能会发生变化,我们建议您同时使用 GitHub 链接和书籍网站。
- 在在线书籍论坛(https://livebook.manning.com/book/learn-ai-assisted-python-programming/discussion)上,您可以寻求帮助并查看一系列常见问题的答案。
您需要完成的主要步骤如下:
- 设置您的 GitHub 账户并注册 Copilot
- 前往 https://github.com/signup 并注册一个 GitHub 账户。
- 进入 GitHub 的设置并启用 Copilot。这是你需要验证你是学生或者注册 30 天免费试用(在撰写本文时可用)的时候。
- 安装 Python
- 前往www.python.org/downloads/。
- 下载并安装最新版本的 Python(写作时为 3.11.1)。
- 安装 VS Code
- 前往https://code.visualstudio.com/download,选择适用于您操作系统的主要下载(例如,Windows 下载或 Mac下载)。
- 下载并安装最新版本的 VS Code。
- 安装以下 VS Code 扩展(详细信息请参见 https://code.visualstudio.com/docs/editor/extension-marketplace)。
- Python(由 Microsoft 提供)——请按照 https://code.visualstudio.com/docs/languages/python上的说明正确设置 Python 扩展(特别是选择正确的解释器)。
- GitHub Copilot(由 GitHub 开发)
- GitHub Copilot 实验室(由 GitHub 提供)——请注意,大部分书籍不需要使用Copilot 实验室,所以如果与写作时有所改变,请不要灰心。我们与 Copilot 实验室的交互也可以通过与 ChatGPT 或 Github Copilot Chat 进行交互来完成。
- GitHub Copilot Chat(由GitHub提供)——撰写时,GitHub Copilot Chat 尚未对所有人开放。本功能将在后面的章节中使用,但如果仍然无法使用,我们可以使用 ChatGPT 进行相同的对话。在使用此功能时,我们将提供更多详细信息。
我们知道这里的步骤很简要。如果遇到任何问题,我们鼓励您参考之前提到的资源,获取更详细的设置说明。
2.3 在 Visual Studio Code 中使⽤ Copilot
现在您已经设置好了系统,让我们来熟悉一下图2.1中显示的 VS Code 界面。(您可能需要点击左上角的资源管理器图标以获得相同的视图。)图2.1中标识了以下区域:
- 活动栏——最左边是活动栏,我们可以在这里打开文件夹(也称为目录)或安装扩展(就像您在前一节中安装 GitHub Copilot 扩展一样)。
- 侧边栏 - 侧边栏显示当前在活动栏中打开的内容。在图2.1中,活动栏选择了资源管理器,因此侧边栏显示当前文件夹中的文件。
- 编辑窗格 - 这些是我们用来创建软件的主要区域。编辑窗格中的编辑器类似于其他文本编辑器,您可以使用剪贴板编写、编辑、复制和粘贴文本。然而,它的特殊之处在于它被设计成与代码配合使用。正如我们将在下一个示例中看到的,您主要将在此窗口中通过要求 Copilot 生成代码,然后测试该代码来工作。
- 输出和终端面板-这是界面上用于查看代码输出或发生的任何错误的区域。它有问题、输出、调试控制台和终端标签。我们主要使用问题标签,可以看到代码中潜在的错误,以及终端标签,可以与 Python 进行交互并查看代码的输出。
我们在图 2.1 的右下角突出显示了 Copilot 的标志,因为如果您在前一节正确设置了 Copilot,您应该能看到这个符号(或类似的符号)。
2.3.1 设置您的⼯作⽂件夹
在 VS Code 的左侧活动栏顶部,您会找到资源管理器作为顶部图标。点击资源管理器后,应该会显示“未打开文件夹”。点击按钮打开文件夹并选择计算机上的一个文件夹(或创建一个新文件夹 - 我们喜欢文件夹名为 fun_with_Copilot)。一旦您打开了这个文件夹,您的工作区将是您打开的文件夹,这意味着您的代码和任何数据文件(比如我们将在本章后面使用的文件)都应该在那个文件夹中。
⽂件未找到或⽂件丢失错误
如果你收到⼀个说你缺少⽂件的错误,请放⼼:这些是每个⼈都会犯的错误。在编写软件时,它们可能会⾮常恼⼈。可能是你只是没有把⽂件放在你的⼯作⽂件夹中-这种情况很常⻅。通过将⽂件复制或移动到正确的⽂件夹中,这个问题很容易解决。然⽽,有时候,你会在⽂件夹中找到⽂件,但当你在 VS Code 中运⾏代码时,Python 似乎找不到它。如果这种情况发⽣在你身上(在写书时我们也遇到过!),请确保使⽤ VS Code 中的资源管理器打开包含代码和所需⽂件的⽂件夹(如图2.1中的侧边栏所示)。
2.3.2 检查您的设置是否正常⼯作
让我们检查一下我们是否正确设置了一切,并且 Copilot 正常工作。要做到这一点,首先创建一个新文件来保存我们的程序。您可以通过转到文件 > 新建文件(图2.2),然后选择 Python 文件(图2.3)来完成这个操作。
创建完成后,我们希望确保已保存文件。转到文件 > 另存为,让我们将此文件命名为first_Copilot_program.py。
接下来,在文本编辑器中输入:
# output "Hello Copilot" to the screen
- 1
我们写的提示和代码将使用粗体字来区分我们所写的内容和 Copilot 可能给出的代码和注释。开头的 # 符号很重要(你应该在你输入的内容中包含它)。它表示你所写的是一个注释(根据你的 VS Code 颜色方案,它的颜色会与我们即将生成的代码不同)。注释不是代码:计算机执行
代码而不执行注释。程序员使用注释来提供对代码所做的人类可读的摘要,以帮助其他软件工程师阅读代码。如今,它的作用已扩展到提示 Copilot。在写注释之后(有时甚至在写注释时),Copilot 会尝试给出建议。你可以将其视为更复杂的自动完成,就像当你在搜索引擎中输入“New York T”时,它会自动完成为“New York Times”。
的开头。稍等片刻,您应该会看到一些内容出现。在被接受之前,Copilot 的建议以浅灰色斜体显示。如果您还没有收到建议,可能需要再次按 Enter 键来触发 Copilot 提供代码的建议。以下是我们的情况:
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
如果您仍然没有看到 Copilot 的建议,请尝试按下 Ctrl-Enter(按住 Ctrl 键同时按下 Enter 键)。当您按下 Ctrl-Enter 时,屏幕右侧应该会出现一个新窗口。该窗口将位于您的编辑器窗口右侧,并被称为 GitHub Copilot。如果该窗口没有出现,可能是您的设置有问题,请前往书籍网站确认您是否正确执行了所有步骤,或者寻找(或请求)帮助。
如果您看到了 Copilot 的建议,请按 Tab 键接受 Copilot 的建议。一旦您这样做,之前以浅灰色斜体显示的建议现在应该以标准字体显示:
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
您可能会看到与我们不同的代码。我们提到这一点是因为有时 Copilot 在这里的代码上会犯一个小错误,可能会给您类似于这样的代码:
print "Hello Copilot"
- 1
你可能会认为这个细微的差别(在“Hello Copilot”周围没有括号)并不重要,但实际上是重要的。在 Python 3 之前,这是 print 语句的正确语法,而当 Python 3 被引入时,它切换到了带有括号的代码。由于我们正在运行 Python 3,你需要在代码中加上括号才能使其正常工作。你可能会问为什么 Copilot 会犯这个错误:问题在于 Copilot 在训练过程中使用了一些旧的 Python 代码。如果这看起来很烦人,我们同意。但这是 Copilot 之前的初学者程序员所经历的挫折的一种暗示。Copilot 建议的大部分语法都是正确的。但如果你是一个从头开始编写代码的初学者,缺少括号或者某个地方缺少冒号可能会浪费你很多时间。
现在我们有了正确的代码,
# output "Hello Copilot" to the screen
print("Hello Copilot")
- 1
- 2
你可能猜到了,它会将“Hello Copilot”打印到屏幕上,我们应该测试一下。首先,你需要保存你的文件,方法是点击文件 > 保存。
在运⾏之前,请务必保存您的⽂件。我们很尴尬地承认,我们曾花费⼤量时间来修复本来正确但未保存的代码。
要运行您的程序,请转到文本编辑器的右上角,然后单击图2.1中显示的运行代码图标。按下图标后,在底部的终端部分,您应该看到类似于以下内容的内容:
> & C:/Users/YOURNAME/AppData/Local/Programs/Python/Python311/Python.exe
c:/Users/YOURNAME/Copilot-book/first_Copilot_program.py
Hello Copilot
- 1
- 2
- 3
- 4
- 5
以 > 开头的顶行是计算机运行代码的命令,它只是告诉计算机使用 Python 运行你的first_Copilot_program.py。第二行是运行命令后的输出,它显示"Hello Copilot",这正是我们希望看到的。
恭喜!你已经写了你的第一个程序!我们现在知道你的编程环境已经正确设置好了,我们可以继续进行我们的第一个编程任务了。但在此之前,我们想要讲解一些我们在使用 Copilot 时遇到的常见问题的处理技巧,这样在你进行下一个示例时就可以使用这些技巧了。
2.4 解决常⻅的 Copilot 挑战
在你使用 Copilot 的经验中,现在谈论 Copilot 的常见挑战可能还为时过早,但你在编写第一个程序时可能已经遇到了一些挑战。在接下来的示例和下一章中,你肯定会遇到其中一些问题,所以我们现在想把这些问题给你。
在我们使用 Copilot 的过程中,我们遇到了一些常见的挑战。随着 Copilot 的改进,这些挑战可能会减少,但在撰写本文时,它们仍然是问题。尽管表 2.1 中的挑战并不详尽,但我们希望我们关于如何应对这些常见挑战的提示能帮助您快速上手。我们将在本书的网站上保持一个持续更新的列表,所以如果您觉得我们漏掉了什么,请随时在论坛上与我们联系!
2.5 我们的第⼀个编程问题
这一部分的目标有两个:(1)让您了解与 Copilot 互动的工作流程,(2)让您通过看到 Copilot 轻松解决一个复杂任务而对其强大能力有所认识。
在下一章中,我们将更详细地讨论使用 Copilot 的工作流程,但通常在使用 Copilot 编写代码时,您将按照以下步骤进行操作:
- 使用注释(#)或文档字符串(“”") 向 Copilot 编写提示。
- 让 Copilot 为您生成代码。
- 通过阅读和测试来检查代码是否正确。
- 如果它有效,请进行下一步,以完成您希望它完成的事情。
- 如果不起作用,从 Copilot 中删除代码,回到第1步并修改提示(并查看表 2.1 中的建议)。
因为你刚刚开始使用 Copilot,我们对向你展示这样一个庞大的示例持谨慎态度,但我们相信你会珍视看到安装了 Copilot 后它的强大之处。因此,我们希望你尽力跟上,以便自己体验使用Copilot 的感觉,但如果你遇到困难,只需阅读并在下一章节中继续使用 VS Code 与 Copilot 一起工作。后面的章节将更详细地解释使用 Copilot 的过程。
此外,Copilot 将在本节中生成大量代码,我们不希望您在本书的后期之前理解这些代码。我们提供代码仅供您查看 Copilot 给我们的内容,但不必试图在本章中理解代码。开始之前,让我们创建一个新文件。如果你还没有打开 VS Code,请打开它。然后创建一个新的 Python 文件,并将其保存为 nfl_stats.py。
2.5.1 展示 Copilot 在数据处理任务中的价值
我们想从一些基本的数据处理开始,因为这是你们许多人在个人或职业生活中可能做过的事情。为了找到数据集,我们去了一个很棒的网站叫做 Kaggle [4],上面有大量免费可用的数据集。其中许多包括了重要的数据,比如不同国家的健康统计数据,帮助追踪疾病传播的信息等等。我们不会使用那些数据,因为我们希望在我们的第一个程序中使用一些更轻松的东西。由于我们两个都是美式足球的粉丝,我们觉得应该使用美国国家橄榄球联盟(NFL)的进攻统计数据库。
让我们从 www.kaggle.com/datasets/dtrade84/nfl-offensive-stats-2019-2022 下载数据集,开始吧。
要下载数据集,您需要注册一个 Kaggle 账户。如果您不想创建账户,只需阅读本节内容,不使用 VS Code 和 Copilot 自动生成代码即可。下载完成后,您可能需要使用计算机上的默认 zip解压工具解压 zip 文件。将数据集文件从 zip 文件中复制到您在 VS Code 中打开的当前文件夹(即您在资源管理器中打开的文件夹)。(如果您使用的是 Mac,并且文件保存为 .numbers 文件,则需要使用“文件”>“导出”将文件保存为当前工作目录中的 CSV 文件。)该数据集包含 2019 年至 2022 年的 NFL 信息(图2.4)。
nfl_offensive_stats.csv 文件是一种称为逗号分隔值文本文件的东西(见图2.4中的部分文件)。这是一种存储数据的标准格式。顶部有一个标题行,解释了每一列的内容。我们(或计算机)知道列之间的边界是使用逗号分隔单元格。还请注意,每一行都放在自己的行上。好消息是:Python 有一堆用于读取 CSV 文件的工具。
第⼀步: 亚伦-罗杰斯在 2019-2022 年的传球码数是多少?
让我们首先探索一下这个文件中存储了什么。要预览文件中的内容,您可以在 Kaggle 网页上查看这些统计数据的“详细信息”,在 VS Code 中打开它,或者在类似 Microsoft Excel 的电子表格软件中打开它。(如果您使用 Excel 打开它,请确保不要保存该文件。我们需要将文件保留为 .csv 格式。)无论您选择以哪种方式打开它,这是标题(顶部)行的开头(也显示在图 2.4 中):
game_id, player_id, position, player, team, pass_cmp, pass_att, pass_yds, ...
- 1
有更多的列,但这些列已经包含了我们执行第一个任务所需的所有内容。我们现在知道有一个列是关于球员的,还有一个列是关于传球码数的。亚伦·罗杰斯是一个球员,在他参加的每场比赛中都会获得传球码数。但是从 2019 年到 2022 年,他总共有多少传球码数呢?直接查看文件并不容易回答这个问题。所以,我们希望计算机能够帮助我们简化这个过程!
我们希望它总结出所有 Aaron Rodgers 是球员的比赛行中的传球码数(pass_yds)。目前,我们只要求数据库中的所有码数,即使它涵盖了多个赛季。如果需要的话,我们以后可以更改这个。这个问题可能是一个很好的问题,可以交给在标准大学级入门编程课程的第四周学习编程的程序员,但我们有 Copilot!所以,我们不需要从头学习如何编写这段代码,我们只需要让Copilot 为我们生成它。为了实现这一点,我们需要在请求中非常具体,以确保 Copilot 知道我们在请求什么。我们只会要求它执行少量的工作,然后重新提示它执行下一步。稍后我们将讨论如何编写好的提示,但现在,只需将这段文字放在您的新文件的顶部即可。
"""
open the csv file called "nfl_offensive_stats.csv" and read in
the csv data from the file
"""
- 1
- 2
- 3
- 4
顶部和底部的 “”" 括起来的是一个叫做文档字符串的东西。文档字符串是一种注释的替代方式(类似于以 # 开头的文本)。它们通常用于描述函数(有关函数的详细信息,请参见第 3 章),但在这个示例中,我们使用它们来避免 Copilot 不断生成注释(请参见表 2.1 中的仅注释问题)。根据这个提示,Copilot 应该开始生成代码。对我们来说,它生成了这个代码块:
import csv
with open('nfl_offensive_stats.csv', 'r') as f:
reader = csv.reader(f)
nfl_data = list(reader)
- 1
- 2
- 3
- 4
首先,为了阅读本书的目的,我们想提醒您,提示信息的显示方式与 Copilot 生成的不同。这是有意为之,以便您可以区分我们所写的内容(以及您应该写的内容)和 Copilot 所写的内容。
其次,Copilot 生成的代码相当合理。我们不希望您在本书的这一点上理解代码,但您可能会看到我们想要打开的文件的名称以及一些关于打开和读取文件的代码。在本书的后面,我们将学习如何阅读代码。现在,只需继续跟随即可。
现在我们已经从文件中获取了数据,我们将给它一个新的提示,要求它计算出这个数据集中Aaron Rodgers 的所有传球码数的总和。因为计算机不知道什么是足球,也不知道 Aaron Rodgers 是个四分卫之类的具体信息,所以我们的提示会非常具体。在本书的过程中,我们将教你如何编写这样的提示。以下是新的提示:
"""
In the data we just read in, the fourth column is the player
and the 8th column is the passing yards. Get the sum of
yards from column 8 where the 4th column value is
"Aaron Rodgers"
"""
- 1
- 2
- 3
- 4
- 5
- 6
请注意,我们告诉计算机哪些列是玩家的,哪些是传球码数的。这是为了告诉计算机如何解释数据。另外,请注意我们明确表示只想要求和码数,前提是球员的名字是 Aaron Rodgers。在本书中,随着我们的进展,我们将教你如何编写类似的提示。根据这个提示,Copilot 生成了以下代码:
passing_yards = 0
for row in nfl_data:
if row[3] == 'Aaron Rodgers':
passing_yards += int(row[7])
print(passing_yards)
- 1
- 2
- 3
- 4
- 5
提醒:Copilot 是⾮确定性的
请记住,Copilot 是⾮确定性的,所以 Copilot 给你的结果可能与我们得到的结果不⼀样。这将是本书剩下部分的⼀个挑战:如果你得到了错误的结果,⽽我们得到了正确的结果,你该怎么办?我们相当有信⼼ Copilot 会在这⾥给你⼀个正确的答案,但如果你从 Copilot 那⾥得到了错误的答案,继续阅读本节的剩余部分,⽽不是在 VS Code 中与 Copilot⼀ 起⼯作。当 Copilot 给你错误的答案时,我们绝对会给你修复代码所需的所有⼯具,但这个技能将在本书的剩余部分中教授,所以我们不希望你现在陷⼊困境。
当我们运行这段代码(回想一下如何从图 2.1 中运行代码),我们得到的结果是 13852,这是正确的答案。(我们仔细核对了答案,但如果你对足球很熟悉,你可能可以用估计值来判断这个数字是否合理。四分卫每个赛季传球码数为 3,000-5,500 码,而这是三个赛季的数据,所以在三个赛季中累计 13,852 码似乎是一个高水平四分卫的合理范围。)特别有趣的是,我们计划给 Copilot 一个第三个提示,让它打印结果,但 Copilot 猜到了我们想要做的事情,并自己完成了。
我们希望你从这个例子(以及本章的其他内容)中得到的是:
- Copilot 是一个强大的工具。我们没有编写任何代码,但我们能够让 Copilot 生成执行基本数据分析所需的代码。对于使用过电子表格的读者来说,你可能可以想到一种使用类似 Excel 的电子表格应用程序来完成这个任务的方法,但这可能不像编写这样的代码那么容易。即使你以前没有使用过电子表格,你也必须承认,编写基本的、可读的提示就能产生正确的代码和输出,这真是令人惊讶。
- 将问题分解成小任务是重要的。对于这个例子,我们尝试使用一个大的提示(未显示)来编写这段代码,或者将其分解为两个较小的任务。较大的提示几乎与我们使用的两个较小的任务的文本完全相同,只是作为一个单独的提示。我们发现,Copilot 通常可以给出较大提示的正确答案,但有时会出错。这在我们将要展示的下一个例子中尤为明显。然而,将问题分解成较小的任务显著增加了 Copilot 生成正确代码的可能性。在本书的剩余部分中,我们将看到如何将较大的问题分解成较小的任务,因为这是您需要的最重要的技能之一。实际上,下一章将帮助您开始理解给 Copilot 合理任务的方法。
- 我们仍然需要在一定程度上理解代码。这是因为有几个原因。其中一个原因是,编写良好的提示需要对计算机知道和不知道的基本了解。我们不能只给 Copilot 一个提示,说:“给我 Aaron Rodgers 的传球码数。”Copilot 可能无法找出数据存储在哪里,数据的格式是什么,哪些列对应于球员和传球码数,或者 Aaron Rodgers 是一名球员。我们必须向 Copilot 明确说明这一点才能取得成功。另一个原因与确定Copilot 生成的代码是否合理有关。当我们两个人阅读 Copilot 的回答时,我们知道如何阅读代码,因此可以确定 Copilot 生成的代码是否合理。你需要在一定程度上能够做到这一点,这就是为什么第 4 章和第 5 章专门讲解阅读代码的原因。
- 测试很重要。当程序员谈论测试时,他们指的是确保他们的代码在可能出现意外情况下也能正常工作的实践。我们在这个部分没有花太多时间,只是检查 Copilot 的答案是否在一个数据集上是合理的,但一般来说,我们需要花更多时间进行测试,因为这是代码编写过程中的关键部分。可能不用说,但代码中的错误范围从令人尴尬的(如果你告诉你的铁杆 NFL 球迷朋友一个球员的传球码数错误)到危险的(如果汽车中的软件行为不正确)到昂贵的(如果企业基于错误的分析做出决策)。即使你已经学会了如何阅读代码,我们也有第一手经验,即使代码看起来正确,它可能并不正确!为了解决这个问题,我们必须对 Copilot 创建的每一个代码片段进行测试,以确保它能够按照预期工作。我们将在后面的章节中学习如何对 Copilot 的代码进行严格测试。
我们必须测试每一个示范 Copilot 的能力,我们将继续这个例子。请随意跟着写提示并在 Copilot 中运行代码,或者只是阅读。
第⼆步:所有四分卫在这段时间的表现如何?
了解阿伦·罗杰斯的表现如何是有趣的。但更有意义的一步是将他的数据与同一时间段的其他四分卫进行比较。我们只想与其他四分卫进行比较,因为他们是负责传球的球员。当然,跑卫可能每个赛季只传一次球,当他们这样做时通常很有趣,但这并不是他们的工作。为了只包括四分卫,我们需要回到数据。第三列是位置,QB 代表四分卫。因此,让我们删除 Copilot 给我们的所有代码(在我们最初的注释结束后的所有内容)并重新开始。我们不会像之前那样展示每个步骤。相反,以下清单是与 Copilot 的整个交互的结果,我们的提示与它给我们的代码分开突出显示。
请注意,我们给 Copilot 三个提示。第一个是处理输入数据,第二个是处理数据,第三个是输出响应。在编程任务中,这种输入数据、处理数据、提供输出的循环非常常见。
从 Copilot 的结果来看,我们必须指出我们教授编程已经多年了,这个结果相当令人印象深刻。我们可能会要求学生在我们的大学级课程的期末考试中解决类似的问题,我们怀疑不到一半的学生能正确完成。不过不深入细节,Copilot 选择了一种很好的存储数据的方式,使用了一个字典(不是普通的英语字典,而是 Python 中存储数据的一种方式),这在这里是一个很好的选择,并且使用了一种巧妙的排序数据的方式来帮助显示结果。
考虑到结果,如果你运行代码,输出的前五行是:
Patrick Mahomes 16132
Tom Brady 15876
Aaron Rodgers 13852
Josh Allen 13758
Derek Carr 13271
- 1
- 2
- 3
- 4
- 5
如果你关注足球,这些结果对你来说应该不会感到意外。为了看看 Copilot 能够如何适应我们的愿望,让我们试着做一个小的改变。假设由于汤姆·布雷迪已经被公认为有史以来最好的四分卫之一,你宁愿在这个比较中省略他。
为了进行这个更改,我们只需要修改底部的提示。转到代码中指定的位置。
"""
print the sum of the passing yards sorted by sum
of passing yards in descending order
"""
for player in sorted(passing_yards, key=passing_yards.get, reverse=True):
print(player, passing_yards[player])
- 1
- 2
- 3
- 4
- 5
- 6
删除代码,只保留注释,并在文档字符串中添加另一行。
"""
print the sum of the passing yards sorted by sum
of passing yards in descending order
Do not include Tom Brady because he wins too much
"""
- 1
- 2
- 3
- 4
- 5
Copilot 随后建议我们:
for player in sorted(passing_yards, key=passing_yards.get, reverse=True):
if player != "Tom Brady":
print(player, passing_yards[player])
- 1
- 2
- 3
这正是我们希望在代码中改变的内容。(感谢汤姆·布雷迪在这个例子中的配合。)在打印结果的时候,代码排除了所有关于汤姆·布雷迪的数据。当我们保存文件并再次运行时,现在的前五行是:
Patrick Mahomes 16132
Aaron Rodgers 13852
Josh Allen 13758
Derek Carr 13271
Matt Ryan 13015
- 1
- 2
- 3
- 4
- 5
第三步:让我们将这些数据绘制成图,以便更好地进行比较
让我们通过要求 Copilot 更进一步来强调 Copilot 是一个强大的工具。所有四分卫统计数据的打印输出可能对某些目的是有用的分析。但是,以可视化图形的方式呈现这些信息可能是更好的方式。我们能否要求 Copilot 绘制它呢?假设我们只关心表现最好的四分卫,所以我们决定将超过 4,000 码作为四分卫在此时间窗口内需要投掷的最低码数的任意限制,以便包括在我们的图表中。诚然,要求 Copilot 绘制数据可能会引入一些新的挑战,因为它涉及超越纯文本,但让我们试一试。
在我们刚刚编写的代码末尾,添加以下注释:
"""
plot the players by their number of passing yards only for
players with more than 4000 passing yards
"""
- 1
- 2
- 3
- 4
以下清单显示了 Copilot 根据我们的提示给出的代码。
我们多次给 Copilot 提供了这个提示,并且它始终生成了一个合理的图表,但是每次的代码和图表都有所不同。这只是一个代表性的结果,在这个结果中,代码明显比你在本章早些时候看到的代码更高级。事实上,我们需要更深入地理解代码才能够详细地解读它,所以我们在本书的这一点上将跳过任何尝试阅读或解释代码的尝试。我们可以告诉你,在高层次上,它正确地导入了一个用于绘制图表的 Python 模块(称为 matplotlib),在中间使用了一个相当聪明的数据处理的 Python 模块(称为 numpy),甚至还有能力旋转选手的名字,以便它们可以作为 x轴标签打印出来。
如果你运行这段代码,可能会遇到一个问题。因为 Copilot 是从 GitHub 上的代码中学习的,它不知道你个人机器上安装了哪些 Python 模块。编写 Copilot 学习代码的程序员可能已经安装了matplotlib,并且 matplotlib 是在这里使用的正确模块,但是 matplotlib 不是 Python 的默认安装模块。如果你没有安装它,当你尝试运行代码时会出现找不到 matplotlib 模块的错误。
Python 模块
Python 模块扩展了编程语⾔的功能。Python 中有许多模块,它们可以帮助你做任何事情,从数据分析到创建⽹站再到编写视频游戏。通过代码中的 import 语句,你可以识别出代码想要使⽤ Python 模块。Python 不会⾃动为你安装所有的模块,因为你可能不会使⽤其中⼤部分。当你想要使⽤⼀个模块时,你需要⾃⼰安装包含该模块的软件包。
要修复此错误,您需要安装 matplotlib。好消息是,Python 已经使安装新包变得很容易。转到 VS Code 右下角的终端,然后输入:
pip install matplotlib
提醒: 对于某些操作系统,您可能需要使用 pip3 而不是使用 pip。在 Windows 机器上,如果您按照我们的安装说明进行操作,我们建议使用 pip。在 Mac 或 Linux 机器上,我们建议使用 pip3。
当您运行此命令时,您会看到安装了一堆模块,包括 numpy(这段代码要使用的下一个模块)。 (matplotlib 需要自己的 Python 模块,因此它除了安装 matplotlib 本身外,还会安装您使用 matplotlib 所需的所有模块。)当您再次尝试运行代码时,您将得到一个类似于图 2.5 的图形。
在这个条形图中,我们可以看到 y 轴是通过码数,x 轴是球员的名字。球员按照码数从少到多排序(最少为 4,000 码)。诚然,这并不完美,因为缺少 y 轴标签,x 轴上的名字在底部被截断,但考虑到我们给 Copilot 的只是一个简短的提示,这已经相当令人印象深刻了。我们可以继续添加提示来改进图表的格式,但我们已经实现了本节的主要目标,即展示 Copilot 在帮助我们编写代码方面的强大能力,并对如何与 Copilot 进行交互有了一定的了解。
确实,在这一章中,我们取得了很大的成就!如果你已经完成了编程环境的设置,并跟着我们的示例一起操作,你应该感到自豪。你已经迈出了编写软件的重要一步!除了设置环境的细节,我们还编写了软件来解决我们的第一个问题。此外,你还观察到了使用 Copilot 编写软件的过程,这个过程从编写良好的提示开始,以帮助 Copilot 给出我们想要的代码。在本章的示例中,Copilot 给出了我们想要的代码,而我们不需要更改提示或调试代码来弄清楚为什么它不能正常工作。这是一个展示使用 AI 助手进行编程的强大之处很好的方法,但你经常会发现自己需要测试代码、更改提示,并且有时需要尝试理解代码为什么出错。这就是我们将在接下来的章节中更多了解的 AI 助手编程过程。
总结
- 您安装了 Python 和 VS Code,并设置了 Copilot,这样您就可以跟着书本一起工作,并开始自己编写代码了!
- VS Code 界面有文件管理、代码编辑和运行代码的区域,这些区域将在整本书中使用。
- 提示是我们告诉 Copilot 生成代码的方式,当写得仔细时,可以是创建软件的高效方法。
- 数据分析是一项常见的编程任务,CSV 文件是计算机存储数据以供处理的常见方式。
- Copilot 可能会生成需要您安装额外 Python 模块的代码。
- Copilot 是一个强大的工具,可以生成与大学生完成他们的第一门编程课程所产生的代码一样复杂(甚至更复杂)的代码。
评论记录:
回复评论: