Manipulation conditionnelle de séquences avec itertools
Objectifs
Les objectifs de cette vidéo sont d'apprendre à utiliser les fonctions islice, takewhile et dropwhile de la bibliothèque itertools pour manipuler des séquences en fonction de conditions spécifiques.
Résumé
Apprenez à utiliser itertools en Python pour manipuler des séquences en fonction de conditions spécifiques avec les fonctions islice, takewhile et dropwhile.
Description
Dans cette leçon, nous explorons l'utilisation avancée des fonctions de la bibliothèque itertools en Python, notamment islice, takewhile et dropwhile. L'objectif principal est de montrer comment ces fonctions permettent de manipuler des séquences en fonction de conditions bien définies.
Islice est utilisé pour obtenir un sous-ensemble de séquences basé sur des indices. Toutefois, lorsque les bornes doivent être basées sur la nature des éléments et non sur leur position, takewhile et dropwhile entrent en jeu.
Takewhile et dropwhile ressemblent au slicing traditionnel, mais avec des conditions. Takewhile récupère des éléments tant que la condition est vraie, tandis que dropwhile ignore les éléments jusqu'à ce qu'une condition soit fausse, puis récupère tous les éléments suivants, peu importe s'ils respectent la condition ou non.
Nous illustrons cela à l'aide d'exemples concrets, en montrant comment dropwhile peut être utilisé pour commencer à récupérer des éléments dès qu'une condition, telle que X >= 60, est remplie, et comment takewhile arrête de récupérer des éléments dès que cette condition n'est plus satisfaite.
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")