」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 理解 Python 中的複雜概念:問自己的問題以及如何透過範例使用它們

理解 Python 中的複雜概念:問自己的問題以及如何透過範例使用它們

發佈於2024-11-04
瀏覽:836

Comprendre les notions complexes en Python : questions à se poser et comment les utiliser avec des exemples

Python 是一种多功能且易于理解的语言,使其成为初学者的热门选择。然而,它还提供了乍一看似乎很复杂的高级功能。理解这些复杂的概念对于编写高效、可维护和高性能的 Python 代码至关重要。

在本文中,我们将探讨 Python 中一些更复杂的概念,例如生成器、装饰器、上下文管理器、lambda 表达式和元类。我们将讨论有关何时使用它们的问题,并提供代码示例来说明它们的使用。

1. 发电机

什么是发电机?
生成器是一个函数,允许您使用yield 关键字创建自定义迭代器。生成器不会返回单个值,而是在迭代时生成一系列值。

什么时候使用它?
当您处理大型数据序列并希望节省内存时。
当你需要惰性计算时,即你不想提前计算所有的值。
创建无限或潜在无限的数据流。
示例代码

def compteur_infini():
    n = 0
    while True:
        yield n
        n  = 1

# Utilisation
compteur = compteur_infini()
print(next(compteur))  # Sortie: 0
print(next(compteur))  # Sortie: 1
print(next(compteur))  # Sortie: 2

为什么有效?
每次调用 next(counter) 都会执行该函数,直到下一个yield 语句,返回值并挂起函数状态,直到下一次调用。

2. 装饰器

什么是装饰器?
装饰器是一种函数,允许您修改或丰富另一个函数或方法的行为,而无需更改其源代码。它将一个函数作为输入,向其添加功能,然后返回一个新函数。

什么时候使用它?
通过附加代码丰富功能(日志记录、访问控制、超时)。
当多个函数需要类似的行为时避免代码重复。
为了分离关注点,保持主代码干净。
示例代码

def journalisation(func):
    def wrapper(*args, **kwargs):
        print(f"Appel de {func.__name__} avec {args} {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} a retourné {result}")
        return result
    return wrapper

@journalisation
def addition(a, b):
    return a   b

# Utilisation
resultat = addition(5, 3)
# Sortie:
# Appel de addition avec (5, 3) {}
# addition a retourné 8

为什么有效?
日志装饰器包装了 add 函数,在执行之前和之后添加消息。

3. 上下文管理器

什么是上下文管理器?
上下文管理器是一种结构,允许您通过确保正确初始化和清理资源(文件、连接等)来管理资源。它使用 enterexit 方法,通常与 with 语句一起使用。

什么时候使用它?
管理需要清理的资源(关闭文件、释放连接)。
确保异常不会妨碍资源清理。
提高管理资源时代码的可读性。
示例代码

class GestionFichier:
    def __init__(self, nom_fichier, mode):
        self.nom_fichier = nom_fichier
        self.mode = mode
        self.fichier = None

    def __enter__(self):
        self.fichier = open(self.nom_fichier, self.mode)
        return self.fichier

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.fichier:
            self.fichier.close()

# Utilisation
with GestionFichier('test.txt', 'w') as f:
    f.write('Bonjour, monde!')

为什么有效?
上下文管理器确保文件自动关闭,即使在写入过程中发生异常。

4. Lambda 表达式

什么是 lambda 表达式?
lambda 表达式是使用 lambda 关键字定义的匿名函数。它可以接受多个参数,但只能包含一个表达式。

什么时候使用它?
创建快速且简单的函数,通常作为另一个函数的参数。
当一个完整的函数定义对于一个简单的任务来说过于冗长时。
用于数据结构中的简单计算。
示例代码

# Liste de nombres
nombres = [1, 2, 3, 4, 5]

# Utilisation de lambda pour doubler les nombres
doubles = list(map(lambda x: x * 2, nombres))
print(doubles)  # Sortie: [2, 4, 6, 8, 10]

为什么有效?
表达式 lambda lambda x:x*2 被传递给 map,后者将其应用于列表中的每个元素。

  1. 元类 什么是元类? 元类是定义类本身行为的类。在Python中,一切都是对象,包括类。元类允许您通过修改类的行为或添加属性来控制类的创建。

什么时候使用它?
修改类的创建,例如通过保存类或修改它们。
实现需要动态类修改的单例、ORM 或框架。
当类装饰器不足以达到所需的控制级别时。
示例代码

class EnregistrementClasses(type):
    registre = {}

    def __new__(cls, name, bases, attrs):
        new_class = super().__new__(cls, name, bases, attrs)
        cls.registre[name] = new_class
        return new_class

class MonObjet(metaclass=EnregistrementClasses):
    pass

class MonAutreObjet(MonObjet):
    pass

# Utilisation
print(EnregistrementClasses.registre)
# Sortie: {'MonObjet': , 'MonAutreObjet': }

为什么有效?
RegisterClasses 元类修改 new 方法以保存在注册表中创建的每个类。

结论

Python 中的复杂概念,例如生成器、装饰器、上下文管理器、lambda 表达式和元类,为经验丰富的开发人员提供了相当大的功能和灵活性。通过了解何时以及如何使用它们,您可以编写更高效、可读且可维护的代码。

当你遇到复杂的问题时,问自己以下问题:

我需要安全地管理资源吗? (上下文管理器)
我可以从惰性计算中受益吗? (发电机)
我可以在不修改函数的情况下丰富它的行为吗? (装饰者)
我是否需要简单的功能来进行一次性操作? (Lambda 表达式)
我应该控制类的创建吗? (元类)
通过回答这些问题,您可以确定这些复杂的概念是否适合您的情况。

7. 其他资源

图书:
Luciano Ramalho 的 Fluent Python。
《高效 Python》作者:Brett Slatkin。
官方文档:
发电机
装饰器
上下文管理器
Lambda 表达式
元类
教程:
理解 Python 中的生成器
Python 装饰器指南
使用上下文管理器
感谢您的阅读!欢迎分享您自己的经验或在评论中提出问题。

版本聲明 本文轉載於:https://dev.to/jmegnidro/comprendre-les-notions-complexes-en-python-questions-a-se-poser-et-comment-les-utiliser-avec-des-exemples-32l0? 1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-07-10
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-10
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-07-10
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-10
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-10
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-07-10
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-07-10
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-07-10
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-07-10
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-07-10
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-07-10
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-07-10
  • 為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    程式設計 發佈於2025-07-10
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-10
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-07-10

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3