Python 已成为一种流行的编程语言,因为它清晰、通用、易于学习,并且它具有大量用于不同任务的有用库。从 Web 开发到数据科学和网络安全,Python 程序员的需求量很大。
但就像所有编程语言一样,在 Python 中,一切都取决于你,程序员。你决定你的代码看起来是专业的还是丑陋的。
幸运的是,Python 具有大量内置功能,可以帮助您编写优雅、简洁和可扩展的代码,这些都是您期望专业程序员具备的特性。
这里有一些我最喜欢的技巧,我认为每个 Python 开发人员都应该知道。
1.列表推导
列表推导式是 Python 的关键特性之一,可帮助您编写更简洁和优雅的代码。假设您要创建一个包含从 1 到 100 的数字的数组。方便的方法是使用 range() 函数:
numbers = list(range(1, 101))
但是如果你想做一些更复杂的事情,比如创建一个从 1 到 100 的正方形列表呢?在这种情况下,经典的方法是使用 for 循环:
numbers = []
for i in range(1, 101):
numbers.append(i**2)
这是大多数编程语言支持的标准方式。但幸运的是,在 Python 中,列表推导使事情变得容易得多。以下是在列表理解模式下编写相同代码时的样子:
numbers = [i**2 for i in range(1, 101)]
您可以使用列表推导在定义列表的括号中打包多个指令和表达式。它们比 for 循环更短更优雅。在保持代码整洁的同时,您还可以做更多事情。例如,假设您有一个函数 is_prime() 来检查输入数字,如果它是质数则返回 True。以下代码片段通过向推导添加 is_prime() 条件来创建从 1 到 100 的素数平方列表。
2. 链式结构
另一个偶尔派上用场的 Python 功能是 zip() 函数。zip 将两个或多个列表组合成一个变量。假设您收集了一份客户姓名、他们的年龄和他们最喜欢的冰淇淋口味的列表。
customers = ['John', 'Natasha', 'Eric', 'Sally']
ages = [26, 31, 39, 22]
flavors = ['cherry', 'chocolate', 'strawberry', 'lemon']
使用 zip(),您可以将所有三个列表合并到一个列表中,其中每个条目都包含一个元组,其中包含一个客户的姓名、年龄和偏好。
combined = zip(customers, ages, flavors)
customers_ice_cream = list(combined)
这是您的customers_ice_cream 列表在压缩数据后的样子:
[('John', 26, 'cherry'),
('Natasha', 31, 'chocolate'),
('Eric', 39, 'strawberry'),
('Sally', 22, 'lemon')]
以下是如何在循环中使用压缩列表:
for cust in customers_ice_cream:
print("{} is {} years old and likes {}".format(*cust))
输出如下所示:
John is 26 years old and likes cherry
Natasha is 31 years old and likes chocolate
Eric is 39 years old and likes strawberry
Sally is 22 years old and likes lemon
3. 统计计数
通常,您想知道某个值在列表中出现了多少次。例如,假设我们从在线调查中收集了 1-10 个评级的列表。为了模拟这一点,我们将使用 randint() 函数生成从 1 到 10 的 1,000 个随机数的列表。
from random import randint
ratings = [randint(1, 10) for _ in range(1,1001)]
现在,我们想知道每个评分中有多少包含在列表中。一种方法是使用列表的内置 计数 功能。count() 接受一个值并返回该值在列表中出现的次数。
for i in range(1, 11):
print("{}: {} occurences".format(i, ratings.count(i)))
此代码产生以下输出:
1: 95 occurrences
2: 115 occurrences
3: 111 occurrences
4: 109 occurrences
5: 81 occurrences
6: 110 occurrences
7: 80 occurrences
8: 94 occurrences
9: 98 occurrences
10: 107 occurrences
但是,这仅在您事先知道列表中值的范围时才有效。如果您不知道可能的值,您可以使用 set,它会创建一个包含在另一个列表中的唯一项目的列表。例如,如果您有一个名称列表并且想知道每个名称出现了多少次,您可以使用以下代码。
for name in set(names):
print("{}: {} occurences".format(name, names.count(name)))
或者,您可以使用Counter类,该类专门计算列表中的值。
from collections import Counter
ratings_count = Counter(ratings)
for rating in ratings_count:
print("{}: {} occurences".format(rating, ratings_count[rating]))
Counter 提供了一些附加功能,例如 most_common() 函数,它为您提供列表中出现次数最多的值。例如,以下代码将打印出三个最受欢迎的值:
for rating in ratings_count.most_common(3):
print("{}: {} occurences".format(*rating))
4. 枚举
有时,您希望在遍历列表时跟踪项目数。假设您有一个客户名称列表,并且您希望将它们与索引号一起列出。这是一种方法:
for i in range(len(customers)):
print("{}: {}".format(i+1, customers[i]))
这将产生如下所示的输出:
1: Samantha
2: Mara
3: Eric
4: James
5: George
6: Toni
7: Margaret
8: Steven
虽然这段代码有效,但它不是很优雅。注意到索引和计数器之间的不匹配了吗?幸运的是,Python 有一个 enumerate() 函数,可以让你的索引跟踪代码更容易理解和赏心悦目。enumerate() 接受两个参数,即要枚举的列表和计数器的起始编号,并在循环的每一轮中给出两个输出,即计数器值和列表项。这是 enumerate 解决了同样的问题。
for i, customer in enumerate(customers, 1):
print("{}: {}".format(i, customer))
好多了。
5. 参数扩展
假设您有一个处理学生信息的函数:
def process_student_info(first_name, last_name, fav_topic, score):
print(first_name, last_name, fav_topic, score)
在许多情况下,您要传递给函数的值包含在从数据库或文本文件中填充的 列表 或 字典 对象中。在这种情况下,调用函数会有点笨拙:
process_student_info(student[0], student[1], student[2], student[3])
幸运的是,Python 的 “参数扩展” 功能使您能够直接将整个列表传递给函数。通过在列表名称的开头添加 *,您可以在将其提交给函数之前将其扩展为单独的值。
process_student_info(*student)
只要参数的数量和它们的顺序与目标函数的参数相似,使用列表的参数扩展就可以工作。如果不匹配,它将引发错误。
您还可以对字典使用参数扩展,在这种情况下,值的顺序无关紧要。您只需要拥有与您的功能参数相对应的键。字典的参数扩展需要对象前的 ** 运算符。
student = {'last_name': 'doe', 'score': 89, 'first_name': 'john', 'fav_topic': 'calculus'}
process_student_info(**student)
使用字典扩展的好处之一是,如果您的函数具有默认参数,则在字典中省略它们不会引发错误。
6. 类型注释
Python 是一种 动态类型的 语言,这意味着如果您尝试混合具有不同数据类型的变量,它通常会找到解决差异的方法,如果不能,则会引发异常。但这种灵活性也可能导致不可预测的行为。
假设您有一个将两个变量相乘的函数。
def mul(a, b):
return a * b
如果您在两个整数或浮点数上调用 mul() - 您对该函数的预期用途 - 结果是可预测的。
a = 5
b = 6
print(mul(a, b))
输出:
30
但是,如果您的变量之一是列表怎么办?
a = [1, 2, 4, 5]
b = 3
print(mul(a, b))
输出:
[1、2、4、5、1、2、4、5、1、2、4、5]
该函数创建一个列表,该列表是列表的三个连接副本。这显然不是你想要做的。Python 3.6 及更高版本提供 “类型注释”,该功能使您能够定义每个函数参数应采用的数据类型。这是类型注释的 mul() 函数的样子。
def mul(a: int, b: int):
return a * b
这种格式明确指出 mul() 采用两个整数值。需要明确的是,类型注释不会阻止您以非预期的方式使用该函数。但是无论如何都有一些很好的理由使用它。
首先,定义数据类型是一种文档形式,它使其他开发人员更容易通过您的代码了解您希望函数中的数据类型(比较函数的注释和非注释版本)。
但更重要的是,一些代码编辑器会处理类型注释并帮助您使用自动完成和类型错误等功能。
auto complete结束的想法
这是我最喜欢的六个 Python 技巧。使用它们将使您的代码简洁优雅。随着 Python 迅速成为许多领域和机构中事实上的编程语言,拥有一套良好的最佳实践将确保您能够成为开发团队中高效的成员。
网友评论