Comprendre et Utiliser les Générateurs
Objectifs
À l'issue de cette vidéo, vous serez capables de :
- Comprendre le fonctionnement des générateurs en Python
- Utiliser les expressions génératrices pour des transformation itérables
- Économiser la mémoire lors de la manipulation de grands ensembles de données
- Créer des générateurs complexes avec le mot-clé yield
Résumé
Découvrez les générateurs en Python et apprenez à utiliser cette fonctionnalité avancée pour optimiser la gestion de la mémoire dans vos programmes.
Description
Dans cette session, nous revisons la notion des générateurs et explorons leurs usages avancés en Python. Nous commençons par des listes en intention puis introduisons les expressions génératrices. Après avoir compris comment les générateurs peuvent transformer des itérables en de nouveaux itérables tout en économisant la mémoire, nous abordons leur application pratique en programmation. Les caractéristiques clés des générateurs, comme leur capacité à être lu une seule fois et leur mémoire limitée, sont détaillées à travers des exemples concrets. Les générateurs produisent les éléments à la demande, ce qui permet d'énormes économies de ressources lorsqu'on manipule des grands ensembles de données. Nous discutons également de l'utilisation du mot-clé yield pour créer des générateurs plus complexes. Enfin, l'importance de la lisibilité du code en Python est soulignée, surtout lorsque l'on utilise des expressions génératrices.
Les thèmes variés agrémentés d'exemples simples et clairs enrichissent toutes les notions exposées de façon particulièrement pédagogique. 👍
L'approche didactique m'a permis de beaucoup mieux comprendre tout un tas de concepts plus ou moins bien assimilés auparavant avec une vue d'ensemble nettement plus limpide aujourd'hui. 🤓
Merci pour cette belle prestation. 🙏
Je suis vraiment tres satisfait par cette première formation suivie sur Python.
#CODE en python 3.10.0 64 bits (VScode 1.62.3)
import datetime
import asyncio
import aiohttp
import requests
# ----------------------------------------------------------------------------------------------------------------------------
def req_bloquante(num):
print(f"Get {num}")
uid = requests.get("https://httpbin.org/uuid").json()["uuid"]
print(f"Res {num}: {uid}")
def faire_toutes_les_requetes():
for x in range(51):
req_bloquante(x)
print("=====> ### Bloquant : ")
start = datetime.datetime.now()
faire_toutes_les_requetes()
exec_time = (datetime.datetime.now() - start).seconds
print(f"Downloading all take {exec_time} seconds\n")
# ----------------------------------------------------------------------------------------------------------------------------
async def requeteSansBloquer(semaphore, num, session):
print(f"Get {num}")
# await semaphore.acquire() # putting this await semaphore commande the Res is ordering but process very slow ~60 sec
async with session.get("https://httpbin.org/uuid") as response:
uid = (await response.json())["uuid"]
# await asyncio.sleep(delay=3) #delay = number of seconds
# semaphore.release()
print(f"Res {num}: {uid}")
# return uid # ?
async def main():
semaphore = asyncio.Semaphore(value=1)
tasks = []
async with aiohttp.ClientSession(
loop=loop, connector=aiohttp.TCPConnector(ssl=False)
) as session:
for x in range(51):
tasks.append(requeteSansBloquer(semaphore, x, session))
await asyncio.gather(*tasks)
print("This is after the loop...")
if __name__ == "__main__":
print("=====> ### Non Bloquant : ")
start = datetime.datetime.now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
exec_time = (datetime.datetime.now() - start).microseconds
print(f"Downloading all take {exec_time} micro seconds\n")