View Single Post
Old 15-10-2008, 21:00   #12
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Salve a tutti, ho deciso di aprire questo topic per postare i dubbi inerenti il libro in questione, può sempre capitare di non capire qualcosa. Ovviamente può postare chiunque, a patto che riguardi il libro altrimenti si fa confusione.
Inizio io:

un pò di chiarimenti sul capitolo 3

1) Paragrafo 3.10, penultima riga: "Anche i parametri sono locali: al dì fuori della funzione StampaUnite2Volte, non esiste alcuna cosa chiamata messaggio."
Ma in quella funzione messaggio non è una variabile locale, è stata creata prima. E' un errore del libro?
Sì, perché si riferisce alla variabile Unione.
Quote:
2) Paragrafo 3.11. Dove si parla della traccia, io chiamo unione in stampa2volte:
Codice:
def stampa2volte(valore):
    print valore, valore

def stampaunite(parte1, parte2):
    unione= parte1 + parte2
    stampa2volte(unione)

strofa="nel mezzo "
strofa2="nel mezzo"

stampa2volte(unione)
ma l'errore che mi dà non è come quello della guida, ma diverso:

Codice:
"Traceback (most recent call last):
  File "C:/Documents and Settings/~FullSyst3m~/Desktop/test.py", line 11, in <module>
    stampa2volte(unione)
NameError: name 'unione' is not defined"
Dipende dalla versione di python (quella del libro è vecchissima)?
Potrebbe anche essere, ma comunque la sostanza è la stessa: l'eccezione sollevata è sempre la NameError. Quella tua ti dà molte più informazioni, ma è sempre la stessa.

Quindi o prima Python riportava meno cose, o nel libro hanno preferito semplificare (un po' troppo) l'output.
Quote:
3) Paragrafo 3.12. Funzioni con risultati. Non ho mai capito questa cosa. Cosa si intende per funzione che ritorna un risultato/valore?
Vuol dire che la funzione elabora i dati, e a chi l'ha chiamata restituisce poi qualcosa che magari gli serve.

Ad esempio se crei la funzione che calcola il fattoriale di un numero n, questa prende in input il numero n, fa tutti i suoi conti e ricava il fattoriale di questo numero. Lo prende e lo ritorna a chi l'ha chiamato che deciderà poi come utilizzarlo (stamparlo a video o farci altro).

Gli operatori classici (+, -, *, /, ecc.) li puoi pensare come funzioni che prendono in input dei valori e restituisco poi il risultato dell'operazione. Con le funzioni è esattamente la stessa cosa.
Quote:
Stamp2Volte non ritorna la stampa del parametro?
No, non ritorna niente. Al suo interno provvede soltanto a stampare a video quello che le è stato passato, ma poi a chi l'ha chiamato non torna "nulla" (lo metto tra virgolette perché più avanti capirai meglio).
Quote:
Perchè non viene considerata una funzione produttiva?
Perché non produce nulla come risultato, appunto. A chi l'ha chiamata non torna niente.

Al suo intero può fare quello che vuole, come stampare qualcosa a video ad esempio, ma comunque non ritorna nulla al chiamante.
Quote:
4) Sempre paragrafo 3.12, la prima delle 3 domande:
una funzione del tipo? Se chiamo stampa2volte e non faccio niente con il risultato che viene restituito non succede niente. Non capisco cosa intende il libro quando dice "restituire un risultato" (si può collegare a quella di prima)
Vedi sopra perché il discorso è quello.

Per farti capire meglio, prova a stampare il risultato di Stampa2Volte e di questa funzione:
Codice:
def FunzioneCheTornaQualcosa(Valore):
  return Valore * 2

print 'Stampa2Volte ha restituito:', Stampa2Volte(10)
print 'FunzioneCheTornaQualcosa ha restituito:', FunzioneCheTornaQualcosa(10)(
Quote:
Poi, capitolo 4, paragrafo 4.1: "Inoltre può essere usato per estrarre la cifra più a destra di un numero: x%10 restituisce la cifra più a destra in base 10. Allo stesso modo x%100 restituisce le ultime due cifre". Perchè le ultime due?
Non dovrebbe restituire quella più a destra, cioè 0?
Perché si tratta dell'operazione di resto del risultato di una divisione. x % 10 divide x per 10 e ne ritorna il resto, che sarà un valore compreso fra 0 e 9 (quindi 1 cifra).
x % 100 divide x per 100 e ritorna il resto, che stavolta sarà compreso fra 0 e 99 (2 cifre).
Quote:
4.9, la ricorsione! Eccoci qua! Allora la cosa è semplice, la funzione ContoAllaRovescia chiama se stessa n volte finchè n non corrisponde a 0. Ora, la cosa che non capisco è questa:

"L'esecuzione di ContoAllaRovescia inizia con il valore di n=0. Dal momento che n è 0, essa stampa il testo "Partenza!" e poi ritorna

"La funzione ContoAllaRovescia che aveva n=1; e poi ritorna
La funzione ContoAllaRovescia che aveva n=2; e poi ritorna
E quindi torna il _main_ (questo è un trucco)

Io non capisco cosa è questo "che aveva n=x e poi ritorna... " e il "_main_ (questo è un trucco)". Quando n arriva ad essere uguale a 0 la funzione non dovrebbe terminare?
Infatti termina. Il concetto è il seguente. Tu passi a questa funzione un valore intero che supponiamo essere 3, come nell'esempio.

Appena entrati nella funzione, n avrà valore 3. Poiché c'è subito un controllo per vedere se per caso n è arrivato a 0, il sistema passa a eseguire il blocco dell'else che provvede come prima cosa a stampare n e poi a richiamare la funzione stessa, ma questa volta passandogli n - 1.

Il concetto che devi capire è che a questo punto l'esecuzione della funzione e il valore della variabile n vengono "congelati". Fatto questo, il computer crea una nuova variabile n e gli associa il valore 2 (cioé il valore della variabile n che è stata congelata, meno 1). A questo punto richiama nuovamente la funzione passandogli questa NUOVA variabile n, e sulla quale essa lavorerà.

E così via, fino a quando non verrà richiamata la funzione ma con n = 0. A questo punto la funzione stamperà quella scritta, e ritornerà indietro andando a "scongelare" le precedenti esecuzioni della funzione, fino ad arrivare alla prima esecuzione "congelata" che comporterà poi l'uscita "definitiva" dalla funzione e il ritorno al programma principale.
Quote:
Paragrafo 4.7, primo esempio:

Codice:
x=5
y=10

if x==y:
    print x, "e", y, "sono uguali"
else:
    if x<y:
        print x, "è minore di", y

else:
    print x, "è maggiore di", y
Sia l'idle che la command line mi riportano un errore di sintassi nel secondo else. Ora, stando alla guida si dovrebbe inserire una sola istruzione else. Quindi il programma per funzionare dovrebbe essere scritto in questo modo:

Codice:
x=5
y=10

if x==y:
    print x, "e", y, "sono uguali"
elif x<y:
    print x, "è minore di", y

else:
    print x, "è maggiore di", y

Anche se sembra strano dopo tutte le correzioni che ha avuto, può essere che è un errore del libro?
Il libro è corretto se ci fai caso. Sei tu che hai aggiunto una riga vuota prima dell'else. In questo caso con IDLE o con il prompt dei comandi Python ti dà errore, perché non ci possono essere spazi in quanto viene considerato come terminazione del blocco.

Gli spazi li puoi lasciare soltanto se scrivi quel codice in un file e poi lo esegui.
Quote:
So che sono tante, ma alla fine non sono dubbi sul linguaggio di per sè, ma su come sono esposte le cose sul libro, se le cose che "non corrispondono" sono dovute a cambiamenti del linguaggio o altro (considerate il fatto che il libro è quasi di 9 anni fa e da allora ci sono stati sicuramente cambiamenti nel linguaggio)
E io sono per risponderti, nel limite delle mie possibilità e del mio tempo libero.

Spero di averti chiarito tutti i dubbi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso