|
348 | 348 | "\n", |
349 | 349 | "In Python, la maggior parte delle strutture dati, come liste, tuple e dizionari, sono **oggetti iterabili**. Un oggetto `iterable` è un contenitore che, quando gli viene richiesto, può produrre un **iteratore**.\n", |
350 | 350 | "\n", |
351 | | - "- Un **Iterable** è un oggetto che consente di essere itereato (es. una lista).\n", |
352 | | - "- Un **Iteratore** è un oggetto che tiene traccia della posizione corrente mentre percorre l'oggetto iterable, e sa come passare all'elemento successivo.\n", |
| 351 | + "- Un **Iterable** è un oggetto che implementa il metodo speciale `__iter__()`, che restituisce un **Iteratore**.\n", |
| 352 | + "- Un **Iteratore** è un oggetto che implementa il metodo `__next__()` e che tiene traccia della posizione corrente mentre percorre l'oggetto iterable. Quando non ci sono più elementi, solleva l'eccezione `StopIteration`.\n", |
353 | 353 | "\n", |
354 | 354 | "### Come funziona il ciclo `for`?\n", |
355 | 355 | "Quando scrivi un ciclo `for`, Python usa gli iteratori dietro le quinte. Ad esempio, `for elemento in lista:` esegue questi passaggi:\n", |
|
385 | 385 | "---" |
386 | 386 | ] |
387 | 387 | }, |
| 388 | + { |
| 389 | + "cell_type": "markdown", |
| 390 | + "metadata": {}, |
| 391 | + "source": [ |
| 392 | + "---\n", |
| 393 | + "## 6. La parola chiave `yield` 🔄\n", |
| 394 | + "\n", |
| 395 | + "In Python, la parola chiave **`yield`** viene usata all’interno di una funzione per trasformarla in un **generatore**. \n", |
| 396 | + "Un generatore è una funzione speciale che produce una sequenza di valori uno alla volta, **senza calcolare tutti i risultati in anticipo**. \n", |
| 397 | + "\n", |
| 398 | + "- Ogni volta che la funzione incontra `yield`, restituisce un valore al chiamante e **sospende** la sua esecuzione. \n", |
| 399 | + "- Alla chiamata successiva, l’esecuzione riprende **dal punto esatto in cui era stata sospesa**, mantenendo lo stato interno (variabili locali). \n", |
| 400 | + "- Questo comportamento lo rende molto utile per lavorare con **grandi quantità di dati** o flussi infiniti, perché evita di occupare memoria creando subito liste complete.\n", |
| 401 | + "\n", |
| 402 | + "**Esempio:**\n", |
| 403 | + "```python\n", |
| 404 | + "def count_up_to(n):\n", |
| 405 | + " count = 1\n", |
| 406 | + " while count <= n:\n", |
| 407 | + " yield count # return the current number\n", |
| 408 | + " count += 1\n", |
| 409 | + "\n", |
| 410 | + "for num in count_up_to(5):\n", |
| 411 | + " print(num)\n", |
| 412 | + "```\n", |
| 413 | + "\n", |
| 414 | + "Output:\n", |
| 415 | + "```\n", |
| 416 | + "1\n", |
| 417 | + "2\n", |
| 418 | + "3\n", |
| 419 | + "4\n", |
| 420 | + "5\n", |
| 421 | + "```\n", |
| 422 | + "\n", |
| 423 | + "In questo esempio, `count_up_to` non restituisce una lista, ma un **oggetto generatore**, che produce i numeri solo quando richiesti." |
| 424 | + ] |
| 425 | +}, |
388 | 426 | { |
389 | 427 | "cell_type": "markdown", |
390 | 428 | "metadata": {}, |
391 | 429 | "source": [ |
392 | | - "## 6. Spacchettare le collezioni: gli operatori `*` e `**`\n", |
| 430 | + "## 7. Spacchettare le collezioni: gli operatori `*` e `**`\n", |
393 | 431 | "\n", |
394 | 432 | "In Python, i caratteri `*` e `**` sono molto utili quando si lavora con le funzioni, specialmente per **spacchettare** (unpacking) il contenuto di collezioni come liste e dizionari, trasformandoli in argomenti singoli.\n", |
395 | 433 | "\n", |
|
448 | 486 | "metadata": {}, |
449 | 487 | "source": [ |
450 | 488 | "---\n", |
451 | | -"## 7 Comprehensions ed Espressioni Generatrici \ud83c\udf1f\n", |
| 489 | +"## 8. Comprehensions ed Espressioni Generatrici \ud83c\udf1f\n", |
452 | 490 | "\n", |
453 | 491 | "Le *comprehensions* sono una sintassi compatta e leggibile per creare nuove collezioni a partire da iterabili esistenti. Sono molto usate in Python per scrivere codice conciso e veloce.\n", |
454 | 492 | "\n", |
|
0 commit comments