Python How-To1-制定务实的学习策略

1 制定务实的学习策略

本章包括

  • 务实意味着什么
  • Python能做什么
  • 何时应该考虑其他语言
  • 你能从本书中学到什么

Python是一种了不起的编程语言。其开源、通用、平台独立的特性使其拥有了一个庞大的开发者社区,以及一个包括数以万计的免费库在内的令人难以置信的生态系统,这些库可用于Web开发、机器学习(ML)、数据科学和许多其他领域。我希望我们都有这样的信念:知道如何用Python编写代码固然很好,但知道如何编写真正高效、安全和可维护的应用程序会给你带来巨大的优势。本书将帮助你从Python初学者成为自信的程序员。

在Python生态系统中,我们使用特定领域的Python工具(如Web框架和ML库)来完成工作中的各种任务。要有效地使用这些工具并非易事,因为它要求我们相当熟悉Python的基本技能,如处理文本、处理结构化数据、创建控制流和处理文件。Python程序员可以编写不同的解决方案来处理相同的任务。在这些解决方案中,通常有一种会比其他解决方案更好,因为它可能更简洁、更易读或更高效,我们将其统称为Pythonic:一种所有Python程序员都努力习得的惯用编码风格。本书讲述了如何编写Pythonic代码来完成专业编程任务。

Python发展得如此之好,有如此之多的特性需要学习,要想从本书中学到所有知识是不可能的,也是不明智的。相反,我将采取务实的方法来定义我在本书中要教授的内容:你在项目中最有可能用到的基本技能。同样重要的是,我会经常提到如何在考虑可读性和可维护性的前提下使用这些技能,这样你就能养成良好的编码习惯,我敢打赌你和你的队友都会非常欣赏这种习惯。

1.1 以成为务实的程序员为目标

我们编写代码是有目的的,比如建立网站、训练ML模型或分析数据。无论我们的目的是什么,我们都要务实;我们写代码是为了解决实际问题。因此,在我们从头开始学习编码或在职业生涯中期提高编码技能之前,我们应该明确自己的意图。不过,即使您在现阶段还不确定自己想用Python实现什么目标,好在Python的核心特性是通用知识。掌握核心特性后,您就可以将它们应用到任何特定领域的Python工具中。

要想成为务实的程序员,就应该专注于最有用的技术。然而,掌握这些技巧只是你人生旅途中的第一个里程碑;编写可读的代码才是编码的长远目标,它不仅能运行,还能提高可维护性。

1.1.1 专注于编写可读的Python代码

作为一名开发人员,我对可读性非常着迷。写代码就像说一门真实世界的语言。当我们说一门语言时,难道不希望别人能听懂吗?如果您的回答是肯定的,那么您可能会同意我的观点,即我们也希望别人能理解我们的代码。至于我们代码的读者是否具备必要的专业技术知识来理解我们的代码,这不是我们所能控制的。我们可以控制的是如何编写代码--如何使代码具有可读性。考虑一些简单的问题:

  • 变量是否正确命名,以表明它们是什么?如果你的代码中充满了名为var0、temp_var或x 的变量,那么没有人会欣赏你的代码。

  • 函数是否有正确的名字来说明它们的作用?如果看到名为do_data(data)或run_step1()的函数,人们就会一头雾水。

  • 是否以一致的方式组织各文件中的代码?人们希望同一类型的不同文件使用相似的布局。例如,您是否将导入语句放在文件的顶部?- 项目文件夹是否按特定文件存放在所需的文件夹中?当项目范围扩大时,应为相关文件创建单独的文件夹。

1.1.2 在编写代码之前就考虑可维护性

在极少数情况下,我们会编写一次性使用的代码。当我们编写脚本时,我们几乎总是成功地说服自己,我们永远不会再使用这个脚本;因此,我们不会在意创建好的变量名、正确地布局代码、重构函数和数据模型,更不用说确保不留注释(或过时的注释)了。但有多少次,我们不得不在下周甚至第二天使用相同的脚本?我们中的大多数人可能都遇到过这种情况。

上一段描述了一个小型的可维护性问题。在这种情况下,它只会在短时间内影响你自己的工作效率。然而,如果你是在团队环境中工作,那么由个人贡献者带来的问题就会累积成大规模的可维护性问题。团队成员无法遵循相同的变量、函数和文件命名规则。无数注释过的代码依然存在。过时的注释随处可见。

要想在自己项目的后期阶段解决可维护性问题,就应该在学习代码时建立良好的心态。从长远来看,以下几个问题可以帮助你建立良好的"可维护性"思维:

你的代码中是否没有过时的注释和被注释的代码?如果答案是否定的,请更新或删除它们!这些情况比没有注释的情况更糟糕,因为它们可能会提供相互矛盾的信息。

代码中是否存在大量重复?如果答案是肯定的,则可能需要重构。编码的经验法则是DRY(不要重复)。通过删除重复代码,您将只处理一个共享部分,这比重复部分的修改更不容易出现错误。

您使用Git等版本控制工具吗?如果没有,那就看看集成开发环境(IDE)的扩展或插件。对于Python,常见的集成开发环境包括 Spyder IDE、 PyCharm 和 Visual Studio Code。许多集成开发环境都集成了版本控制工具,使版本管理变得更加容易。

要成为务实的 Python 程序员,就必须接受这类可维护性培训。毕竟,几乎所有Python工具都是开源的,而且发展迅速。因此,可维护性应该是任何可行项目的基石。在本书中,我们将在适当的地方介绍如何在日常的Python代码编写中实施可维护性实践。请记住,可读性是持续可维护性的关键。当您专注于编写可读代码时,您代码库的可维护性也会随之提高。

1.2 Python的长处

  • 跨平台

  • 表现力和可读性

  • 快速建立原型

  • 独立

  • 开源、免费、可扩展

下表总结了一些著名的领域及其相应的Python工具。


我们会用到几个密切相关的术语,包括框架、库、包和模块。不同的语言可能会使用其中的一些术语,其含义也略有不同。在这里,我将讨论大多数Python程序员都接受的这些术语的含义。

框架的范围最大。框架提供了一套完整的功能,其目的是在高层次上完成一项专门的工作,例如网络开发。

库是框架的构件,由包组成。库提供的功能无需用户担心底层软件包。

软件包提供特定的功能。更具体地说,软件包捆绑模块,每个模块由一组密切相关的数据结构和函数组成,它们被放在一个文件中,如 .py 文件。

1.3 Python的短处

许多事情Python做不了,或者至少与其他工具相比做得不好。尽管有些人正在努力推动Python的发展,使我们能将它用于其他用途,但在现阶段,我们应该知道它在两个重要领域的局限性:

  • 移动应用程序

尽管有Kivy和BeeWare等尝试,但一直没有开发智能手机应用程序的优秀Python框架。

  • 底层开发

在开发直接与硬件交互的软件时,Python不是最佳选择。由于Python的解释性质,其整体执行速度不够快,不适合开发需要即时响应的底层软件,如设备驱动程序。如果您对开发底层软件感兴趣,就应该考虑使用其他更擅长与硬件接口的语言。例如C和C++就是开发设备驱动程序的不错选择。

1.4 你将在本书中学到的知识

我们已经简单介绍了实用主义程序员的含义。现在我们来谈谈如何实现这一目标。在编写程序的过程中,你不可避免地会遇到新的编程挑战。在本书中,我们为你确定了最有可能遇到的任务所需的编程技巧。

参考资料

1.4.1 关注与领域无关的知识

所有事物都以某种方式直接或间接地联系在一起,Python知识也是如此。我们可以将Python特性及其应用概念化为三个相关的实体。

对于我们大多数人来说,学习Python的目的是应用Python解决我们工作领域中的问题,这就需要特定领域的Python知识,例如网络开发和数据科学。作为完成工作的前提条件,你的知识库应该包含基本的Python功能,更确切地说,是与领域无关的Python知识。即使你的工作角色发生转换或演变,你也可以将基本的Python知识应用到新的岗位上。

在本书中,你将重点学习与领域无关的Python知识。为了便于学习,我们可以将独立于领域的Python·知识定义为两个组成部分:基础和高级。

对于基础知识,我们应该了解常见的数据结构及其操作。我们还需要知道如何评估条件以构建if...else...语句。当我们重复执行工作时,可以利用for循环和while循环。为了重复使用代码块,我们可以将它们重构为函数和类。掌握这些基础知识就足以编写有用的Python代码来完成工作任务。如果你掌握了大部分基础知识,就可以学习高级技能了。

高级技能能让您编写出更高效的代码,并充分利用Python的多功能特性。让我们看一个简单的例子来感受 Python 的多功能性。当我们使用for循环遍历一个list对象时,经常需要在项目旁边显示每个项目的位置,例如

prime_numbers = [2, 3, 5]
 
# desired output:
Prime Number #1: 2
Prime Number #2: 3
Prime Number #3: 5

如果只使用基本特征,我们可以得出以下解决方案。在该解决方案中,我们创建了一个范围对象,允许检索基于 0 的索引以生成位置信息。对于输出,我们使用字符串连接:

for num_i in range(len(prime_numbers)):
    num_pos = num_i + 1
    num = prime_numbers[num_i]
    print("Prime Number #" + str(num_pos) + ": " + str(num))

不过,读完本书后,你将成为一个更有经验的Python用户,应该能够生成更简洁、更Pythonic的下列解决方案:

for num_pos, num in enumerate(prime_numbers, start=1):
    print(f "Prime Number #{num_pos}: {num}")

上述解决方案涉及三种技术:通过元组拆包获得num_pos和num,创建enumerate对象,以及使用f-strings格式化输出。我不会在这里展开对这些技术的讨论,因为它们将在各自的章节中涉及。不过,这个例子只是向你展示本书的内容--如何使用各种技术来生成Pythonic解。

除了这些技术,您还将学习和应用高级函数概念,例如装饰器和闭包。当你定义类时,你会知道如何让它们协同工作,从而最大限度地减少代码量,降低出现bug的可能性。当你的程序完成后,你将知道如何记录和测试你的代码,使其为生产做好准备。

本书的主要内容是综合与领域无关的Python知识。你不仅能学到实用的高级功能,还能学到基本的Python功能和基本的计算机编程概念。

1.4.2 通过synthesis解决问题

初学者经常遇到的一个难题是,他们似乎知道各种技术,但不知道如何以及何时使用它们来解决问题。对于我们在本书中讨论的每种技术,我们都会向你展示它是如何独立工作的,同时也会向你展示它是如何与其他技术相结合的。我们希望你能开始明白,所有不同的部分是如何组成无穷无尽的新程序的。

1.4.3 在上下文中学习技能

正如我们前面提到的,本书的重点是学习建立在独立于领域的Python 知识之上的技能。与领域无关意味着您可以将本书中涉及的技能应用到您想使用Python的任何领域。然而,没有实例几乎不可能学到任何东西。我们将通过一个正在进行的项目来展示本书中的大多数技术,从而为讨论特定技能提供一个连贯的上下文。如果你熟悉某项技能,可以跳到本节的讨论部分,我将在其中讨论所涉及技能的一些关键方面。

作为提示,通用项目是一个任务管理网络应用程序。在这个应用程序中,你可以管理任务,包括添加、编辑和删除任务--所有这些都将用纯Python来实现,比如数据模型、函数、类,以及你能想到的应用程序可能拥有的其他任何东西。今后,需要注意的重要一点是,本书的目标并不是让你获得一个完美、闪亮的应用程序。相反,您希望在创建Web应用程序的过程中学习到所有基本的Python技术,这样您就可以在自己的工作项目中应用与领域无关的知识。

posted @ 2023-08-22 07:27  磁石空杯  阅读(83)  评论(0编辑  收藏  举报