paint-brush
编写更好的 Python 代码的 11 个技巧和窍门经过@pragativerma
2,264 讀數
2,264 讀數

编写更好的 Python 代码的 11 个技巧和窍门

经过 Pragati Verma8m2022/08/16
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

Python 通常使用“for”循环来迭代可迭代对象。但是通过使用 `enumerate() 而不是 'for' 循环,有一种更简单、更 Pythonic 的方式来做到这一点。列表理解而不是原始 for 循环是一种基于现有列表创建列表的方法。它可用于对已排序列表或序列(元组、集合、冻结集)或集合(冻结集)中的元素进行排序。列表推导式的语法如下所示:'HackerNoon'

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 编写更好的 Python 代码的 11 个技巧和窍门
Pragati Verma HackerNoon profile picture


这里有 11 个提示和技巧,可以帮助你编写更好的 Python 代码并成为更好的程序员:


1. 使用 enumerate 或range(len(x))进行迭代

在 Python 中,我们通常使用for循环来迭代可迭代对象。 Python 中的for循环使用基于集合的迭代,即 Python 在每次迭代时将可迭代的下一项分配给循环变量。 for循环的通常用例如下:


 values = ["a", "b", "c"] for value in values: print(value) # a # b # c


现在,如果除了值之外,您还想打印索引,您可以这样做:


 index = 0 for value in values: print(index, value) index += 1 # 0 a # 1 b # 2 c


或另一种常见的方法是使用range(len(x))


 for index in range(len(values)): value = values[index] print(index, value) # 0 a # 1 b # 2 c


然而,使用enumerate()有一种更简单、更 Pythonic 的方式来迭代可迭代对象。它在for循环中的使用方式与通常使用的方式几乎相同,但不是将可迭代对象直接in for循环中,或者将其用作range(len(values)) ,而是将其放在里面enumerate()的括号如下所示:


 for count, value in enumerate(values): print(count, value) # 0 a # 1 b # 2 c


我们还可以为enumerate()定义一个start参数,如下所示:


 for count, value in enumerate(values, start=1): print(count, value) # 1 a # 2 b # 3 c


enumerate()函数返回两个变量:

  • 当前迭代的计数
  • 当前迭代中项目的值


就像for循环中的循环变量一样,循环变量可以任意命名,例如,我们可以调用 then indexvalue ,它们仍然可以工作。 enumerate()for循环更有效,因为它使您免于记住访问循环内的值并正确使用它,然后还记得推进循环变量的值,这一切都由 Python 自动处理.


2. 使用列表推导而不是原始的 for 循环

列表推导是一种基于现有列表定义创建列表的更简单和优雅的方式。它们只是一行代码,由包含在每次迭代中重复执行的表达式的括号组成。因此,它们比循环更节省时间和空间,并在单行代码中转换迭代语句。


列表推导的常用语法如下所示:


 newList = [ expression(element) for element in oldList if condition ]


这是代码中列表理解的示例:


 # Using list comprehension to iterate through loop List = [character for character in 'HackerNoon'] # Displaying list print(List) # Output # ['H', 'a', 'c', 'k', 'e', 'r', 'N', 'o', 'o', 'n']


3. 使用sorted()对复杂的迭代进行排序

Python sorted()函数按特定顺序(升序或降序)对可迭代对象的元素进行排序,并将它们作为排序列表返回。它可用于对序列(字符串、元组、列表)或集合(集合、字典、冻结集)或任何其他迭代器进行排序。


sorted()函数的语法如下:


 sorted(iterable, key=None, reverse=False)


sorted()函数最多接受三个参数:

  • 可迭代:它可以是任何迭代器
  • key:它是一个可选参数,用作排序比较的键。
  • reverse:它也是一个可选参数,用于指定反向排序列表作为输出


4. 使用集合存储唯一值

Python Set 将重复值的单个副本存储到其中。因此,它可用于检查列表中的唯一值。例如:


 list_inp = [100, 75, 100, 20, 75, 12, 75, 25] set_res = set(list_inp) print("The unique elements of the input list using set():\n") list_res = (list(set_res)) for item in list_res: print(item)


所以上面程序的输出应该是这样的:


 The unique elements of the input list using set(): 25 75 100 20 12


5. 使用生成器节省内存

生成器的基本功能是按需评估元素。它与列表推导的语法非常相似,我们使用括号代替方括号。


让我们考虑一个示例,我们要打印列表中所有偶数的平方:


 myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("The given list is:", myList) mygen = (element ** 2 for element in myList if element % 2 == 0) print("Elements obtained from the generator are:") for ele in mygen: print(ele)


上述代码的输出如下所示:


 The given list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Elements obtained from the generator are: 4 16 36 64 100


已经说过它们的语法与列表推导非常相似,您一定想知道它与列表或集合推导有何不同。与列表或集合推导不同,生成器推导不初始化任何对象。因此,您可以使用生成器理解而不是列表或集合理解来降低程序的内存需求。


6. 使用.get().setdefault()在字典中定义默认值


.setdefault()方法允许设置dict[key]=default如果 key 不在 dict 中。


.setdefault()的语法如下所示:


 dict.setdefault(key, default=None)


这是一个示例代码片段,用于了解如何使用.setdefault()


 a_dictionary = {"a": 1, "b": 2, "d": 4} a_dictionary.setdefault("c", 3) print(a_dictionary)


上述代码的输出如下所示:


 {'a': 1, 'b': 2, 'd': 4, 'c': 3}


同样的事情也可以通过使用.get()方法通过传递键的默认值来实现,如下所示:


 a_dictionary = {"a": 1, "b": 2, "d": 4} print(a_dictionary.get("c", 3)) print(a_dictionary)


上述代码的输出如下所示:


 3 {'a': 1, 'b': 2, 'd': 4}


7. 使用collections.Counter计算可散列对象

Collections 模块支持高性能容器数据类型(除了内置类型列表、字典和元组),并包含各种有用的数据结构,用于在内存中存储信息。


计数器是一个容器,用于跟踪添加相等值的次数。

它可用于实现与其他语言使用包或多集数据结构来实现的相同算法。


导入集合使集合中的内容可用作:

 import collections


由于我们只打算使用计数器,我们可以简单地这样做:


 from collections import Counter


它可以按如下方式使用:


 import collections c = collections.Counter('abcdaab') for letter in 'abcde': print '%s : %d' % (letter, c[letter])


上述代码的输出如下所示:


 a : 3 b : 2 c : 1 d : 1 e : 0


8. 使用 f-Strings 格式化字符串 (Python 3.6+)

f-strings,也称为“格式化字符串文字”,是一种新的、更具 Python 风格的字符串格式化方式,受 Python 3.6+ 支持。它们是 Python 中一种更快、更易读、更简洁且不易出错的字符串格式化方式。


正如名称“f-string”所说,它们是字符串文字,以 f 开头,花括号包含表达式,这些表达式将在运行时替换为它们的值,然后使用__format__协议进行格式化。


f-strings 可以按如下方式使用:


 name = "Eric" age = 74 print(f"Hello, {name}. You are {age}.") # 'Hello, Eric. You are 74.'


9. 使用.join()连接字符串

在 Python 中,我们可以使用.join()方法将字符串列表连接成单个字符串。此方法的常用语法如下所示:


 'String to insert'.join([List of strings])


它可以以多种方式使用——如果你使用空字符串““ ,[字符串列表]只是简单地连接,如果你使用逗号,则会创建一个逗号分隔的字符串。当使用换行符\n时,每个字符串后都会附加一个换行符。请参见下面的示例:


 l = ['aaa', 'bbb', 'ccc'] s = ''.join(l) print(s) # aaabbbccc s = ','.join(l) print(s) # aaa,bbb,ccc s = '-'.join(l) print(s) # aaa-bbb-ccc s = '\n'.join(l) print(s) # aaa # bbb # ccc


10. 用{**d1, **d2}合并字典(Python 3.5+)

合并字典的最简单方法是使用解包运算符 ( ** )。此方法的语法如下所示:


 {**dict1, **dict2, **dict3}


这是一个更好地理解此方法的示例:


 d1 = {'k1': 1, 'k2': 2} d2 = {'k3': 3, 'k4': 4} print({**d1, **d2}) # {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}


11. 使用if x in list简化 if 语句

假设我们有一个包含红色、绿色和蓝色三原色的列表。在我们的代码的某个地方,我们有一个带有颜色的新变量,所以 c = red。然后我们会看看这是否是我们的主要颜色之一。当然,我们可能会针对列表中的每个项目进行检查,如下所示:


 colors = ["red", "green", "blue"] c = "red" # cumbersome and error-prone if c == "red" or c == "green" or c == "blue": print("is main color")


但是,这可能会变得非常耗时,而且我们很容易犯错误,例如如果我们在这里对红色有错别字。仅使用表达式 if x in list 更简单且更可取:


 colors = ["red", "green", "blue"] c = "red" # better: if c in colors: print("is main color")


结论

Python 是一种广泛使用的编程语言,通过使用上述提示和技巧,您可以成为一个更好的 Python 程序员。


我希望这篇文章对您有所帮助。继续阅读!