Python 高级用法

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将学习如何以高级方式使用 Python 来解决常见的编码问题。我们将遵循两种方法——基本方法和高级方法。

此处提出的所有编码问题均基于 Advent of Code 挑战谜题。这些问题通常用于各种编码挑战和评估,包括求职面试,并在 Advent of Code 挑战的多个迭代中被重复使用。我们不会提供 Advent of Code 谜题的完整解决方案,而是专注于谜题中的特定部分,这些部分可以很好地指示开发者的技能水平。这将有助于区分没有经验和有经验的开发人员。

1. 使用 Enum 而不是 If-elif-else

在这个问题中,我们将解决石头剪刀布游戏。该问题涉及为三种形状(石头、纸、剪刀)分配不同的分数(1、2 和 3)。下面提供了两种不同的方法来解决此问题。让我们来理解以下示例。

输入

X

Y

Z

预期结果

1

2

3

示例 - 基本方法

示例 - 高级方法

解释 -

上面的代码片段定义了一个名为 RockPoints 的枚举类,其中包含三个成员 X、Y 和 Z,每个成员都有一个关联的整数值(分别为 1、2 和 3)。rock_paper_scissor() 函数接受一个字符串 shape 作为输入,并返回与输入字符串同名的 RockPoints 成员的相应整数值。

2. 使用查找表而不是字典来重塑

众所周知,字母有不同的值。小写字母 a-z 从 1 到 26,大写字母 A-Z 从 27 到 52。使用像 RockPoints 这样的枚举类可能会产生大量代码,尤其是在存在许多可能值的情况下。使用查找表是一种更实用的方法。查找表将每个可能的输入映射到其相应的输出值,从而无需复杂的类层次结构或条件语句即可快速轻松地检索所需值。

让我们理解下面的例子。

示例 -

输入

输出

3
52
1

示例 - 基本方法

示例 - 高级方法

解释 -

letter_value() 函数接受一个字符串 ltr 作为输入,并返回一个整数,表示给定字母在英文字母表中的字母位置。以下是其工作原理:

  • 字符串 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 代表了所有英文字母,包括小写和大写。
  • 字符串的 index 方法返回给定子字符串在字符串中第一次出现的位置。在这种情况下,ltr 用作在字母字符串中搜索的子字符串。
  • 由于英文字母按字母顺序排列,因此字母在字母字符串中的索引对应于其字母位置。但是,由于 Python 中的索引从 0 而不是 1 开始,因此我们需要在索引上加 1 才能获得正确的字母位置。

然后将生成的整数作为函数的输出返回。

例如,letter_value('A') 将返回 1,而 letter_value('Z') 将返回 26。请注意,该函数假定输入字母是有效的英文字母;否则,可能会引发异常。我们也可以使用查找表来解决石头、剪刀、布问题。

示例 -

3. 高级切片

在这个问题中,我们需要从行中读取字母。在这种情况下,应选择给定字符串中的每第四个字母,从第一个字母开始。虽然大多数 Python 程序员都熟悉字符串和列表切片,但通过指定切片步长来实现高级切片是可能的。

输入

[D]
[N] [C]
[Z] [M] [P]

输出

[' D ', 'NC', 'ZMP']

示例 - 基本方法

示例 - 高级方法

4. 使用类属性存储类实例

在 Python 中,类属性是类所有实例共享的变量。要将类实例存储在类属性中,我们可以将类属性定义为列表或字典,然后在创建每个实例时将其添加到该列表或字典中。让我们来理解以下示例。

示例 -

输出

[<__main__.MyClass object at 0x7f3c978c4f50>, <__main__.MyClass object at 0x7f3c978c5110>, <__main__.MyClass object at 0x7f3c978c5150>]

解释 -

在此示例中,MyClass 类有一个名为 instance 的类属性,该属性最初是一个空列表。在 __init__ 方法中,每个类实例都使用 append() 方法将自己添加到 instances 列表中。最后,在创建了一些类的实例后,打印 instances 列表以显示类的所有实例。

5. 自我记录表达式

在此方法中,我们定义了自我记录表达式,其中我们使用 print(f"{x = }) 来打印要打印的内容,并指定了打印的内容。让我们来理解以下示例。

输入

x = 10 * 2

y = 3 * 7

max(x,y)

输出

x = 20

y = 21

max(x,y) = 21

示例 - 基本方法

示例 - 高级方法

6. 使用推导式和 split 有效地读取文件

假设我们有一个文件,其中包含用 '/n' 分隔的数字。我们可以用更少的代码行有效地读取它们。让我们来理解以下示例。

示例 -

输入

10

20

30

50

60

70

输出

[[10, 20, 30], [50, 60 70]]

示例 - 基本方法

示例 - 高级方法

正如我们所见,我们将之前的示例中的 10 行代码减少到了两行,而没有损失明显的理解性或可读性,并且获得了性能提升。

结论

本教程包含了一些区分经验丰富的开发人员和初级开发人员的重要技术。这些技巧不会让任何初级开发人员一夜之间成为经验丰富的开发人员,但可以帮助我们了解作为初级开发人员如何改进。