|
|
|
|
Strumenti |
14-10-2008, 18:53 | #1 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
[Python] Pensare da informatico: i miei (e i vostri dubbi)
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? 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) 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" 3) Paragrafo 3.12. Funzioni con risultati. Non ho mai capito questa cosa. Cosa si intende per funzione che ritorna un risultato/valore? Stamp2Volte non ritorna la stampa del parametro? Perchè non viene considerata una funzione produttiva? 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) 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? 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? 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 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? 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)
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
14-10-2008, 20:04 | #2 |
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Pure io avevo trovato alcuni errori sul libro....però adesso non ricordo se avevo notato pure i tuoi!!!! Visto che hai scritto un "papiro" adesso prenderò in mano il manuale e starò lì a spulciare tutti i punti......
1) Concordo in pieno messaggio non è una variabile locale 2) Anche a me da lo stesso errore 3-4) quelle 2 domande hanno lasciato perplesso pure me quando ho letto cose del tipo "e se non fai nulla con il risultato che ti restituisce ecc..." . Non mi sembra una cosa al di fuori della realtà.
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ Ultima modifica di 88MIKI88 : 14-10-2008 alle 20:16. |
14-10-2008, 21:27 | #3 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Appena ho un po' di tempo vedo di darvi una mano. Per adesso devo finire di scrivere l'articolo per domani.
__________________
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 |
15-10-2008, 10:34 | #4 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
Ok, cdimauro. Ora fai pure il giornalista??
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
15-10-2008, 11:24 | #5 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Scrive ottimi articoli, non lo sapevi?
-> link
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
15-10-2008, 11:43 | #6 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
15-10-2008, 11:48 | #7 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Tornando in topic, aggiungo una cosa che ho appena notato.
Partendo dal presupposto che quando si scrive un’istruzione return nell’idle al momento dell’esecuzione non ritorna nulla (si deve mettere un istruzione di stampa) mentre nella command line non ce n’è bisogno (e poi vorrei capire questa cosa), ho notato questo: Codice:
import math def DistanzaTraDuePunti(x1,y1,x2,y2): dx=x2-x1 dy=y2-y1 DistQuadrata=dx**2+dy**2 Risultato=math.sqrt(DistQuadrata) print Risultato return Risultato def AreaCerchio(Raggio): math.pi*Raggio**2 def AreaCerchio2(xc,yc,xp,yp): Raggio=DistanzaTraDuePunti(xc,yc,xp,yp) Risultato=AreaCerchio(Raggio) print Risultato return Risultato print AreaCerchio(55) AreaCerchio2(4,9,7,3) 2)Se chiamo la funzione AreaCerchio2, mi ritorna il risultato e poi il None 3)Se tolgo il print da AreaCerchio2 mi ritorna il valore, ma il None sparisce 4)Se metto il print davanti alla chiamata di funzione di AreaCerchio2 mi ritorna il valore e due None Why?? Comunque per fare un pò di ordine riquoto il mio primo post, togliendo i dubbi ai quali si è già trovato risposta Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
15-10-2008, 13:31 | #8 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Anche per oggi mi sono salvato in corner.
Stasera appena ho un po' di tempo finalmente mi smazzo tutto il thread e vedo cosa posso fare. P.S. Mi fate arrossire così!!!
__________________
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 |
15-10-2008, 13:34 | #9 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
P.S: non arrossire... In cdimauro we trust
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
15-10-2008, 17:30 | #10 | |
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Quote:
Esatto mi riferisco proprio a quella frase...quelle 3 domande non so perchè ma mi lasciano tuttora molto perplesso.....
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
15-10-2008, 18:33 | #11 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
La prima credo che la risposta più logica sia che non succede niente se il risultato non lo assegni a nessuna variabile o non lo inserisci in un'espressione. E come valore di ritorno non si intende il print (che è un'istruzione di stampa), ma il return che ritorna il valore alla funzione chiamante, almeno credo che sia cosi. Comunque aspetteremo conferme da cdimauro e dagli altri utenti P.S: e comunque un'altra frase "strana" è questa: "ritorna immediatamente da questa funzione a quella chiamante e usa questa espressione come valore di ritorno" Non è sempre detto che ci sia una funzione che ne chiama un'altra. return potrebbe significare anche: "ritorna immediatamente alla funzione chiamante e usa questa espressione come valore di ritorno"
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
15-10-2008, 21:00 | #12 | ||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Quote:
Quote:
Quindi o prima Python riportava meno cose, o nel libro hanno preferito semplificare (un po' troppo) l'output. Quote:
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:
Quote:
Al suo intero può fare quello che vuole, come stampare qualcosa a video ad esempio, ma comunque non ritorna nulla al chiamante. Quote:
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:
x % 100 divide x per 100 e ritorna il resto, che stavolta sarà compreso fra 0 e 99 (2 cifre). Quote:
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:
Gli spazi li puoi lasciare soltanto se scrivi quel codice in un file e poi lo esegui. Quote:
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 |
||||||||||
15-10-2008, 21:07 | #13 | |||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Quote:
Quindi se scrivi ad esempio 3 * 5 ti stamperà 15. Quote:
Codice:
def AreaCerchio(Raggio): return math.pi*Raggio**2 Quote:
Quote:
Quote:
Questo perché tu stai usando Python dalla command line, che è una speciale modalità utile per "smanettare", provando al volo pezzi di codice. Quote:
Quote:
__________________
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 |
|||||||
15-10-2008, 22:04 | #14 | ||||||||||||||
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
||||||||||||||
15-10-2008, 22:19 | #15 | |||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Viene omesso perché se non metti print e una funzione non torna nulla, di default non stampa nulla la command line (o idle). Quote:
Quote:
Quote:
__________________
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 |
|||||||||||
16-10-2008, 12:06 | #16 | |||||
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Quote:
Quote:
Quote:
E per quanto riguarda il "legame", se io conservo il file e lo eseguo dalla shell, che cambia? La sintassi di Python se è questa non può cambiare Quote:
Codice:
import math def DistanzaTraDuePunti(x1,y1,x2,y2): dx=x2-x1 dy=y2-y1 DistQuadrata=dx**2+dy**2 Risultato=math.sqrt(DistQuadrata) print Risultato return Risultato def AreaCerchio(Raggio): math.pi*Raggio**2 def AreaCerchio2(xc,yc,xp,yp): Raggio=DistanzaTraDuePunti(xc,yc,xp,yp) Risultato=AreaCerchio(Raggio) print Risultato return Risultato AreaCerchio2 (21,36,5,8) Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|||||
16-10-2008, 19:06 | #17 |
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Codice:
9.4 Numeri casuali La maggior parte dei programmi fanno la stessa cosa ogni volta che vengono eseguiti e sono detti per questo deterministici. Di solito un programma deterministico è una cosa voluta in quanto a parità di dati in ingresso ci attendiamo lo stesso risultato. Per alcune applicazioni, invece, abbiamo bisogno che l'esecuzione sia imprevedibile: i videogiochi sono un esempio lampante, ma ce ne sono tanti altri. Creare un programma realmente non deterministico (e quindi imprevedibile) è una cosa piuttosto difficile, ma ci sono dei sistemi per renderlo abbastanza casuale da soddisfare la maggior parte delle esigenze in tal senso. Uno dei sistemi è quello di generare dei numeri casuali ed usarli per determinare i risultati prodotti dal programma. Python fornisce delle funzioni di base che generano numeri pseudocasuali: questi numeri non sono realmente casuali in senso matematico ma per i nostri scopi saranno più che sufficienti. Il modulo random contiene una funzione chiamata random che restituisce un numero in virgola mobile compreso tra 0.0 (compreso) e 1.0 (escluso). Ad ogni chiamata di random si ottiene il numero seguente di una lunga serie di numeri pseudocasuali. Per vedere un esempio prova ad eseguire questo ciclo: import random for i in range(10): x = random.random() print x Per generare un numero casuale (lo chiameremo così d'ora in poi, anche se è sottinteso che la casualità ottenuta non è assoluta) compreso tra 0.0 (compreso) ed un limite superiore Limite (escluso) moltiplica x per Limite. Esercizio: tenta di generare un numero casuale compreso tra il \linebreak LimiteInferiore (compreso) ed il LimiteSuperiore (escluso). Esercizio addizionale: genera un numero intero compreso tra il \linebreak LimiteInferiore ed il LimiteSuperiore comprendendo entrambi questi limiti.
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
16-10-2008, 19:50 | #18 |
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Capitolo 9 Tuple
Codice:
9.3 Tuple come valori di ritorno Le funzioni possono ritornare tuple. Per fare un esempio possiamo scrivere una funzione che scambia due valori: def Scambia(x, y): return y, x e in seguito possiamo assegnare il valore di ritorno della funzione ad una tupla di due variabili: a, b = Scambia(a, b) Genera un'errore: SyntaxError: can't assign to literal
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
16-10-2008, 20:06 | #19 | |||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26107
|
Quote:
Quote:
Quote:
Se avessi usato un editor come SPE o Komodo Edit, ti sarebbe stato immediatamente segnalato. Quote:
La command line di Python NON è fatta per lavorare seriamente, ma soltanto per SPERIMENTARE velocemente pezzi di codice. Da qui l'esigenza di chiudere i blocchi alla prima riga vuota. Per lavorare seriamente usa un editore decente. Quote:
Purtroppo fino a quando non userai un editor come si deve avremo problemi di questo tipo.
__________________
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 |
|||||
16-10-2008, 20:07 | #20 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4660
|
Codice:
def FunzioneCheTornaQualcosa(Valore): return Valore * 2 print 'Stampa2Volte ha restituito:', Stampa2Volte(10) print 'FunzioneCheTornaQualcosa ha restituito:', FunzioneCheTornaQualcosa(10)( Il secondo: FunzioneCheTornaQualcosa ha restituito 20
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:53.