═══════════════════════════════════════════════════════════════════════════
📋 PROMEMORIA: TUPLE E METODI DELLE TUPLE IN PYTHON
═══════════════════════════════════════════════════════════════════════════
─────────────────────────────────────────────────────────────────────────────
🎬 COSA SONO LE TUPLE
─────────────────────────────────────────────────────────────────────────────
Le tuple sono strutture dati simili alle liste ma con una differenza chiave:
👉 SONO IMMUTABILI → non possono essere modificate dopo la creazione
Quando usarle:
• Dati che devono rimanere costanti (ID prodotti, categorie, configurazioni)
• Quando l'integrità dei dati è essenziale
• Per proteggere informazioni da modifiche accidentali
─────────────────────────────────────────────────────────────────────────────
🧱 CARATTERISTICHE FONDAMENTALI DELLE TUPLE
─────────────────────────────────────────────────────────────────────────────
1. ORDINATE → mantengono l'ordine originale degli elementi
2. IMMUTABILI → NON si possono aggiungere, rimuovere o modificare elementi
3. INDICIZZATE → ogni elemento ha una posizione numerica (0, 1, 2...)
4. AMMETTONO DUPLICATI → lo stesso valore può apparire più volte
5. VERSATILI → possono contenere tipi di dati misti
─────────────────────────────────────────────────────────────────────────────
✔ CREAZIONE DELLE TUPLE
─────────────────────────────────────────────────────────────────────────────
Metodo 1: Con parentesi tonde ()
grocery_aisles = ("Produce", "Dairy", "Bakery", "Meat", "Frozen Foods")
Metodo 2: Senza parentesi (tuple packing)
coordinates = 10, 20, 30
Tupla con un solo elemento (virgola obbligatoria!)
single_item = ("apple",) # Corretto
not_a_tuple = ("apple") # Questo è solo una stringa!
Tupla vuota
empty_tuple = ()
Tupla con tipi misti
apple_details = ("apple", 34, True, 1.99, "Fuji")
─────────────────────────────────────────────────────────────────────────────
🔍 ACCESSO AGLI ELEMENTI
─────────────────────────────────────────────────────────────────────────────
Le tuple usano l'indicizzazione come le liste
apple_details = ("apple", 34, True, 1.99, "Fuji")
print(apple_details[0]) # → "apple" (primo elemento)
print(apple_details[4]) # → "Fuji" (ultimo elemento)
print(apple_details[-1]) # → "Fuji" (ultimo elemento, indice negativo)
Display della tupla completa
grocery_aisles = ("Produce", "Dairy", "Bakery", "Meat", "Frozen Foods")
print("Grocery Aisles:", grocery_aisles)
─────────────────────────────────────────────────────────────────────────────
🔒 IMMUTABILITÀ DELLE TUPLE
─────────────────────────────────────────────────────────────────────────────
❌ OPERAZIONI NON PERMESSE:
grocery_aisles = ("Produce", "Dairy", "Bakery")
grocery_aisles[0] = "Vegetables" # ❌ ERRORE! Non si può modificare
grocery_aisles.append("Meat") # ❌ ERRORE! Non esiste questo metodo
grocery_aisles.remove("Dairy") # ❌ ERRORE! Non esiste questo metodo
del grocery_aisles[1] # ❌ ERRORE! Non si può rimuovere
─────────────────────────────────────────────────────────────────────────────
⚠️ TUPLE CON OGGETTI MUTABILI (CASO SPECIALE)
─────────────────────────────────────────────────────────────────────────────
Le tuple sono immutabili, MA gli oggetti mutabili al loro interno
(come liste) POSSONO essere modificati
Tupla contenente una lista
apple_details = ("apple", 34, True, 1.99, "Fuji",
["Washington", "California", "Michigan"])
print(apple_details)
Output: ("apple", 34, True, 1.99, "Fuji", ["Washington", "California", "Michigan"])
✅ Possiamo modificare la lista DENTRO la tupla
apple_details[5][2] = "Pennsylvania"
print(apple_details)
Output: ("apple", 34, True, 1.99, "Fuji", ["Washington", "California", "Pennsylvania"])
NOTA: La tupla stessa non è cambiata (contiene ancora gli stessi 6 elementi),
ma il contenuto della lista al suo interno è stato modificato
─────────────────────────────────────────────────────────────────────────────
🧰 METODI DELLE TUPLE
─────────────────────────────────────────────────────────────────────────────
Le tuple hanno SOLO 2 metodi (non hanno metodi per modificare il contenuto):
1. .count(value) → Conta quante volte un valore appare nella tupla
2. .index(value) → Restituisce l'indice della PRIMA occorrenza di un valore
─────────────────────────────────────────────────────────────────────────────
📌 METODO 1: .count(value)
─────────────────────────────────────────────────────────────────────────────
fruits = ("apple", "banana", "cherry", "apple", "banana", "cherry", "apple")
Contare quante volte appare "apple"
apple_count = fruits.count("apple")
print("Number of times 'apple' appears:", apple_count) # → 3
Contare quante volte appare "banana"
banana_count = fruits.count("banana")
print("Banana count:", banana_count) # → 2
Se l'elemento non esiste, restituisce 0
orange_count = fruits.count("orange")
print("Orange count:", orange_count) # → 0
─────────────────────────────────────────────────────────────────────────────
📌 METODO 2: .index(value)
─────────────────────────────────────────────────────────────────────────────
fruits = ("apple", "banana", "cherry", "apple", "banana", "cherry", "apple")
Trovare l'indice della PRIMA occorrenza di "cherry"
cherry_index = fruits.index("cherry")
print("The first occurrence of 'cherry' is at index:", cherry_index) # → 2
Trovare l'indice di "apple" (prima occorrenza)
apple_index = fruits.index("apple")
print("Apple index:", apple_index) # → 0
⚠️ Se l'elemento non esiste, genera un ValueError
orange_index = fruits.index("orange") # ❌ ERRORE! ValueError
─────────────────────────────────────────────────────────────────────────────
🧪 ESEMPIO PRATICO: DETTAGLI PRODOTTO
─────────────────────────────────────────────────────────────────────────────
spinachDetails = ("Fresh", "Organic", "Baby Spinach", 2.99, 50)
Accedere a elementi specifici
print("Descrizione:", spinachDetails[2]) # → "Baby Spinach"
print("Prezzo:", spinachDetails[3]) # → 2.99
print("Quantità:", spinachDetails[4]) # → 50
Trovare la posizione di "Baby Spinach"
description_index = spinachDetails.index("Baby Spinach")
print("Index of 'Baby Spinach':", description_index) # → 2
─────────────────────────────────────────────────────────────────────────────
🧪 ESEMPIO: VENDITE GIORNALIERE
─────────────────────────────────────────────────────────────────────────────
itemsSold = ("milk", "eggs", "milk", "bread", "eggs", "milk")
Contare quante volte è stato venduto il latte
milk_sales = itemsSold.count("milk")
print("Milk sold:", milk_sales) # → 3
Contare le uova vendute
eggs_sales = itemsSold.count("eggs")
print("Eggs sold:", eggs_sales) # → 2
─────────────────────────────────────────────────────────────────────────────
💡 CONFRONTO: LISTE VS TUPLE
─────────────────────────────────────────────────────────────────────────────
LISTE (mutabili - parentesi quadre [])
inventory_list = ["apple", "banana", "cherry"]
inventory_list.append("orange") # ✅ OK
inventory_list.remove("banana") # ✅ OK
inventory_list[0] = "grape" # ✅ OK
TUPLE (immutabili - parentesi tonde ())
store_categories = ("Produce", "Dairy", "Bakery")
store_categories.append("Meat") # ❌ ERRORE!
store_categories.remove("Dairy") # ❌ ERRORE!
store_categories[0] = "Vegetables" # ❌ ERRORE!
Quando usare cosa:
LISTE → quando i dati devono cambiare (inventario, carrello)
TUPLE → quando i dati devono rimanere fissi (categorie, ID, coordinate)
─────────────────────────────────────────────────────────────────────────────
✅ ESERCIZI DI VERIFICA
─────────────────────────────────────────────────────────────────────────────
Esercizio 1: Contare occorrenze
itemsSold = ("milk", "eggs", "milk", "bread", "eggs", "milk")
print(itemsSold.count("milk"))
Soluzione: 3
Esercizio 2: Trovare indice
spinachDetails = ("Fresh", "Organic", "Baby Spinach", 2.99, 50)
position = spinachDetails.index("Baby Spinach")
print(position)
Soluzione: 2
─────────────────────────────────────────────────────────────────────────────
💡 NOTE IMPORTANTI
─────────────────────────────────────────────────────────────────────────────
• Le tuple sono più efficienti in memoria rispetto alle liste
• Usare tuple per dati che non devono cambiare (protezione)
• Le tuple possono essere usate come chiavi nei dizionari (le liste no!)
• .index() restituisce solo la PRIMA occorrenza
• .index() genera errore se l'elemento non esiste
• Una tupla con un solo elemento DEVE avere la virgola: ("item",)
• Gli oggetti mutabili dentro una tupla possono essere modificati
═══════════════════════════════════════════════════════════════════════════
Fine del promemoria
═══════════════════════════════════════════════════════════════════════════