作为初学者如何编写干净的Python 代码

Python 是一门很适合初学者的编程语言——简单且清晰。但随着你对它越来越熟悉,很容易养成写出复杂且难以阅读的代码的坏习惯,而这正是开发者最不愿面对的调试恶梦。干净的代码不仅仅是为了让别人看得舒服——当你再次需要处理这些代码时,它会为你省去很多麻烦。相信我,花时间写出整洁的代码会让你在长远来看轻松很多。

在本文中,我们将探讨一些技巧和最佳实践,即使你是初学者,也能帮助你写出简洁且可读的 Python 代码。

编写干净且对初学者友好的 Python 代码的关键实践

1. 遵循 PEP 8 风格指南

PEP 8 是 Python 的主要风格指南,它提供了编写干净和可读代码的惯例。以下是 PEP 8 中的一些重要点:

    • 每个缩进级别使用4个空格:
def greet():
    print("Hello, World!")  # 用4个空格缩进
    • 限制行长度为79个字符:通过避免书写过长的行来保持代码的可读性。如果一行太长,使用括号或反斜杠将其分成较小的部分。
    • 使用空行分隔代码块:在函数或类之间添加空行以提高可读性:
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b
    • 使用 snake_case 命名变量和函数:变量和函数名应为小写,用下划线分隔单词:
my_variable = 10

def calculate_average(numbers):
    return sum(numbers) / len(numbers)

2. 为变量和函数使用有意义的名称

不要使用模糊或单字母的名称(如 `x` 或 `y`),除非用于简单且短的循环。这样对代码没有帮助。相反,使用能够解释变量或函数作用的名称。

    • 不良示例:
def a(x, y):
    return x + y
    • 良好示例:
def add_numbers(first_number, second_number):
    return first_number + second_number

3. 使用清晰的注释(但不要过度)

注释解释代码为何这样做,而不是做了什么。如果你的代码库是干净的且没有含糊不清的命名,你不需要过多注释。原则上,代码应能自我解释!然而,当有必要时,使用注释来澄清你的意图。

    • 不良示例:避免过度注释或说明显而易见的事情。
x = x + 1  # 将 x 增加 1
    • 良好示例:
def retry_connection(attempts=3):
# 尝试三次以处理临时网络问题
pass

4. 保持函数简洁和专注

一个函数应做好一件事。如果一个函数太长或处理多项任务,考虑将其分解为较小的函数。

    • 不良示例(职责过多):
def process_user_data(user):
# 50行代码处理多项任务
pass
    • 良好示例(任务分离):
def validate_user(user):
pass

def save_user(user):
pass

def notify_user(user):
pass

5. 优雅地处理错误

作为初学者,可能会忽略错误处理,但这是编写良好代码的重要部分。使用 try 和 except 块来处理潜在错误。

try:
    number = int(input("Enter a number: "))
    print(f"The number is {number}")
except ValueError:
    print("That’s not a valid number!")

这可以确保你的程序不会意外崩溃。

 

6. 避免硬编码值

直接在代码中硬编码值(例如,数字或字符串)会使更新或重用变得困难。相反,使用变量或常量。

    • 不良示例:
print("The total price with tax is: $105")  # 硬编码的税和总价

 

    • 良好示例:
PRICE = 100  # 产品的基础价格
TAX_RATE = 0.05  # 5% 的税率

# 计算总价
total_price = PRICE + (PRICE * TAX_RATE)

print(f"The total price with tax is: ${total_price:.2f}")

这样使你的代码更灵活且易于修改。

7. 避免全局变量

依赖全局变量会使代码更难以理解和调试。相反,将状态封装在类或函数中。

    • 不良示例 (使用全局变量):
total = 0

def add_to_total(value):
    global total
    total += value
    • 良好示例 (使用类):
class Calculator:
    def __init__(self):
        self.total = 0
    
    def add_value(self, value):
        self.total += value

将数据封装在对象或函数中可以确保你的代码是模块化、可测试且错误更少。

8. 使用 f-Strings 进行字符串格式化

f-Strings(在 Python 3.6 中引入)是一种简洁且可读的字符串格式化方式。

    • 不良示例 (连接字符串):
name = "Alice"
age = 25
print("My name is " + name + " and I am " + str(age) + " years old")
    • 良好示例 (使用 f-strings):
name = "Alice"
age = 25
print(f"My name is {name} and I am {age} years old")

f-Strings 不仅更加可读,而且比其他字符串格式化方法更高效。

9. 使用内置函数和库

Python 拥有许多强大的内置功能。使用这些功能来编写高效且规范的代码,而不是从头开始编码。

    • 不良示例 (手动寻找最大值):
def find_max(numbers):
    max_number = numbers[0]
    for num in numbers:
        if num > max_number:
            max_number = num
    return max_number
    • 良好示例 (使用 max):
def find_max(numbers):
    return max(numbers)

10. 使用 Pythonic 代码

“Pythonic” 代码指的是利用 Python 简单性和可读性来编写代码。当有更简单的选项时,避免过于复杂或冗长的解决方案。

    • 不良示例:
numbers = [1, 2, 3, 4, 5]
doubled = []
for num in numbers:
    doubled.append(num * 2)
    • 良好示例:
numbers = [1, 2, 3, 4, 5]
doubled = [num * 2 for num in numbers]

使用列表推导式、内置函数和可读的习惯用法使代码更优雅。

11. 使用版本控制

即使作为初学者,也建议开始使用像 Git 这样的工具进行版本控制。它允许你跟踪更改,与他人协作,并避免在出现问题时丢失进度。
学习 Git 的基础知识:

  • 使用 git add 和 git commit 保存你的代码
  • 放心实验,知道你可以恢复到先前的版本。

12. 良好地组织你的项目

随着代码库的增长,组织文件和目录变得至关重要。一个结构良好的项目使代码更易于导航、调试和扩展。

以下是一个标准项目结构的示例:

my_project/
├── README.md              # 项目文档
├── requirements.txt       # 项目依赖
├── setup.py              # 打包配置
├── .gitignore            # Git 忽略文件
├── src/                  # 主源代码目录
│   └── my_project/       # 包目录
│       ├── __init__.py   # 使文件夹成为包
│       ├── main.py       # 主应用文件
│       ├── config.py     # 配置设置
│       └── constants.py  # 项目常量
├── tests/                # 测试文件
│   ├── __init__.py
│   ├── test_main.py
│   └── test_utils.py
├── docs/                 # 文档文件
│   ├── api.md
│   └── user_guide.md
└── scripts/              # 工具脚本
    └── setup_db.py

结构化的方法确保你的项目在规模增长时仍然保持清晰和可管理。

13. 测试你的代码

始终测试你的代码以确保其按预期工作。即使是简单的脚本也能受益于测试。对于自动化测试,初学者可以从内置的 unittest 模块开始。

import unittest

def add_numbers(a, b):
    return a + b

class TestAddNumbers(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add_numbers(2, 3), 5)
        self.assertEqual(add_numbers(-1, 1), 0)

if __name__ == "__main__":
    unittest.main()

测试帮助你及早发现错误并确保代码正确运行。

记住:

  • 为人而不是仅为计算机写代码
  • 保持简单
  • 保持风格一致
  • 定期测试你的代码
  • 在需要时重构

总结

一点一点地去做,不断学习,很快干净的代码将成为你的第二天性。

更多