PDA

View Full Version : [PYTHON] Chiarimento riguardo le variabili nelle funzioni


~FullSyst3m~
24-01-2008, 14:10
Qua c'è l'inizio della discussione http://www.hwupgrade.it/forum/showthread.php?t=1660316

cdimauro: ho chiuso e riaperto l'idle e poi mi ha dato l'errore, prima invece no e non avevo modificato niente.. che cosa strana..

Un' altra cosa che non capisco è questa parte http://www.python.it/doc/Easytut/easytut-it/node9.html#SECTION009300000000000000000

Perchè tutti questi passaggi? Cioè, anche senza fare tutti quei passaggi che dice lì, il risultato viene sempre 6 quindi non vedo l'utilità di tutti quei passaggi che fà vedere lì, servono solo a confondere

~FullSyst3m~
24-01-2008, 16:17
Inoltre volevo sapere se con le conoscenze che ho acquisito fino ad ora potrei scrivere un programmino che calcola il codice fiscale (sono arrivato al capitolo 7.5 del manuale)

~FullSyst3m~
24-01-2008, 17:05
Capitolo 8.2, cosa significa questo (alle volte sta guida non la capisco. O è lei o sono io)?

Le entrate (index) valide di una lista (cioè quelle richiamabili grazie a nome_lista [numero dell'elemento]) vanno da 0 a len - 1. La funzione index serve a sapere la posizione di un elemento in una lista. Nel caso esistano elementi con lo stesso nome ritornerà la prima posizione dell'elemento. Osservate come l'istruzione demolist.index(42) ritorni il valore 1 e l'istruzione demolist[1] ritorni il valore 42.

Non ho capito molto perchè l'istruzione demolist.index (42) ritorni il valore 1 e perchè le entrare valide di una lista vanno da 0 a len - 1

AnonimoVeneziano
24-01-2008, 17:46
Qua c'è l'inizio della discussione http://www.hwupgrade.it/forum/showthread.php?t=1660316

cdimauro: ho chiuso e riaperto l'idle e poi mi ha dato l'errore, prima invece no e non avevo modificato niente.. che cosa strana..

Un' altra cosa che non capisco è questa parte http://www.python.it/doc/Easytut/easytut-it/node9.html#SECTION009300000000000000000

Perchè tutti questi passaggi? Cioè, anche senza fare tutti quei passaggi che dice lì, il risultato viene sempre 6 quindi non vedo l'utilità di tutti quei passaggi che fà vedere lì, servono solo a confondere

Beh, quella dell'esempio è una funzione che calcola il valore della moltiplicazioni tra due numeri . La funzione mi sembra abbastanza complicata per il lavoro che fa :asd:, usa la ricorsione infatti per calcolare la moltiplicazione (fuori di testa :D ) , ma penso sia fatta apposta per dimostrare l'uso delle funzioni.

Ciao

AnonimoVeneziano
24-01-2008, 17:54
Capitolo 8.2, cosa significa questo (alle volte sta guida non la capisco. O è lei o sono io)?



Non ho capito molto perchè l'istruzione demolist.index (42) ritorni il valore 1 e perchè le entrare valide di una lista vanno da 0 a len - 1

Le liste si scorrono per indice. Ossia gli elementi vengono inseriti in "caselle numerate" e poi per ottenere l'elemento dalla lista si usa la notazione "variabile_lista[indice]" dove "indice" è un numero indicante la cella contenente l'elemento che ci interessa e "variabile_lista" è il nome della variabile di tipo lista.

La numerazione delle celle della lista parte da 0 . Il primo elemento della lista è quindi posizionato all'indice di valore 0 e lo si ottiene con la notazione "variabile_lista[0]". Visto che la numerazione parte da 0 l'ultimo valore valido per l'indice sarà pari alla lunghezza della lista (ossia il numero degli elementi contenuti nella lista stessa) meno 1. Quindi se la lista contiene 4 elementi l'ultimo elemento lo si otterrà tramite l'indice 3. (len - 1).
Le scritture valide saranno quindi : variabile_lista[0] , variabile_lista[1], variabile_lista[2], variabile_lista[3].

Mettiamo il caso adesso che sai il nome del valore contenuto nella lista, ma non sai quale sia l'indice della cella che lo contiene. Per ottenere l'indice basta usare la funzione index() in questo modo :

variabile_lista.index(elemento) , dove "elemento" è l'elemento di cui si vuole sapere l'indice. Proprio perchè index() ritorna l'indice dell'elemento allora "variabile_lista[variabile_lista.index(elemento)]" ritornerà come valore proprio "elemento"

Ciao

~FullSyst3m~
24-01-2008, 18:53
Beh, quella dell'esempio è una funzione che calcola il valore della moltiplicazioni tra due numeri . La funzione mi sembra abbastanza complicata per il lavoro che fa , usa la ricorsione infatti per calcolare la moltiplicazione (fuori di testa ) , ma penso sia fatta apposta per dimostrare l'uso delle funzioni.

Infatti... fuori di testa proprio per fare una moltiplicazione... (oltretutto ancora alla ricorsione non ci sono arrivato)

Le liste si scorrono per indice. Ossia gli elementi vengono inseriti in "caselle numerate" e poi per ottenere l'elemento dalla lista si usa la notazione "variabile_lista[indice]" dove "indice" è un numero indicante la cella contenente l'elemento che ci interessa e "variabile_lista" è il nome della variabile di tipo lista.

La numerazione delle celle della lista parte da 0 . Il primo elemento della lista è quindi posizionato all'indice di valore 0 e lo si ottiene con la notazione "variabile_lista[0]". Visto che la numerazione parte da 0 l'ultimo valore valido per l'indice sarà pari alla lunghezza della lista (ossia il numero degli elementi contenuti nella lista stessa) meno 1. Quindi se la lista contiene 4 elementi l'ultimo elemento lo si otterrà tramite l'indice 3. (len - 1).
Le scritture valide saranno quindi : variabile_lista[0] , variabile_lista[1], variabile_lista[2], variabile_lista[3].

Mettiamo il caso adesso che sai il nome del valore contenuto nella lista, ma non sai quale sia l'indice della cella che lo contiene. Per ottenere l'indice basta usare la funzione index() in questo modo :

variabile_lista.index(elemento) , dove "elemento" è l'elemento di cui si vuole sapere l'indice. Proprio perchè index() ritorna l'indice dell'elemento allora "variabile_lista[variabile_lista.index(elemento)]" ritornerà come valore proprio "elemento"



Ora si che ci siamo... magari fossero scritte cosi chiare come hai spiegato tu alcune parti di questa guida, alle volte è criptica... mi devo mettere una flebo per non svenire...

Adesso sono all' 8.2... che casino...

menu_item = 0
list = []
while menu_item != 9:
print "--------------------"
print "1. Print the list"
print "2. Add a name to the list"
print "3. Remove a name from the list"
print "4. Change an item in the list"
print "9. Quit"
menu_item = input("Pick an item from the menu: ")
if menu_item == 1:
current = 0
if len(list) > 0:
while current < len(list):
print current,". ",list[current]
current = current + 1
else:
print "List is empty"
elif menu_item == 2:
name = raw_input("Type in a name to add: ")
list.append(name)
elif menu_item == 3:
del_name = raw_input("What name would you like to remove: ")
if del_name in list:
item_number = list.index(del_name)
del list[item_number]
# Il codice precedente rimuove solamente le
# prime occorrenze di name. Quello successivo,
# da Gerald, rimuove tutto.
# while del_name in list:
# item_number = list.index(del_name)
# del list[item_number]
else:
print del_name," was not found"
elif menu_item == 4:
old_name = raw_input("What name would you like to change: ")
if old_name in list:
item_number = list.index(old_name)
new_name = raw_input("What is the new name: ")
list[item_number] = new_name
else:
print old_name," was not found"
print "Goodbye"

~FullSyst3m~
24-01-2008, 19:26
Dopo aver preso un pò d'aria (e dalle 13.30 che scrivo codice e studio python!) ho capito il programma... però non capisco questo commento al codice:

# Il codice precedente rimuove solamente le
# prime occorrenze di name. Quello successivo,
# da Gerald, rimuove tutto.

Nell'esercizio di prima (sempre 8.2) viene cancellato il nome, la stessa cosa che fa questo programma, quindi perchè c'è messo che il codice precedente rimuove solamente le prime occorrenze di name?

cdimauro
25-01-2008, 08:25
Rieccomi. Sono stato malato (e lo sono ancora, ma sto un po' meglio, anche se tra poco torno a letto).

Velocemente. Questo:
item_number = list.index(del_name)
del list[item_number]

codice elimina soltanto il primo elemento trovato nella lista con quel nome.

Se sostituisce queste due righe con quelle presenti nel codice commentato:
while del_name in list:
item_number = list.index(del_name)
del list[item_number]
verranno invece eliminate TUTTE le occorrenze trovate.

Spero sia chiaro. Comunque questa guida non mi piace molto. Inoltre non è molto "pythonic", nel senso che in alcuni punti non è in "stile Python". Ad esempio al posto di questo:

if len(list) > 0:

io avrei scritto questo:

if list:

Che puoi leggere "se c'è la lista" (cioé se la lista non è vuota -> ha almeno un elemento), allora esegui il blocco di codice.

OK, adesso torno a letto. Se mi riprendo del tutto e domani vedo che hai ancora dei problemi, proverò a darti una mano.

Ciao

~FullSyst3m~
25-01-2008, 13:21
Grazie cdimauro, molto gentile! Saresti un grande maestro sai? Comunque è proprio per questo che chiedo, questo guida alle volte sembra che parla di un altro linguaggio, ma ormai ho iniziato con questa e finisco con questa. La cosa diversa del codice commentato è che ha il ciclo while (nell'altro codice invece c'è if), ma per il resto il programma fa la stessa cosa, cioè trova l'indice dell'elemento e poi cancella l'indice. Non ci vedo la differenza... sarò stupido forse..

~FullSyst3m~
25-01-2008, 15:25
Capitolo 8.3, esempio test.py:

## Questo programma verifica la vostra conoscenza.

true = 1
false = 0

# Prima ottieni il questionario, successivamente sarà modificato
# per l'uso del file IO.
def get_questions():
# Nota come il dato viene magazzinato in una lista di liste.
return [["What color is the daytime sky on a clear day?","blue"],\
["What is the answer to life, the universe and everything?","42"],\
["What is a three letter word for mouse trap?","cat"]]

# Questo verificherà una singola domanda, restituirà vero, se l'utente
# ha scritto la risposta corretta, altrimenti restituirà falso.
def check_question(question_and_answer):
# Estrai la domanda e la risposta dalla lista.
question = question_and_answer[0]
answer = question_and_answer[1]
# Poni la domanda all'utente.
given_answer = raw_input(question)
# Confronta le risposte dell'utente con quelle del test.
if answer == given_answer:
print "Correct"
return true
else:
print "Incorrect, correct was:",answer
return false

# Questa funzione effettuerà tutte le domande.
def run_test(questions):
if len(questions) == 0:
print "No questions were given."
# Esce dalla funzione.
return
index = 0
right = 0
while index < len(questions):
# Controlla la domanda.
if check_question(questions[index]):
right = right + 1
# Vai alla prossima domanda.
index = index + 1
# Attenzione all'ordine dei conteggi, prima moltiplica, poi dividi.
print "You got ",right*100/len(questions),"% right out of",len(questions)

# Adesso esegui la funzione sulle domande.
run_test(get_questions())


La domanda dalla lista e la risposta come la estrae? Non fa nessun riferimento alla funzione get_questions..

check_questions come parametro dovrebbe avere (question_and_answer), come fa ad avere (questions [index])? Come lo fa il controllo della domanda?

run_test dovrebbe avere (questions) come parametro, come mai allora ha (get_questions()) come parametro?

Ora prendo un pò d'aria e ci ragiono di nuovo a mente serena, è dalle 2 che ci sono sopra tra studiare la guida, scrivere il codice e cercare id capirlo.. credo proprio di avere un apprendimento lento, molto lento... :muro: