首页 > 热点 > > 正文

【天天新视野】Python 代码的 11 个提示和技巧

2023-05-05 20:15:21 来源:一起玩转web3 分享到:

今天给大家带来Python编程过程中的11个技巧,让你的代码更加的简洁和高性能。

1.用 enumerate 代替或 range(len(x)) 迭代


(资料图片仅供参考)

如果我们需要遍历一个列表并且需要同时跟踪索引和当前项,大多数人会使用这种range(len)语法。在此示例中,我们要遍历列表,检查当前项是否为负数,并在本例中将列表中的值设置为 0。虽然range(len)语法有效,但在这里使用内置enumerate函数要好得多。这会将当前索引和当前项目作为元组返回。所以我们可以直接在这里查看值,也可以访问带有索引的项目。

data = [1, 2, -3, -4]# weak:for i in range(len(data)):    if data[i] < 0:        data[i] = 0# better:data = [1, 2, -3, -4]for idx, num in enumerate(data):    if num < 0:        data[idx] = 0

2.使用列表理解而不是原始 for 循环

假设我们要创建一个包含特定值的列表,在本例中是一个包含 0 到 9 之间所有平方数的列表。繁琐的方法是创建一个空列表,然后使用 for 循环,进行计算,然后追加它到列表中:

squares = []for i in range(10):    squares.append(i*i)

一个更简单的方法是列表。这里我们只需要一行就可以实现同样的事情:

# better:squares = [i*i for i in range(10)]

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

如果我们需要对一些可迭代对象进行排序,例如列表、元组或字典,我们不需要自己实现排序算法。我们可以简单地使用内置sorted函数。这会自动按升序对数字进行排序并返回一个新列表。如果我们想要按降序排列结果,我们可以使用参数reverse=True。正如我所说,这适用于任何可迭代对象,所以在这里我们也可以使用元组。但是请注意,结果又是一个列表!

data = (3, 5, 1, 10, 9)sorted_data = sorted(data, reverse=True) # [10, 9, 5, 3, 1]

现在假设我们有一个复杂的可迭代对象。这是一个列表,在列表中我们有字典,我们想根据字典中的年龄对列表进行排序。为此,我们还可以使用该sorted函数,然后传入应该用于排序的键参数。键必须是一个函数,所以在这里我们可以使用 lambda并使用一个返回年龄的单行函数。

data = [{\"name\": \"Max\", \"age\": 6},         {\"name\": \"Lisa\", \"age\": 20},         {\"name\": \"Ben\", \"age\": 9}        ]sorted_data = sorted(data, key=lambda x: x[\"age\"])

4.使用集合存储唯一值

如果我们有一个包含多个值的列表并且只需要唯一值,一个不错的技巧是将我们的列表转换为一个集合。Set 是一种无序集合数据类型,没有重复元素,因此在本例中它会删除所有重复项。

my_list = [1,2,3,4,5,6,7,7,7]my_set = set(my_list) # 去重

如果我们已经知道我们想要唯一的元素,比如这里的素数,我们可以立即用花括号创建一个集合。这允许 Python 进行一些内部优化,并且它还有一些方便的方法来计算两个集合之间的交集和差异。

primes = {2,3,5,7,11,13,17,19}

5.使用生成器节省内存

在技巧 #2 中,我向您展示了列表理解。但是列表并不总是最好的选择。假设我们有一个包含 10000 个项目的非常大的列表,我们想要计算所有项目的总和。我们当然可以用列表来做到这一点,但我们可能会遇到内存问题。这是我们可以使用生成器的完美示例。与列表理解类似,我们可以使用具有相同语法但使用圆括号而不是方括号的生成器理解。生成器延迟计算我们的元素,即它一次只生成一个项目,并且仅在被要求时才生成。如果我们计算这个生成器的总和,我们会发现我们得到了相同的正确结果。

# list comprehensionmy_list = [i for i in range(10000)]print(sum(my_list)) # 49995000# generator comprehensionmy_gen = (i for i in range(10000))print(sum(my_gen)) # 49995000

现在让我们使用内置sys.getsizeof()方法检查列表和生成器的大小。对于列表,我们得到超过 80000 个字节,而对于生成器,我们只得到大约 128 个字节,因为它一次只生成一个项目。这在处理大数据时会产生巨大的不同,所以牢记生成器总是好的!

import sys my_list = [i for i in range(10000)]print(sys.getsizeof(my_list), "bytes") # 87616 bytesmy_gen = (i for i in range(10000))print(sys.getsizeof(my_gen), "bytes") # 128 bytes

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

假设我们有一个字典,其中包含不同的键,例如商品和商品的价格。在我们的代码中的某个时刻,我们想要获取项目的计数,并且我们假设该键也包含在字典中。当我们简单地尝试访问密钥时,它会使我们的代码崩溃并引发KeyError。所以更好的方法是使用.get()字典上的方法。这也会返回键的值,但如果键不可用,它不会引发 KeyError 。相反,它返回我们指定的默认值,如果我们没有指定它,则返回None 。

my_dict = {"item": "football", "price": 10.00}count = my_dict["count"] # KeyError!# better:count = my_dict.get("count", 0) # optional default value

如果我们想向我们的字典询问计数并且我们还想更新字典并将计数放入字典(如果它不可用),我们可以使用该.setdefault()方法。这将返回我们指定的默认值,下次我们检查字典时,使用的键现在在我们的字典中可用。

count = my_dict.setdefault("count", 0)print(count) # 0print(my_dict) # {"item": "football", "price": 10.00, "count": 0}

7.使用 collections.Counter 计算可哈希对象

如果我们需要计算列表中元素的数量,模块中有一个非常方便的工具可以collections完成这项工作。我们只需要导入Counterfrom collections,然后使用列表作为参数创建我们的计数器对象。如果我们打印这个,那么对于我们列表中的每个项目,我们会看到该项目出现的相应次数,并且它也已经排序,最常见的项目排在前面。这比我们自己计算要好得多。如果我们想获得某个项目的计数,我们可以简单地访问这个项目,它会返回相应的计数。如果不包含该项,则返回 0。

from collections import Countermy_list = [10, 10, 10, 5, 5, 2, 9, 9, 9, 9, 9, 9]counter = Counter(my_list)print(counter) # Counter({9: 6, 10: 3, 5: 2, 2: 1})print(counter[10]) # 3

它还有一个非常方便的方法来返回最常见的项目,毫不奇怪,它被称为most_common(). 我们可以通过传入一个数字来指定我们是只想要最常见的项目,还是第二个最常见的项目等等。请注意,这将返回一个元组列表。每个元组的值作为第一个值,计数作为第二个值。因此,如果我们只想获得最常见项目的值,我们调用此方法,然后访问列表中的索引 0(这将返回第一个元组),然后再次访问索引 0 以获取该值。

from collections import Countermy_list = [10, 10, 10, 5, 5, 2, 9, 9, 9, 9, 9, 9]counter = Counter(my_list)most_common = counter.most_common(2)print(most_common) # [(9, 6), (10, 3)]print(most_common[0]) # (9, 6)print(most_common[0][0]) # 9

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

这是自 Python 3.6 以来的新功能,我认为这是格式化字符串的最佳方式。我们只需要在我们的字符串前写一个f,然后在字符串内部我们可以使用大括号和访问变量。与旧的格式化规则相比,这更简单、更简洁,而且速度也更快。此外,我们可以在运行时评估的大括号中编写表达式。所以在这里,例如我们想要打印变量 i 的平方数,我们可以简单地将这个操作写在我们的 f-String 中。

name = \"Alex\"my_string = f\"Hello {name}\"print(my_string) # Hello Alexi = 10print(f\"{i} squared is {i*i}\") # 10 squared is 100

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

假设我们有一个包含不同字符串的列表,我们希望将所有元素组合成一个字符串,每个单词之间用空格分隔。不好的方法是这样做:

list_of_strings = [\"Hello\", \"my\", \"friend\"]# BAD:my_string = \"\"for i in list_of_strings:    my_string += i + \" \" 

我们定义了一个空字符串,然后遍历列表,然后将单词和一个空格附加到字符串中。你应该知道,字符串是一个不可变的元素,所以这里我们每次都要创建新的字符串。对于大型列表,这段代码可能会非常慢,所以你应该立即忘记这种方法!该.join()方法更好,更快,也更简洁:

# GOOD:list_of_strings = [\"Hello\", \"my\", \"friend\"]my_string = \" \".join(list_of_strings)

这会将所有元素组合成一个字符串,并使用开头的字符串作为分隔符。所以这里我们使用一个只有一个空格的字符串。例如,如果我们在这里使用逗号,那么最终字符串的每个单词之间都有一个逗号。此语法是将字符串列表合并为一个字符串的推荐方法。

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

此语法是自 Python 3.5 以来的新语法。如果我们有两个词典并想合并它们,我们可以对两个词典都使用花括号和双星号。所以这里的字典 1 有名字和年龄,字典 2 也有名字和城市。与这种简洁的语法合并后,我们最终的字典中包含了所有 3 个键。

d1 = {"name": "Alex", "age": 25}d2 = {"name": "Alex", "city": "New York"}merged_dict = {**d1, **d2}print(merged_dict) # {"name": "Alex", "age": 25, "city": "New York"}

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

假设我们有一个主要颜色为红色、绿色和蓝色的列表。在我们代码的某处,我们有一个包含一些颜色的新变量,所以在这里c = red。然后我们要检查这是否是我们主要颜色中的一种颜色。我们当然可以像这样针对列表中的每个项目进行检查:

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

但这会变得非常麻烦,而且我们很容易犯错误,例如,如果我们在这里打错了red。更简单更好的是使用语法if x in list:

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

以上,就是今天的所有内容,希望大家喜欢,多多练习!

如果有其他问题可以通过公众号「python玩转」联系作者

标签:

Copyright ©  2015-2022 世界仪表网版权所有  备案号:琼ICP备2022009675号-1   联系邮箱:435 227 67@qq.com