毕加索式的代码编写方式

17 阅读8分钟

在大多数编程语言中,我们经常遇到一种说法,说它是最强大的语言。那么,这种说法似乎比较主观,为什么会这样呢?这是因为用一种语言编写的程序可以用另一种语言进行编码。

语法可能因语言而异,但不存在一种语言能实现而另一种语言不能实现的算法。 在这篇文章中,我们将看到Python在最佳实践、简单性和可读性方面的一些方法,这些方法可以被表述为 Pythonic.

Pythonic代码的要点

就像其他语言一样,Python中也有各种方法或设计模式。Python本身使用的语法与英语非常接近,我们可以找到许多文章或在线评论,大多来自其他语言的人,说Python可以在几周内学会,等等。嗯,任何语言都不是这样的,当然Python也不是。

Pythonic**指的是Python特有的习惯性编码做法,它确实不仅仅是使用Python语法和使用标准库。

Pythonic也被称为成语,这意味着在编写Python代码时,要基于它与标准库提供的功能相一致的想法。这种说法对不同的程序员来说可能是不同的,当然它也不是对任何人的绝对准则。

这是一种像有经验的程序员那样用最佳实践和技术来编写Python的想法,就像其他语言一样,一般都是由一个巨大的社区来遵循的。

为什么我们需要Pythonic代码?

每当我们写一个程序,都是为了正确执行。写程序有多种方式,但有些方式可以被看作是**"更 "正确的方式。特别是在Python的情况下,这是真的,因为它使用最小化的语法,而且相当可读。所以,如果我们用错了或者用"不那么 "**正确的方式,往往很难被忽视。

用 "更 "正确的方式写代码有很多好处。其中一些可以说是:

  • 我们正在利用成千上万的非常聪明的开发者的优势,他们有多年编写Python的经验,并回馈给开源语言。 利用他们在长期使用该语言的过程中获得的专业知识,实施最佳实践和使用Python的习惯性方法,这当然是一个好主意。
  • 具体到CPython,它期待某种类型的代码实现,以提高效率,因为它在引擎盖下的许多操作都是为此目的而调整的。例如,我们可以通过使用a来从一个列表中创建一个子列表***for-loop***来创建一个子列表,或者我们可以使用 ***分片***来实现同样的目的。分片稍好一些,因为它被期望以与我们预期完全相同的方式工作。
  • 一段代码应该是易于阅读和全面的。比如说,当我们看到常见的模式如 列表理解,即使在解析所有符号之前,我们也能更快地理解这段代码。相反,以非pythonic的方式,我们必须分析整个代码来理解它是如何工作的。因此,用成语方式写一段代码,往往更干净、更简单。

这些是我们作为Python开发者的明显优势。然而,还有一些不太明显的或更广泛的好处,例如。

  • 当我们运行一个开源的项目时,如果使用最佳实践,人们就会更容易做出贡献。为我们的项目做贡献的人看到代码以聪明的方式编写,会感到兴奋。错过这个想法的项目之一是传统的 PyPI。当我们**pip安装任何软件包时,我们运行的是PyPI**。它已经存在了很多年,但要为它找到开源的贡献者非常困难。那么,PyPI的源代码缺乏习惯性的做法。它由一个文件中的数千行代码和一个类似的代码库组成。因此,当人们试图为使它变得更好而做出贡献时,他们很难翻阅这些代码。

好在,它被重写了,并在PyPI的官方网站上提供,使用了最佳实践和现代习语,当然这次有更多的贡献者。

  • 在一个封闭的源代码中工作,例如为一个组织或公司工作,只有最好的开发者才会被期望工作并被保留。因此,项目中的最佳编码实践和一致性为这些开发者提供了更多成语、可理解和可读代码的好处。

Pythonic方式的代码实例

让我们试着通过一些例子来了解我们在本文中之前讨论的Pythonic代码的概况。

1. 命名规则

变量也被称为标识符名称,是所有编程语言的基本组成部分。通常情况下,命名我们的变量没有固定的准则,但遵循一个模式会有帮助。

PEP8提供了一些最佳实践或风格指南来命名我们的变量,遵循Pythonic方式。即使短暂地看一眼,也能对正在阅读的代码种类提供一个很好的概述。下面提供了一些例子。

命名规则来自PEP 8风格指南
软件包公用事业
模块db_utils, dbutils, db_connect
类目客户详情
功能创建订单
变量order_id
常量SHIPPING_COST

PEP 8风格指南

2. 通过使用f-strings进行字符串格式化

使用字符串来打印出数值或者用包括表达式在内的插值字符串来返回语句是Python中的一种常见模式。早些时候,这些字符串是通过使用*+运算符来连接的*,这导致了一行非常长的代码,看起来太杂乱了,而且常常令人困惑。这个问题很快得到了解决,语言提供了一些非常巧妙的解决方案。

f-strings是在Python 3.6中引入的,它为上述问题提供了一个更好的解决方案。鉴于用f-string格式化的代码不会向后兼容,f-string可以被认为是在Python中编写字符串的一个改进,但实现它们就满足了Pythonic的标准。让我们通过一些例子来了解一下情况。

first_name, age, job = "John", 33, "programmer"

# Method 1: String Concatenation
print(first_name + " " + "is a" + " " + str(age) + " " + "year old" + " " + job)

# Method 2: % Conversion specifier
print("%s is a %d year old %s" % (first_name, age, job))

# Method 3: Using format: Until Python 3.6
print("{0} is a {1} year old {2}".format(first_name, age, job))

# Method 4: The Pythonic Way: From Python 3.6 and above
print(f"{first_name} is a {age} year old {job}")

"""
Output:

John is a 33 year old programmer
John is a 33 year old programmer
John is a 33 year old programmer
John is a 33 year old programmer

"""


3.在for-loop中使用enumerate()而不是len()或range()函数

很多时候,我们必须使用for-loops来迭代 Python 中的可迭代对象,如列表、字符串或图元,并且还需要对它们进行索引。有多种方法可以实现这一点。一些常见的模式是使用 **len()**或 **range()**函数来访问这些可迭代对象的索引。Python 有一个内置的**enumerate()**函数来执行这个操作,这可以被认为是Pythonic,它直接提供对索引的访问,而不是用多个函数来编码。

# ------------------------------
# Looping and Indexing through
# -----------------------------

# Method 1
greet = "hello"
i = 0
for eachChar in greet:
    print(i, eachChar)
    i += 1

"""
0 h
1 e
2 l
3 l
4 o

"""

# Method 2: A better way
greet = "there"
for idx in range(len(greet)):
    print(idx, greet[idx])

"""
0 t
1 h
2 e
3 r
4 e

"""

# Method 3: The Pythonic way: enumerate()
greet = "hello"
for idx, eachChar in enumerate(greet):
    print(idx, eachChar)

"""
0 h
1 e
2 l
3 l
4 o

"""


4.使用List Comprehensions而不是for-loops

列表理解是Python所特有的。它是一种让我们用Python快速创建列表而不是循环和使用append的方法。它提供了一种更短的语法,可以根据原始列表中包含的项目创建一个全新的列表,或者具体说是迭代对象。下面是使用 append 函数和更多的Pythonic列表理解的例子。请注意,它不能被过度使用,因为我们不希望在一行代码中有太多的逻辑,但它在各种情况下确实很有帮助。它使我们的代码简明扼要,可读性强。

# Using loops
my_list = []
for char in "hello":
    my_list.append(char)
print(my_list)  # ['h', 'e', 'l', 'l', 'o']


# The Pythonic Way: Using List Comprehensions
my_list1 = [char for char in "hello"]
print(my_list1)  #  ['h', 'e', 'l', 'l', 'o']


5.合并字典

字典在Python中被广泛使用。它们是最重要的数据结构之一,并在许多方面得到利用。字典中的键值对是构建模块,在Python中对它们进行多种操作是很常见的。在这个例子中,我们将研究传统的或程序性的合并字典,以及一些Pythonic方法。

# Declaring two variables for dictionaries
customer_details = {"name": "john", "age": 34, "email": "

总结

在所有的编程语言中,都有针对它们的最佳实践。Python,作为最常用的语言之一,也不例外。它有经得起考验的技术和写作风格。编写Pythonic代码不仅使我们的代码更简单、可读,而且容易维护。

Idiomatic Python提供了一种易于识别的设计模式,使编程成为一种无缝的体验,将混乱降到最低。在这篇文章中,我们通过一些来了解Pythonic方式的概况。

还有许多其他的例子,而且随着时间的推移,它只会不断增加。Pythonic确实在Python开发者社区中占有重要地位。