前路漫漫,我爱Python。Hello,大家好!在编码生涯中,最让人兴奋也是最有价值的事之一就是,随着经验和技术的积累,找到改进代码的方法,从而提高我们的工作效率。本文,我将向大家分享24个令人眼前一亮的Python编程技术和技巧,助你提升代码质量和编码水平。
extend() 方法而非 append
如果需要向列表中添加多个元素,请使用 extend() 方法一次性完成追加,而不是多次使用 append 方法。
# Bad
# Bad
data: list = [1, 2, 3]
data.append(4)
data.append(5)
data.append(6)
# Better
data: list = [1, 2, 3]
data.extend((4, 5, 6))
suppress() 简化错误处理
在异常处理中,如果你捕获了某个错误,但想忽略它,只需要在 except 块中使用 pass 语句即可。但还有一种更简单和简洁的方法,即使用 contextlib 模块中的 suppress() 方法。
# OK
try:
with open('test.txt','r') as f:
content = f.readlines()
except FileNotFoundError:
pass
# Better
from contextlib import suppress
with suppress(FileNotFoundError):
with open('test.txt','r') as f:
content = f.readlines()
writelines() 而非 write()
当需要向文件中写入多行内容时,请使用 writelines() 方法,而不是循环+ write()的方式。
# OK
content_lines: list[str] = ['line 1', 'line 2', 'line 3']
with open('test.txt', 'w') as f:
for line in content_lines:
f.write(line)
# Better
content_lines: list[str] = ['line 1', 'line 2', 'line 3']
with open('test.txt', 'w') as f:
f.writelines(content_lines)
可以看出,writelines() 方法更简洁且效率更高。
in 而非多个 or
将一个值与多个选项比较时,请选择 in 运算符,而不是多个 or 的级联。
# Bad
name: str = input('Enter your name: ').lower()
if name == 'jack' or name == 'stefan' or name == 'alice':
print(f'Congratulations! You are choosen.')
# Better
name: str = input('Enter your name: ').lower()
if name in ['jack', 'stefan', 'alice']:
print(f'Congratulations! You are choosen.')
单行代码很好,并且充分展示了很多逻辑技能。但是,如果在源代码中过度使用单行代码,则可能会造成混乱并降低可读性。
# Bad
employees: list[dict] = [
{'name': 'John', 'salary': 50000},
{'name': 'Jane', 'salary': 150000},
{'name': 'Steve', 'salary': 250000},
{'name': 'Alice', 'salary': 30000}
]
names: list[str] = sorted([emp['name'] for emp in employees if emp['salary'] >= 50000],
key=lambda name: next(emp['salary'] for emp in employees if emp['name'] == name))
# Better
employees: list[dict] = [
{'name': 'John', 'salary': 50000},
{'name': 'Jane', 'salary': 150000},
{'name': 'Steve', 'salary': 250000},
{'name': 'Alice', 'salary': 30000}
]
# Step 1: Filter employees with salary >= 50,000
filtered_employees: list[dict] = [emp for emp in employees if emp['salary'] >= 50000]
# Step 2: Sort the filtered employees by salary
sorted_employees: list[dict] = sorted(filtered_employees, key=lambda emp: emp['salary'])
__slots__ 属性减小内存占用
# Bad
class Person:
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
# Better
class Person:
__slots__ = ['name', 'age']
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
os.walk() 简化目录遍历
os.walk 是 Python os 模块中的一个有用函数,它允许你从给定的根目录开始遍历目录树。该函数返回一个生成器,该生成器为访问的每个目录生成一个元组,其中包含目录路径、子目录列表以及该目录中的文件列表。
import os
root_dir = r'/path/to/root/directory'
for dirpath, _, filenames in os.walk(root_dir):
if 'target.png' in filenames:
file_path = os.path.join(dirpath, 'target.png')
print(f'The target path: {file_path}')
break
os.walk 是访问大型目录结构中文件的便捷方式。它提高了代码的可读性,使其更加简洁明了。同时也是网络爬虫、机器学习工程师和 Django 开发人员的便捷工具。
ExitStack 管理多个上下文
与其使用嵌套 with 语句,创建一个难以阅读和维护的“厄运金字塔”,不如尝试使用 Contextlib.ExitStack() 对上下文管理器进行动态管理。
# Bad
def process_files(file1, file2, file3):
with open(file1, 'r') as f1:
with open(file2, 'r') as f2:
with open(file3, 'r') as f3:
# Process files
pass
# Better
from contextlib import ExitStack
def process_files(file1, file2, file3):
with ExitStack() as stack:
f1 = stack.enter_context(open(file1, 'r'))
f2 = stack.enter_context(open(file2, 'r'))
f3 = stack.enter_context(open(file3, 'r'))
# Process files
混合使用不同的命名约定,例如对函数使用驼峰命名,对变量使用 Pascal 命名,会导致不一致并使代码更难阅读。在整个源代码中保持一致的命名约定对于提高可读性和可维护性至关重要。
最常用和最广泛采用的约定之一是蛇形命名,即标识符以小写形式书写,并用下划线分隔不同的单词。
## 😣
def myFunction(num: float) -> float:
MyVar: float = num / 3.5
return MyVar
## 🤠
def my_function(num: float) -> float:
my_var: float = num / 3.5
return my_var
defaultdict 访问字典中缺失的键
# Bad
word_count: dict[str, int] = dict()
text: str = 'the quick brown fox jumps over the lazy dog'
for word in text.split():
if word not in word_count:
word_count[word] = 0
word_count[word] += 1
# Better
from collections import defaultdict
text: str = 'the quick brown fox jumps over the lazy dog'
word_count: dict[str, int] = defaultdict(int)
for word in text.split():
word_count[word] += 1
长函数不仅使代码更难以阅读和理解,而且使调试和维护变得复杂。当函数变得过于冗长时,其目的、逻辑和流程就会变得更难掌握,从而导致代码清晰度降低。
def data_preprocess(data):
# step 1: the missing values processing
# step 2: duplicates processing
# step 3: format conversion
# ... And more ...
# ... And still going ...
# ... Finally, save result
pass
更好的编码实践是将复杂的逻辑分解为更小、更易于管理的函数。与大型函数相比,较小函数中的问题更容易识别和解决。
较小的函数可以大幅提高调试、代码可读性、可维护性和代码可重用性。总的来说,它提高了代码质量。
def data_preprocess(data):
# ... some code ...
missing_values_process()
duplicates_process()
format_conversion()
save_result()
def missing_values_process():
# ... some code...
def duplicates_process():
# ... some code...
def format_conversion():
# ... some code...
def save_result():
# ... some code..
with_suffix() 更改文件扩展名
日常工作中一项常见的任务是更改文件的扩展名。如果您已经有一个 Path 对象,则无需将其转换为字符串,对其进行切片,然后添加新的扩展名,而是可以尝试使用 with_suffix() 函数无缝操作。
# Bad
from pathlib import Path
new_filepath = str(Path('file.txt'))[:4] + '.md'
# Better
new_filepath = Path('file.txt').with_suffix('.md')
好啦,关于24个令人眼前一亮的Python技巧,今天就暂时分享到这啦!剩余部分将在我的下一篇文章中继续给大家分享。如果你觉得本文对你有帮助,可以关注笔者,及时获得最新的文章更新。感谢你的阅读!
推荐阅读👇👇👇
Python必知必会:令人相见恨晚的10个Python类技巧(二)
Python必知必会:令人相见恨晚的10个Python类技巧(一)
- END -
🌟 如果你喜欢这篇文章并且愿意支持我的话,你可以:🌟
👍👍👍 点赞文章 ⤴️⤴️⤴️ 转发文章 ⚛️⚛️⚛️ 点击在看 🧑🤝🧑🧑🤝🧑🧑🤝🧑 让文章被推荐给更多人,找到更多志同道合的伙伴 👏👏👏 欢迎给我留言 关注我,第一时间接收更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。你的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!
👇👇👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!
原文作者:数据派探险家;如有侵权,请联系管理员删除。