Introduction aux fonctions Repeat et Cycle d'IterTools
Objectifs
Les objectifs de cette vidéo sont :
- Comprendre comment utiliser les fonctions Repeat et Cycle du module IterTools.
- Apprendre à éviter les pièges courants liés aux références multiples d'objets mutables.
- Savoir initialiser efficacement des listes et des tuples en Python.
Résumé
Découvrez comment utiliser les fonctions Repeat et Cycle du module IterTools pour initialiser efficacement vos listes en Python.
Description
Dans cette leçon, nous explorons les fonctions Repeat et Cycle du module IterTools en Python. Ces fonctions sont extrêmement utiles pour initialiser des listes ou des tuples avec des éléments répétés, ce qui peut simplifier votre code et éviter certains pièges classiques :
- Repeat : Cette fonction permet de répéter un élément un certain nombre de fois. Par exemple, vous pouvez facilement créer une liste contenant dix fois la même valeur.
- Cycle : Cette fonction permet de créer un itérateur qui parcourt en boucle une séquence donnée, utile pour des opérations répétitives sur des séquences de données.
Un point crucial à noter est l'utilisation correcte de Repeat pour éviter les références multiples à un même objet mutable, tel qu'un dictionnaire, afin d'éviter des effets de bord indésirables. La fonction Repeat garantit que chaque élément de la liste est une nouvelle instance, plutôt qu'une référence à la même instance.
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")