T
traeai
登录
返回首页
KDnuggets

5个必须掌握的Python概念

8.5Score
5个必须掌握的Python概念

TL;DR · AI 摘要

掌握这5个Python核心概念能显著提升代码效率和可维护性。

核心要点

  • 列表推导式比循环快,生成器表达式节省内存。
  • 装饰器可避免重复代码,实现功能扩展。
  • 上下文管理器确保资源正确释放,防止内存泄漏。

结构提纲

按章节快速跳转。

  1. 介绍Python为何成为数据科学和AI的首选语言。

  2. 对比传统循环与Pythonic方式,强调性能优势。

  3. 展示如何通过装饰器简化函数日志记录。

  4. 说明资源管理的重要性及使用方法。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Python核心概念
    • 列表推导式与生成器
      • 性能优化
      • 内存管理
    • 装饰器
      • 代码复用
      • 功能扩展
    • 上下文管理器
      • 资源管理
      • 错误预防

金句 / Highlights

值得收藏与分享的关键句。

#Python#编程#开发
打开原文

标题:必须掌握的5个Python核心概念 - KDnuggets

图1:必须掌握的5个Python核心概念

#引言

你为何使用Python?对许多人来说答案可能是"就用用",但这其实并不够。Python是一种功能强大的通用编程语言,具有简洁的语法特性,其Pythonic风格在逻辑和数据管理方面表现突出,正是基于这些优势,它恰好成为了数据科学、机器学习和人工智能领域的首选语言。Python入门很容易,但你可能需要花费数年时间持续提升技能,掌握语言的核心机制,才能从初学者蜕变为能编写高效可维护系统的专业人士。

基于这样的考量,今天我们将探讨每个Python开发者都应该掌握的五个核心概念。

#1. 列表推导式与生成器表达式

Python以其可读性著称。列表推导式让你能用单行代码替代繁琐的循环。但真正的专业技巧在于懂得何时使用生成器表达式来节省内存。

#### //繁琐写法(For循环)

首先来看低效的非Pythonic繁琐实现:

code
numbers = range(1000000)
squared_list = []

for n in numbers:
    if n % 2 == 0:
        squared_list.append(n ** 2)

#### //Pythonic写法(列表推导式)

现在看看解决相同任务的Pythonic方式:

code
# 简洁且执行更快
squared_list = [n ** 2 for n in numbers if n % 2 == 0]

# "必知"要点:生成器表达式
# 如果只需单次迭代且不需要完整列表存储在内存中:
squared_gen = (n ** 2 for n in numbers if n % 2 == 0)

输出结果:

code
列表大小:      4,167,352 字节
生成器大小:    200 字节

这之所以重要,不仅仅是因为别人告诉你"Python就该这么写":列表推导式比.append()更快。生成器表达式(使用圆括号)具有"惰性"特性——它们逐个生成元素,让你能够处理海量数据集而不会耗尽系统内存。

来看看如何通过生成器表达式逐次调用生成器:

code
numbers = range(1000000)

squared_gen = (n ** 2 for n in numbers if n % 2 == 0)

# 数值仅在请求时计算,而非一次性生成
print(next(squared_gen))
print(next(squared_gen))
print(next(squared_gen))

输出结果:

code
0
4
16

#2. 装饰器

装饰器是一种在不永久修改函数或类源代码的情况下改变其行为的方式。可以将它们视作其他函数的包装器。

#### //繁琐写法

如果需要记录多个函数的运行时长,你可能会手动给每个函数添加计时代码:

code
import time

def process_data():
    start = time.time()
    # ... 函数逻辑 ...
    end = time.time()
    print(f"process_data took {end - start:.4f}s")

def train_model():
    start = time.time()
    # ... 函数逻辑 ...
    end = time.time()
    print(f"train_model took {end - start:.4f}s")

def generate_report():
    start = time.time()
    # ... 函数逻辑 ...
    end = time.time()
    print(f"generate_report took {end - start:.4f}s")

注意重复代码暴露的问题:每个函数中都重复了相同的四行代码。下面看看装饰器函数如何解决这个问题。

#### //Pythonic写法

这是更Pythonic的解决方案:

code
import time
from functools import wraps

def timer_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} took {end - start:.4f}s")
        return result
    return wrapper

@timer_decorator
def heavy_computation():
    return sum(range(10**7))

heavy_computation()

输出结果:

heavy_computation took 0.0941s

可以看到timer_decorator()如何"包装"heavy_computation()函数,当后者被调用时,它被前者包含并享受其带来的功能增强。

装饰器践行了"不要重复自己"(DRY)原则。在生产环境的日志记录、身份验证和缓存实现中,它们至关重要。

#3. 上下文管理器(`with`语句)

管理文件、数据库连接或网络套接字等资源是常见的错误来源。如果忘记关闭文件,会导致内存泄漏或阻碍其他进程访问该文件。

#### //繁琐写法

这里我们打开文件,使用后强制关闭:

code
f = open("data.txt", "w")
try:
    f.write("Hello World")
finally:
    # 这里很容易被遗忘!
    f.close()

#### //Pythonic写法

with语句能优雅处理上述场景:

code
# 文件会自动关闭,即使发生异常也不例外
with open("data.txt", "w") as f:
    f.write("Hello World")

这种方式不仅更简洁,逻辑也更清晰易懂——而且你还能自动获得容易遗忘的close()操作,因为"初始化"和"清理"步骤都会可靠执行。在数据任务中,这在连接SQL数据库或处理大型输入输出(IO)密集型任务时特别有用。

#4. 掌握`*args`和`**kwargs`

有时你无法确定函数会接收多少个参数。Python通过"打包"操作符优雅地处理这种情况。即使作为初学者尚未使用过这些功能,你也一定在某些地方见过这些"打包"操作符。

#### //Pythonic 示例

以下是符合 Python 风格的处理方式:

  • *args(非关键字参数):作为"打包"操作符,将额外的位置参数收集到元组中。适用于不确定会向函数传递多少个参数的情况。
  • **kwargs(关键字参数):作为"打包"操作符,将额外的命名参数收集到字典中。适用于可选设置或命名参数。
code
def make_profile(name, *tags, **metadata):

    # name 是命名参数
    print(f"用户: {name}")

    # tags 是元组
    print(f"标签: {tags}")

    # metadata 是字典
    print(f"详细信息: {metadata}")

make_profile("Alice", "DataScientist", "Pythonist", location="NY", seniority="Senior")

输出:

code
用户: Alice
标签: ('DataScientist', 'Pythonist')
详细信息: {'location': 'NY', 'seniority': 'Senior'}

这正是 [Scikit-Learn](https://scikit-learn.org/)[Matplotlib](https://matplotlib.org/) 等灵活库背后的秘密。它允许您向函数传递任意数量的配置参数,让代码能够完美适应不断变化的需求。

#5. 双下划线方法(魔法方法)

"Dunder"代表双下划线(例如 __init__)。官方称为特殊方法(但更常被称为魔法方法),这些方法能让您的自定义对象模拟 Python 内置行为。

#### //Pythonic 实现方式

让我们看看如何使用魔法方法为类添加自动行为:

code
class Dataset:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __str__(self):
        return f"包含 {len(self.data)} 个条目的数据集"

# 创建数据集实例
my_data = Dataset([1, 2, 3])

# 调用 __len__
print(len(my_data))

# 调用 __str__
print(my_data)

输出:

code
3
包含 3 个条目的数据集

通过使用内置的 __len____str__ 双下划线方法,我们的自定义类免费获得了实用功能。

双下划线方法是 Python 对象协议的核心。通过实现 __getitem____call__ 等方法,您可以让类具备类似列表、字典甚至函数的行为,从而创建更直观的 API。

#总结

掌握这五个概念标志着从编写脚本到构建软件的转变。通过运用列表推导式提升速度、装饰器保持逻辑清晰、上下文管理器确保安全性、*args/**kwargs 实现灵活性,以及双下划线方法增强对象能力,您将奠定进一步提升 Python 专业技能的坚实基础。

[](https://www.linkedin.com/in/mattmayo13/)**[Matthew Mayo](https://www.kdnuggets.com/wp-content/uploads/profile-pic.jpg) ([@mattmayo13**](https://twitter.com/mattmayo13)) 拥有计算机科学硕士学位和数据挖掘研究生文凭。作为 KDnuggetsStatology 的执行主编,以及 Machine Learning Mastery 的特约编辑,Matthew 致力于让复杂的数据科学概念更易理解。他的专业兴趣包括自然语言处理、语言模型、机器学习算法和新兴人工智能技术。其使命是推动数据科学社区的知识普及。Matthew 从 6 岁起就开始编程。

AI 可能会生成不准确的信息,请核实重要内容

5个必须掌握的Python概念 | KDnuggets | traeai