View Full Version : [Python] Pensare da informatico: i miei (e i vostri dubbi)
~FullSyst3m~
24-11-2008, 11:04
Be', non è che mi stia "innamorando" di Python: è un linguaggio, e quindi uno strumento. Però concordo con cdimauro che lo definisce "pseudocodice eseguibile". :D
È molto comodo poter scrivere uno "pseudocodice" che puoi andare a testare direttamente sul tuo PC, se avessi dovuto farlo con del codice C ci avrei messo il triplo del tempo. Python, invece, essendo un linguaggio di più "alto" livello, mi dà la libertà di pensare al problema che sto risolvendo, prima di preoccuparmi dei dettagli implementativi.
Insomma, io conosco un po' di Python e per questo lo utilizzo per i miei scopi; sono sicuro che VICIUS potrebbe farti lo stesso mio discorso semplicemente sostituendo "Ruby" alle occorrenze di "Python". :p
Cioè? Comunque sono d'accordo con te, è stupendo come linguaggio e oltretutto è difficile non innamorarsene :D
DanieleC88
24-11-2008, 11:20
Qui per dettagli implementativi intendevo tutto ciò che non fosse strettamente legato alla logica del problema, ma più che altro alla natura del linguaggio in cui sto codificando l'algoritmo.
Un esempio stupido che mi viene in mente è che una mia funzione potrebbe ricevere un'array di interi come parametro e potrei volerne conoscere la lunghezza.
In Python farei così:
def miaFunzione(A):
n = len(A)
# ...
In C invece cosa dovrei fare? Ricevere un puntatore di interi terminato da un NULL e scorrerlo fino alla fine? Richiedere una grandezza fissa per l'array? Ricevere la dimensione in input come secondo parametro? Dividere sizeof(A) per sizeof(int)? A te la scelta. :p
Per fare una stessa cosa ci sono quasi sempre diversi modi di farla: come la vuoi fare dipende dalla tua volontà e dagli strumenti che usi (in questo caso il linguaggio).
~FullSyst3m~
24-11-2008, 12:07
Qui per dettagli implementativi intendevo tutto ciò che non fosse strettamente legato alla logica del problema, ma più che altro alla natura del linguaggio in cui sto codificando l'algoritmo.
Un esempio stupido che mi viene in mente è che una mia funzione potrebbe ricevere un'array di interi come parametro e potrei volerne conoscere la lunghezza.
In Python farei così:
def miaFunzione(A):
n = len(A)
# ...
In C invece cosa dovrei fare? Ricevere un puntatore di interi terminato da un NULL e scorrerlo fino alla fine? Richiedere una grandezza fissa per l'array? Ricevere la dimensione in input come secondo parametro? Dividere sizeof(A) per sizeof(int)? A te la scelta. :p
Per fare una stessa cosa ci sono quasi sempre diversi modi di farla: come la vuoi fare dipende dalla tua volontà e dagli strumenti che usi (in questo caso il linguaggio).
In questo caso cosa c'entra la volontà? A parità di scelta credo che ovviamente sceglierei uno strumento che mi semplifica la vita, ad esempio Python.
Però ora mi sorge spontanea una domanda leggendo quello che hai scritto: come mai C/C++ è cosi ricercato? E' un casino sto linguaggio qua...
cdimauro
24-11-2008, 13:36
Ho creato due mostri. :D
C/C++ è ricercato perché ci sono ancora parecchi progetti li usano, perché per applicazioni di sistema sono versatili, e perché esistono sistemi che sono storicamente legati a loro (Unix et similia).
AnonimoVeneziano
24-11-2008, 13:37
In questo caso cosa c'entra la volontà? A parità di scelta credo che ovviamente sceglierei uno strumento che mi semplifica la vita, ad esempio Python.
Però ora mi sorge spontanea una domanda leggendo quello che hai scritto: come mai C/C++ è cosi ricercato? E' un casino sto linguaggio qua...
Beh, il C è uno dei linguaggi che hanno fatto la storia dell'informatica. Da quando è nato all'inizio degli anni '70 è entrato di prepotenza tra i linguaggi più usati dai programmatori dell'epoca, quindi c'è un mare di codice scritto in C che i programmatori spesso non hanno tempo di riscrivere in un linguaggio di più alto livello e così continuano a mantenere ed estendere i propri programmi in C.
Inoltre essendo un linguaggio che permette di controllare l'hardware sottostante a livello piuttosto basso è stato un linguaggio perfetto per la scrittura dei sistemi operativi che, per l'appunto, in genere sono scritti in C (I kernel e le API di Windows e Linux tanto per fare un esempio sono scritti in C) .
Questo significa che se ci si vuole interfacciare col sistema operativo direttamente è necessario usare il C visto che le API sono scritte in C.
Di fatto l'interprete di Python è scritto in C. Quando tu lanci una "print" in python questa print viene "convertita" in una chiamata di funzione C alle API del sistema operativo dall'interprete Python.
Poi ovviamente ci sono anche quei campi critici dove il codice deve essere eseguito il più velocemente possibile e allora la scelta di solito ricade su un linguaggio compilato con buone prestazioni come il C. Fek ad esempio tempo fa disse che i motori dei videogiochi ancora oggi vengono scritti interamente in C++ perchè linguaggi di più alto livello non garantirebbero prestazioni sufficientemente elevate , soprattutto a livello di latenza (e anche per la gestione diretta della memoria).
Anche la scrittura dei sistemi operativi è un campo critico dove le prestazioni sono importanti (ad esempio nello scheduler dei processi) e dove è necessario un controllo granulare dell'hardware sottostante e perciò viene usato il C (come già detto sopra).
Ciao
banryu79
24-11-2008, 13:44
Poi ovviamente ci sono anche quei campi critici dove il codice deve essere eseguito il più velocemente possibile e allora la scelta di solito ricade su un linguaggio compilato con buone prestazioni come il C. Fek ad esempio tempo fa disse che i motori dei videogiochi ancora oggi vengono scritti interamente in C++ perchè linguaggi di più alto livello non garantirebbero prestazioni sufficientemente elevate , soprattutto a livello di latenza (e anche per la gestione diretta della memoria).
Se non ricordo male i post di fek, l'aspetto della memoria mi pareva fosse il più critico, specie per quanto riguardava la frammentazione dell'heap a runtime da cui conseguiva l'eseginza di un controllo esatto dell'allocazione e distruzione degli oggetti.
Ciao.
~FullSyst3m~
24-11-2008, 13:44
Ho creato due mostri. :D
C/C++ è ricercato perché ci sono ancora parecchi progetti li usano, perché per applicazioni di sistema sono versatili, e perché esistono sistemi che sono storicamente legati a loro (Unix et similia).
A quali mostri ti riferisci??
Beh, il C è uno dei linguaggi che hanno fatto la storia dell'informatica. Da quando è nato all'inizio degli anni '70 è entrato di prepotenza tra i linguaggi più usati dai programmatori dell'epoca, quindi c'è un mare di codice scritto in C che i programmatori spesso non hanno tempo di riscrivere in un linguaggio di più alto livello e così continuano a mantenere ed estendere i propri programmi in C.
Inoltre essendo un linguaggio che permette di controllare l'hardware sottostante a livello piuttosto basso è stato un linguaggio perfetto per la scrittura dei sistemi operativi che, per l'appunto, in genere sono scritti in C (I kernel e le API di Windows e Linux tanto per fare un esempio sono scritti in C) .
Questo significa che se ci si vuole interfacciare col sistema operativo direttamente è necessario usare il C visto che le API sono scritte in C.
Di fatto l'interprete di Python è scritto in C. Quando tu lanci una "print" in python questa print viene "convertita" in una chiamata di funzione C alle API del sistema operativo dall'interprete Python.
Poi ovviamente ci sono anche quei campi critici dove il codice deve essere eseguito il più velocemente possibile e allora la scelta di solito ricade su un linguaggio compilato con buone prestazioni come il C. Fek ad esempio tempo fa disse che i motori dei videogiochi ancora oggi vengono scritti interamente in C++ perchè linguaggi di più alto livello non garantirebbero prestazioni sufficientemente elevate , soprattutto a livello di latenza (e anche per la gestione diretta della memoria).
Anche la scrittura dei sistemi operativi è un campo critico dove le prestazioni sono importanti (ad esempio nello scheduler dei processi) e dove è necessario un controllo granulare dell'hardware sottostante e perciò viene usato il C (come già detto sopra).
Ciao
Queste cose si sanno, siamo d'accordo, però a volte sarebbe meglio cambiare, provare nuove strade e non attaccarsi al solito ramo ;)
MasterDany
24-11-2008, 14:42
Daniele ti ringrazio sei stato molto chirao! ;)
A quali mostri ti riferisci??
A te e Daniele. Ormai siete assuefatti a python.
Queste cose si sanno, siamo d'accordo, però a volte sarebbe meglio cambiare, provare nuove strade e non attaccarsi al solito ramo ;)
Anche volendo a volte è impossibile passare a python. Prova ad esempio a metterti nei panni i Microsoft. Vuoi portare il codice di Vista in python ma anche mettendo tutti ad una tastiera, donne delle pulizie comprese, a riscrivere le 120 milioni di linee di codice dovresti fermare lo sviluppo per almeno 10 anni.
Vincenzo1968
24-11-2008, 15:06
...
Anche volendo a volte è impossibile passare a python. Prova ad esempio a metterti nei panni i Microsoft. Vuoi portare il codice di Vista in python ma anche mettendo tutti ad una tastiera, donne delle pulizie comprese, a riscrivere le 120 milioni di linee di codice dovresti fermare lo sviluppo per almeno 10 anni.
È questo, dunque, il motivo per il quale viene mantenuto il codice C per i sistemi operativi? L'efficienza non c'entra niente? Tu, oggi, un sistema operativo lo scriveresti in python o ruby? :bimbo:
È questo, dunque, il motivo per il quale viene mantenuto il codice C per i sistemi operativi? L'efficienza non c'entra niente? Tu, oggi, un sistema operativo lo scriveresti in python o ruby? :bimbo:
Se il codice scritto in ruby fosse veloce quanto quello scritto in C si. Il motivo economico sarebbe l'unico ostacolo che mi impedirebbe di riscrivere Linux o Windows. Partendo da zero invece sceglierei senza dubbio ruby. Ovviamente nella realtà ruby è molto più lento quindi è semplicemente impensabile sceglierlo per questo tipo di progetti.
AnonimoVeneziano
24-11-2008, 15:32
Se il codice scritto in ruby fosse veloce quanto quello scritto in C si. Il motivo economico sarebbe l'unico ostacolo che mi impedirebbe di riscrivere Linux o Windows. Partendo da zero invece sceglierei senza dubbio ruby. Ovviamente nella realtà ruby è molto più lento quindi è semplicemente impensabile sceglierlo per questo tipo di progetti.
Beh, anche la gestione del tutto automatica delle risorse hardware di questi linguaggi potrebbe essere un problema per lo sviluppo di un sistema operativo.
Bisognerebbe sviluppare una versione apposita di Python e Ruby con le quali è possibile accedere alle risorse di basso livello.
Praticamente però il fatto che non esista e non è in via di sviluppo un compilatore statico per questi linguaggi è sicuramente un altro ostacolo alla realizzazione di quest'obiettivo.
Ciao
Beh, anche la gestione del tutto automatica delle risorse hardware di questi linguaggi potrebbe essere un problema per lo sviluppo di un sistema operativo.
Bisognerebbe sviluppare una versione apposita di Python e Ruby con le quali è possibile accedere alle risorse di basso livello.
Basta scrivere delle piccole estensioni in C. Almeno io ho fatto così quando ho provato a scrivere una specie di cpuz in ruby. Oltretutto è di una semplicità disarmante. Ci ho messo di più a scrivere le 4 righe di assembly che a capire come scrivere una estensione.
DanieleC88
24-11-2008, 16:08
In questo caso cosa c'entra la volontà? A parità di scelta credo che ovviamente sceglierei uno strumento che mi semplifica la vita, ad esempio Python.
Non mi riferivo soltanto al linguaggio, anche un tipo di dati astratto lo puoi implementare in maniere diverse a seconda di cosa ti sia più utile in un certo contesto (lascia stare per adesso, sono cose che studierai).
Però ora mi sorge spontanea una domanda leggendo quello che hai scritto: come mai C/C++ è cosi ricercato? E' un casino sto linguaggio qua...
Python è un linguaggio interpretato, e ciò lo rende molto comodo, mentre C e C++ sono linguaggi che vengono compilati, quindi il codice che produci alla fine verrà eseguito direttamente dalla macchina, senza intermediari, e chiaramente c'è un guadagno sensibile per quel che riguarda le prestazioni.
Anche qui, come vedi, il linguaggio è uno strumento: scegli quale usare a seconda delle necessità.
A te e Daniele. Ormai siete assuefatti a python.
Ma non sono assuefatto! :p Semplicemente mi piace, quando posso, esplorare qualcosa di nuovo. Dopo diversi anni di C, C, e ancora C, voglio esplorare nuovi campi (e non mi dispiace l'idea di dare una chance anche a Ruby, più in là :D).
Semplicemente, come dicevo prima, sono obiettivo: scelgo il linguaggio che mi fa più comodo. Python lo sto trovando molto utile e rapido per i vari scopi "didattici", ma non essendone ancora padrone a pieno, svilupperei ancora in C le mie applicazioni. Per ora. :D
~FullSyst3m~
24-11-2008, 16:20
A te e Daniele. Ormai siete assuefatti a python.
Lo immaginavo, cercavo conferma! Volevo essere sicuro che si riferiva a me per evitare qualche gaf :D Mi ha contagiato davvero cdimauro :D
Anche volendo a volte è impossibile passare a python. Prova ad esempio a metterti nei panni i Microsoft. Vuoi portare il codice di Vista in python ma anche mettendo tutti ad una tastiera, donne delle pulizie comprese, a riscrivere le 120 milioni di linee di codice dovresti fermare lo sviluppo per almeno 10 anni
Non parlo solo di Python
Almeno io ho fatto così quando ho provato a scrivere una specie di cpuz in ruby.
Ce l'hai fatta a scriverlo questa specie di cpuz? Comunque una volta avevo letto sul sito ufficiale che mi sembra che ci siano delle librerie o delle api apposite per sviluppare questo tipo di applicazioni
Oltretutto è di una semplicità disarmante. Ci ho messo di più a scrivere le 4 righe di assembly che a capire come scrivere una estensione.
Addirittura disarmante? Assembly per il simil-cpuz che volevi scrivere in ruby? E per scrivere una estensione hai trovato la documentazione specifica per cpuz oppure una documentazione generale?
Anche qui, come vedi, il linguaggio è uno strumento: scegli quale usare a seconda delle necessità.
Questo senza dubbio
Ma non sono assuefatto! Semplicemente mi piace, quando posso, esplorare qualcosa di nuovo. Dopo diversi anni di C, C, e ancora C, voglio esplorare nuovi campi (e non mi dispiace l'idea di dare una chance anche a Ruby, più in là ).
Semplicemente, come dicevo prima, sono obiettivo: scelgo il linguaggio che mi fa più comodo. Python lo sto trovando molto utile e rapido per i vari scopi "didattici", ma non essendone ancora padrone a pieno, svilupperei ancora in C le mie applicazioni. Per ora.
Infatti, lui non è assuefatto :D Diciamo che cdimauro ha creato un mostro e mezzo per adesso :asd: Alla fine per come si sono fatti incantare moltre altre persone anche tu cadrai nella trappola di Python :asd:
DanieleC88
24-11-2008, 16:38
def Trova(Stringa, Carattere, Inizio=0):
Indice = Inizio
while Inizio < len(Stringa): # E per forza! :P
if Stringa[Indice] == Carattere:
return Indice
Indice += 1
return -1
print Trova('mela', 'l', 2)
Carta e penna... solo alla fine il codice. :Prrr:
Non parlo solo di Python
Il discorso può essere fatto anche con altri linguaggi. Ad esempio perché il kernel di linux non viene riscritto in C++?
Ce l'hai fatta a scriverlo questa specie di cpuz?
Vuoi il codice così appena finisci il libro puoi provare a riscriverlo in python? :)
Comunque una volta avevo letto sul sito ufficiale che mi sembra che ci siano delle librerie o delle api apposite per sviluppare questo tipo di applicazioni
Certo. Per scrivere le estensioni si deve far uso delle api di ruby per far comunicare i due linguaggi senza che si prendano a cazzotti. Ma funziona allo stesso modo anche in python.
Addirittura disarmante? Assembly per il simil-cpuz che volevi scrivere in ruby?
Capire dove mettere due o tre macro nel codice C è stato di sicuro più facile che scrivere questo:
__asm__ __volatile__ (
"mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%ebx, %%esi"
: "=a" (regs[0]), "=S" (regs[1]),
"=c" (regs[2]), "=d" (regs[3])
: "0" (op)
);
E per scrivere una estensione hai trovato la documentazione specifica per cpuz oppure una documentazione generale?
Quando hai un dubbio fai sempre riferimento alla documentazione ufficiale. Deve diventare la tua bibbia.
~FullSyst3m~
24-11-2008, 16:47
Carta e penna... solo alla fine il codice. :Prrr:
Azz, ho corretto il post troppo tardi, mi hai anticipato :D
Apparte che quel codice non l'ho scritto io, ma era sul libro (io uso carta e penna dovresti saperlo ormai :Prrr:), poi sono in ufficio e non l'avevo guardato con attenzione. Ora che il mio capo è uscito ho guardato il codice con attenzione e ho scoperto l'errore del libro :Prrr:
In pratica è la condizione, come hai evidenziato tu, ma per accorciare il codice c'è un altra cosa che si può fare, cioè eliminare Indice = Inizio e sostituire tutte le occorrenze di Indice con Inizio ;)
~FullSyst3m~
24-11-2008, 16:54
Vuoi il codice così appena finisci il libro puoi provare a riscriverlo in python? :)
Se quando finisco il libro ho le conoscenze necessarie perchè no? Mi farebbe piacere e mi servirebbe anche come studio ed esercizio ;) Ma alla fine tu ce l'hai fatto a scriverlo?
Certo. Per scrivere le estensioni si deve far uso delle api di ruby per far comunicare i due linguaggi senza che si prendano a cazzotti. Ma funziona allo stesso modo anche in python.
Io parlavo di questo http://www.cpuid-pro.com/index.php
Capire dove mettere due o tre macro nel codice C è stato di sicuro più facile che scrivere questo:
__asm__ __volatile__ (
"mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%ebx, %%esi"
: "=a" (regs[0]), "=S" (regs[1]),
"=c" (regs[2]), "=d" (regs[3])
: "0" (op)
);
Che casino assembly. Ma ti serviva per il simil-cpuz?
Quando hai un dubbio fai sempre riferimento alla documentazione ufficiale. Deve diventare la tua bibbia
Alla documentazione ufficiale del linguaggio giusto? Comunque grazie dei consigli, ne farò tesoro
Se quando finisco il libro ho le conoscenze necessarie perchè no? Mi farebbe piacere e mi servirebbe anche come studio ed esercizio ;) Ma alla fine tu ce l'hai fatto a scriverlo?
Non l'ho mai finito per mancanza di voglia ma funziona. Te lo allego come zip.
Io parlavo di questo http://www.cpuid-pro.com/index.php
Anni fa sono riuscito a farmi spedire a casa i manuali dalla intel. Uso direttamente quelli. :)
Che casino assembly. Ma ti serviva per il simil-cpuz?
Purtroppo si. Come ha fatto notare prima Anonimo non c'è modo di parlare direttamente con la cpu da Ruby.
DanieleC88
24-11-2008, 17:10
Anni fa sono riuscito a farmi spedire a casa i manuali dalla intel. Uso direttamente quelli. :)
Perdonatemi se vado un po' OT: sai per caso se li mandano ancora gratuitamente come facevano un tempo? I PDF mi cominciano a stare scomodi. :D
Perdonatemi se vado un po' OT: sai per caso se li mandano ancora gratuitamente come facevano un tempo? I PDF mi cominciano a stare scomodi. :D
Non saprei. :(
~FullSyst3m~
24-11-2008, 17:42
Non l'ho mai finito per mancanza di voglia ma funziona. Te lo allego come zip.
Se non l'hai finito come funziona??
Anni fa sono riuscito a farmi spedire a casa i manuali dalla intel. Uso direttamente quelli. :)
Sarà una domanda banale, ma cosa c'entrano adesso i manuali della Intel?
Purtroppo si. Come ha fatto notare prima Anonimo non c'è modo di parlare direttamente con la cpu da Ruby
Non potevi usare C o C++? Comunque se è cosi allora non credo che quando finirò il libro potrò riscrivere il tuo programmino in Python, assembly non l'ho mai fatto e non ho intenzione di toccarlo prima dell'uni sinceramente
Perdonatemi se vado un po' OT: sai per caso se li mandano ancora gratuitamente come facevano un tempo? I PDF mi cominciano a stare scomodi.
Servono per programmare in assembly i processori (della Intel ovviamente) questi manuali?
DanieleC88
24-11-2008, 18:03
Servono per programmare in assembly i processori (della Intel ovviamente) questi manuali?
I manuali di cui parlo descrivono nel dettaglio l'architettura x86, non si limitano all'assembly (e quindi sono applicabili anche ad altri processori che seguono la stessa architettura, anche se non Intel). Ad esempio in questo momento non mi sono strettamente indispensabili, ma posso consultarli per sapere precisamente il comportamento della MMU, in modo da approfondire quanto descritto nel libro di sistemi operativi (che lo descrive, sì, ma senza scendere così tanto in basso nei dettagli).
MasterDany
24-11-2008, 18:14
sul paragrafo 4.6
Non risco a capire l'esercizio:
Scrivi due funzioni basate sugli esempi proprosti,una che confronta x e y(Confronta(x,y)) e l'altra che controlla se un valore passato come parametro appartiene ad una lista di valori validi(ElaboraScelta(scelta)).
Allora la prima funzione è:
def Confronta(x,y):
if x<y:
print x,"è minore di",y
elif x>y:
print x,"è maggiore di",y
if x<y:
print x,"è minore di",y
else x>y:
print x, "e",y,"sono uguali"
L'altra funzione??
def ElaboraScelta(scelta):
if.....
Grazie!
DanieleC88
24-11-2008, 18:21
L'altra funzione??
Non so di cosa tratti il paragrafo in questione, ma secondo me puoi provare a ragionare sui tipi di dati che potrebbero tornarti utili nel risolvere il problema... :D
MasterDany
24-11-2008, 18:21
forse ho capito basta scrivere:
if x==5:
.....
elif x==6:
.....
elif x==7:
.....
else:
print "non valida"
DanieleC88
24-11-2008, 18:27
Una catena di if è certamente una soluzione accettabile. Ma non la migliore; almeno, di sicuro non è la più leggibile. Vedrai che appena arriverà cdimauro ti bacchetterà. :asd:
Hai già affrontato liste e dizionari? Se non lo hai ancora fatto, allora lascia stare e pensaci più in là. Se invece lo hai già fatto, ripensa alle operazioni che ti consentono di fare. ;)
MasterDany
24-11-2008, 18:31
Sto studiando le condizione ancora non ci sono arrivato li
Perdono Cesare!
~FullSyst3m~
24-11-2008, 19:22
I manuali di cui parlo descrivono nel dettaglio l'architettura x86, non si limitano all'assembly (e quindi sono applicabili anche ad altri processori che seguono la stessa architettura, anche se non Intel). Ad esempio in questo momento non mi sono strettamente indispensabili, ma posso consultarli per sapere precisamente il comportamento della MMU, in modo da approfondire quanto descritto nel libro di sistemi operativi (che lo descrive, sì, ma senza scendere così tanto in basso nei dettagli).
Interessante, allora visto che mi serviranno all'uni sono interessato anche io a questi manuali :D Tu quali pdf hai?
sul paragrafo 4.6
Non risco a capire l'esercizio:
Allora la prima funzione è:
L'altra funzione??
Grazie!
L'altra funzione, come dice il titolo, devi elaborare una scelta ed eseguire il ramo specifico in base alla scelta, esempio:
def ElaboraScelta(Scelta):
if Scelta == "A":
print "La tua scelta è A"
if Scelta == "B":
print "La tua scelta corrisponde a B"
else:
print "Scelta non valida"
Al posto dei print ovviamente puoi mettere anche delle funzioni o molte altre cose (ma lo farai più avanti)
Una catena di if è certamente una soluzione accettabile. Ma non la migliore; almeno, di sicuro non è la più leggibile. Vedrai che appena arriverà cdimauro ti bacchetterà. :asd:
Hai già affrontato liste e dizionari? Se non lo hai ancora fatto, allora lascia stare e pensaci più in là. Se invece lo hai già fatto, ripensa alle operazioni che ti consentono di fare. ;)
Al momento non può usare altro all'infuori di if, è nei primissimi capitoli dove si parla di condizioni e quindi sta studiando if, elif, else e compagnia bella. I dizionari e le liste sono nei capitoli successivi
Se non l'hai finito come funziona??
Non ha tutte le funzioni che volevo avesse ma le cose principali ci sono tutte :)
Sarà una domanda banale, ma cosa c'entrano adesso i manuali della Intel?
Per ricevere informazioni sulla cpu si deve usare una istruzione chiamata cpuid. Sui manuali è spiegato il suo funzionamento, i valori di ritorno, ci sono persino esempi in pseudo codice e diagrammi a blocchi.
~FullSyst3m~
24-11-2008, 19:35
Non ha tutte le funzioni che volevo avesse ma le cose principali ci sono tutte :)
Per ricevere informazioni sulla cpu si deve usare una istruzione chiamata cpuid. Sui manuali è spiegato il suo funzionamento, i valori di ritorno, ci sono persino esempi in pseudo codice e diagrammi a blocchi.
Molto interessante.. per avere questi manuali quindi non sai come fare? Potresti postare almeno il titolo e qualche informazione? Cosi vedo se li trovo da qualche parte.
Comunuqe ho dato un'occhiata veloce ai sorgenti, ho visto che c'è un file .c oltre ai sorgenti ruby. Non sapevo comunque che era possibile scrivere ad esempio codice assembly e codice C assieme.
Molto interessante.. per avere questi manuali quindi non sai come fare? Potresti postare almeno il titolo e qualche informazione? Cosi vedo se li trovo da qualche parte.
I manuali li trovi qui. http://developer.intel.com/products/processor/manuals/index.htm
Una volta era possibile ordinarli in modo gratuiti e ti arrivavano a casa tramite FedEx. Ora non so se li mandano ancora gratuitamente. Puoi sempre scaricarti i pdf e tenerteli da parte e stamparti solo quelle due o tre pagine che ti interessano quando ne hai bisogno.
~FullSyst3m~
24-11-2008, 20:09
I manuali li trovi qui. http://developer.intel.com/products/processor/manuals/index.htm
Una volta era possibile ordinarli in modo gratuiti e ti arrivavano a casa tramite FedEx. Ora non so se li mandano ancora gratuitamente. Puoi sempre scaricarti i pdf e tenerteli da parte e stamparti solo quelle due o tre pagine che ti interessano quando ne hai bisogno.
Ok, grazie. Riguardo al tuo codice: come mai hai scritto codice assembly insieme al codice C, oltre ai sorgenti ruby? Sempre per il fatto di arrivare a poter gestire il livello più basso della macchina?
DanieleC88
24-11-2008, 20:21
Ok, grazie. Riguardo al tuo codice: come mai hai scritto codice assembly insieme al codice C, oltre ai sorgenti ruby? Sempre per il fatto di arrivare a poter gestire il livello più basso della macchina?
Perché gli serviva l'istruzione assembly CPUID, che è un'istruzione specifica dell'architettura. Come tale, nessun codice C può utilizzarla senza passare per l'assembly.
~FullSyst3m~
24-11-2008, 20:40
Perché gli serviva l'istruzione assembly CPUID, che è un'istruzione specifica dell'architettura. Come tale, nessun codice C può utilizzarla senza passare per l'assembly.
Affascinante... e ruby per "comprendere" questo sorgente ha bisogno di API particolari?
cdimauro
24-11-2008, 20:51
Se non ricordo male i post di fek, l'aspetto della memoria mi pareva fosse il più critico, specie per quanto riguardava la frammentazione dell'heap a runtime da cui conseguiva l'eseginza di un controllo esatto dell'allocazione e distruzione degli oggetti.
Ciao.
Sì, era l'uso della memoria il problema principale. L'ha ribadito di recente anche qui (http://www.appuntidigitali.it/2711/videogiochi-non-solo-c/).
Anche volendo a volte è impossibile passare a python. Prova ad esempio a metterti nei panni i Microsoft. Vuoi portare il codice di Vista in python ma anche mettendo tutti ad una tastiera, donne delle pulizie comprese, a riscrivere le 120 milioni di linee di codice dovresti fermare lo sviluppo per almeno 10 anni.
Perché no? 10 anni mi sembrano decisamente troppi, considerata la facilità con cui si scrive codice con Python. :cool:
È questo, dunque, il motivo per il quale viene mantenuto il codice C per i sistemi operativi? L'efficienza non c'entra niente? Tu, oggi, un sistema operativo lo scriveresti in python o ruby? :bimbo:
Se dovessi cominciare da zero lo farei in Python. Fino a poco tempo fa pensavo fosse un campo alieno a linguaggi come questo, ma poi mi ha fatto cambiare idea fek e questo: http://en.wikipedia.org/wiki/Singularity_(operating_system)
Tra l'altro Python ha strumenti di libreria per manipolare oggetti non managed (puntatori in sostanza).
Comunque vedo che non di rado ti si trova in thread che parlano di Python:appena trovi un appiglio ti fiondi subito. Strano, vero? :fagiano:
Se il codice scritto in ruby fosse veloce quanto quello scritto in C si. Il motivo economico sarebbe l'unico ostacolo che mi impedirebbe di riscrivere Linux o Windows. Partendo da zero invece sceglierei senza dubbio ruby. Ovviamente nella realtà ruby è molto più lento quindi è semplicemente impensabile sceglierlo per questo tipo di progetti.
Ci sono sempre le VM dotate di JIT. Ecco qui (http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=psyco&lang2=icc). Non mi sembra male come risultato, e ci sono ancora ampi margini di miglioramento sia per quanto riguarda il bytecode generato da Python (e non solo: si possono applicare notevoli ottimizzazioni all'AST, e aggiungere anche nuovi opcode per gestire casi molto comuni), sia sulle ottimizzazioni possibili con psyco (che tra l'altro genera soltanto codice per 386). :cool:
Beh, anche la gestione del tutto automatica delle risorse hardware di questi linguaggi potrebbe essere un problema per lo sviluppo di un sistema operativo.
Mumble. Se ti riferisci al garbage collector, è possibile controllarlo (per lo meno in Python). Se ti riferisci ad altro, non ho capito.
Bisognerebbe sviluppare una versione apposita di Python e Ruby con le quali è possibile accedere alle risorse di basso livello.
Nemmeno col C si può accedere direttamente a qualunque risorsa di basso livello: infatti si usa l'assembly o il linguaggio macchina in questi casi.
Ad esempio le in e out per i dispositivi di I/O sono gestite in C tramite apposite funzioni di libreria. Funzioni che si possono realizzare tranquillamente anche per Python, Ruby, ecc.
Praticamente però il fatto che non esista e non è in via di sviluppo un compilatore statico per questi linguaggi è sicuramente un altro ostacolo alla realizzazione di quest'obiettivo.
Ciao
http://codespeak.net/pypy/dist/pypy/doc/home.html :cool:
Basta scrivere delle piccole estensioni in C. Almeno io ho fatto così quando ho provato a scrivere una specie di cpuz in ruby. Oltretutto è di una semplicità disarmante. Ci ho messo di più a scrivere le 4 righe di assembly che a capire come scrivere una estensione.
Esattamente. D'altra parte l'assembly è assolutamente necessario in alcuni ambiti: non ci sono C o C++ che tengono.
Python è un linguaggio interpretato, e ciò lo rende molto comodo, mentre C e C++ sono linguaggi che vengono compilati, quindi il codice che produci alla fine verrà eseguito direttamente dalla macchina, senza intermediari, e chiaramente c'è un guadagno sensibile per quel che riguarda le prestazioni.
Non è esatto. Python è un linguaggio compilato, ma la cui implementazione più diffusa genera bytecode e ha bisogno di una virtual machine per girare.
Ciò non toglie che sia possibile generare eseguibili. Vedi PyPy, ad esempio.
Un linguaggio definisce soltanto sintassi e semantica. Le implementazioni sono tutt'altra cosa. ;)
Ma non sono assuefatto! :p Semplicemente mi piace, quando posso, esplorare qualcosa di nuovo. Dopo diversi anni di C, C, e ancora C, voglio esplorare nuovi campi (e non mi dispiace l'idea di dare una chance anche a Ruby, più in là :D).
:mbe:
Semplicemente, come dicevo prima, sono obiettivo: scelgo il linguaggio che mi fa più comodo. Python lo sto trovando molto utile e rapido per i vari scopi "didattici", ma non essendone ancora padrone a pieno, svilupperei ancora in C le mie applicazioni. Per ora. :D
Allora... esercitati!!! :)
Il discorso può essere fatto anche con altri linguaggi. Ad esempio perché il kernel di linux non viene riscritto in C++?
Questa è una domanda a trabocchetto, perché così se ti rispondo trovi la scusa per sospendermi, vero? :asd:
Vuoi il codice così appena finisci il libro puoi provare a riscriverlo in python? :)
L'avevo già realizzato io. :fagiano:
Capire dove mettere due o tre macro nel codice C è stato di sicuro più facile che scrivere questo:
__asm__ __volatile__ (
"mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%ebx, %%esi"
: "=a" (regs[0]), "=S" (regs[1]),
"=c" (regs[2]), "=d" (regs[3])
: "0" (op)
);
E per forza: hai usato quella porcata immane della sintassi AT&T. :muro: :cry:
Perdonatemi se vado un po' OT: sai per caso se li mandano ancora gratuitamente come facevano un tempo? I PDF mi cominciano a stare scomodi. :D
Purtroppo no. Mi sa che dopo che c'è stata una sproposita mole di richieste provenienti "casualmente" dall'Italia e tutte nello stesso periodo, alla Intel hanno deciso di chiudere i rubinetti.
Una catena di if è certamente una soluzione accettabile. Ma non la migliore; almeno, di sicuro non è la più leggibile. Vedrai che appena arriverà cdimauro ti bacchetterà. :asd:
:mbe: Però è agli inizi, per cui è perdonato.
Hai già affrontato liste e dizionari? Se non lo hai ancora fatto, allora lascia stare e pensaci più in là. Se invece lo hai già fatto, ripensa alle operazioni che ti consentono di fare. ;)
Già.
Ok, grazie. Riguardo al tuo codice: come mai hai scritto codice assembly insieme al codice C, oltre ai sorgenti ruby? Sempre per il fatto di arrivare a poter gestire il livello più basso della macchina?
Sì.
~FullSyst3m~
24-11-2008, 23:23
VICIUS ho dato un'occhiata al codice di ruby, alcune cose sono simili al Python, tipo la definizione di funzioni.
P.S: pure la licenza in inglese hai messo, sembri un madrelingua inglese :asd:
P.S: pure la licenza in inglese hai messo, sembri un madrelingua inglese :asd:
È una licenza BSD standard. Ho fatto semplicemente copia e incolla :asd:
Sì, era l'uso della memoria il problema principale. L'ha ribadito di recente anche qui (http://www.appuntidigitali.it/2711/videogiochi-non-solo-c/).
Perché no? 10 anni mi sembrano decisamente troppi, considerata la facilità con cui si scrive codice con Python. :cool:
Secondo me non ce la si fa in meno di un decennio anche con python.
Questa è una domanda a trabocchetto, perché così se ti rispondo trovi la scusa per sospendermi, vero? :asd:
:fiufiu:
L'avevo già realizzato io. :fagiano:
Non sei te quello che ha bisogno di imparare.
E per forza: hai usato quella porcata immane della sintassi AT&T. :muro: :cry:
Non so se gcc prende la sintassi intel in mezzo al codice C. :muro:
AnonimoVeneziano
25-11-2008, 00:32
Nemmeno col C si può accedere direttamente a qualunque risorsa di basso livello: infatti si usa l'assembly o il linguaggio macchina in questi casi.
Beh, in C si può gestire la memoria vedendola come un array, in python non mi risulta. Era questo che intendevo
cdimauro
25-11-2008, 07:33
È una licenza BSD standard. Ho fatto semplicemente copia e incolla :asd:
Licenza BSD? Pensavo peggio onestamente. :fagiano:
Secondo me non ce la si fa in meno di un decennio anche con python.
Don't underestimate the power of Python:
http://sithsigma.files.wordpress.com/2007/06/darthvader.jpg
Non sei te quello che ha bisogno di imparare.
Oops. :stordita:
Non so se gcc prende la sintassi intel in mezzo al codice C. :muro:
Mi sembra proprio di no. Dovresti ricorrere al nasm.
Beh, in C si può gestire la memoria vedendola come un array, in python non mi risulta. Era questo che intendevo
Anche in Python puoi farlo usando la libreria ctypes. Ovviamente io la userei soltanto per accedere a precise locazioni di memoria, tipo quelle in cui vengono mappati i registri di un dispositivo, un frame buffer, o simile.
Per tutto il resto continuerei a fregarmene di vedere la memoria come un array.
Anche in Python puoi farlo usando la libreria ctypes. Ovviamente io la userei soltanto per accedere a precise locazioni di memoria, tipo quelle in cui vengono mappati i registri di un dispositivo, un frame buffer, o simile.
Libraria che per sviluppare un sistema operativo non puoi usare perché fa uso di librerie del compilatore C che si appoggiano a primitive del sistema operativo.
~FullSyst3m~
25-11-2008, 08:12
È una licenza BSD standard. Ho fatto semplicemente copia e incolla :asd:
:eek: :eek: :eek:
Licenza BSD? Pensavo peggio onestamente
Dovrò informarmi pure sulle licenze per stare al vostro passo. Potreste avere una carriera da avvocato informatico nel futuro :asd:
cdimauro
25-11-2008, 08:38
Libraria che per sviluppare un sistema operativo non puoi usare perché fa uso di librerie del compilatore C che si appoggiano a primitive del sistema operativo.
Libreria che si può riadattare facilmente se il s.o... è Python stesso. ;)
Libreria che si può riadattare facilmente se il s.o... è Python stesso. ;)
Peccato che il tuo sistema operativo in Python senza poter accedere alla memoria come se fosse un vettore non possa esistere.
Sicuramente è un ostacolo aggirabile, puoi sempre implementarla in assembly.
~FullSyst3m~
25-11-2008, 08:42
Libreria che si può riadattare facilmente se il s.o... è Python stesso. ;)
Però prima il so in Python si deve scrivere altrimenti come la riadatti?
Comunuqe posto un esercizio che ho fatto per vedere che ne pensate, so che non siamo in classe con la maestra che corregge i compiti ma ogni consiglio è importante e voglio vedere se sono sulla buona strada.
"Esercizio: aggiungi un quarto parametro, Fine, che specifica dove interrompere la ricerca.
Attenzione: questo esercizio non è semplice come sembra. Il valore di default di Fine dovrebbe essere len(Stringa) ma questo non funziona. I valori di default sono valutati al momento della definizione della funzione, non quando questa è chiamata: quando Trova viene definita, Stringa non esiste ancora così non puoi conoscere la sua lunghezza. Trova un sistema per aggirare l'ostacolo."
Io l'ho risolto cosi e sembra funzioni:
def Trova(Stringa, Carattere, Inizio=0, Fine=0):
if Fine == 0:
Fine = len(Stringa)
while Inizio < Fine:
if Stringa[Inizio] == Carattere:
return Inizio
Inizio += 1
return - 1
Altra cosa...esistono compilatori in codice macchina per Python e questo è appurato. Ma questi compilatori per Python come gestiscono il il garbage collector ? Sicuramente il garbage collector farà uso di primitive del sistema operativo per poter funzionare. Anche queste andranno riscritte in assembly.
Oppure bisogna modificare il linguaggio per escludere il garbage collector e permettere allocazione e deallocazione esplicite.
E la traduzione delle altre funzionalità del linguaggio come viene effettuata ? Vengono utilizzare librerie del linguaggio C ? Mi risponderai: facciamo i linking statico, bene, e queste librerie del linguaggio C utilizzano system call ? Ahi...a questo punto prima di poter cominciare a lavorare in Python su un sistema operativo dovrò mettermi praticamente a riscrivere il compilatore Python.
Al contrario in C siamo sicuri che se scrivo una funzione che non richiama funzioni di libreria le system call non saranno usate.
Con un compilatore C i primi passi per scrivere un sistema operativo (ovviamente dopo le parti in asm: il boot loader, che si può prendere già pronto, e l'avvio in modalità protetta con la configurazione dei registri della CPU) sono di scrivere un minimale gestore di memoria: una volta scritto quello (e non è detto che serva l'assembly) siamo a cavallo e possiamo iniziare lo sviluppo di tutti gli altri moduli del kernel.
Al contrario in Python dovrò riscrivermi il compilatore, per carità, è fattibile, ma quanti bug ci potrò inserire ? Imho l'hai fatto più facile di quello che sembra ;)
Oppure ci appoggiamo ad un subsystem scritto in C e non in assembly ? In tal caso è ancora più facile...
Sia chiaro che il post sopra vale anche per tutti gli altri linguaggi di alto e altissimo livello. C++ compreso se si va ad utilizzare in modo non compatibile con il C ;)
~FullSyst3m~
25-11-2008, 09:48
Altra cosa...esistono compilatori in codice macchina per Python e questo è appurato. Ma questi compilatori per Python come gestiscono il il garbage collector ? Sicuramente il garbage collector farà uso di primitive del sistema operativo per poter funzionare. Anche queste andranno riscritte in assembly.
Oppure bisogna modificare il linguaggio per escludere il garbage collector e permettere allocazione e deallocazione esplicite.
E la traduzione delle altre funzionalità del linguaggio come viene effettuata ? Vengono utilizzare librerie del linguaggio C ? Mi risponderai: facciamo i linking statico, bene, e queste librerie del linguaggio C utilizzano system call ? Ahi...a questo punto prima di poter cominciare a lavorare in Python su un sistema operativo dovrò mettermi praticamente a riscrivere il compilatore Python.
Al contrario in C siamo sicuri che se scrivo una funzione che non richiama funzioni di libreria le system call non saranno usate.
Con un compilatore C i primi passi per scrivere un sistema operativo (ovviamente dopo le parti in asm: il boot loader, che si può prendere già pronto, e l'avvio in modalità protetta con la configurazione dei registri della CPU) sono di scrivere un minimale gestore di memoria: una volta scritto quello (e non è detto che serva l'assembly) siamo a cavallo e possiamo iniziare lo sviluppo di tutti gli altri moduli del kernel.
Al contrario in Python dovrò riscrivermi il compilatore, per carità, è fattibile, ma quanti bug ci potrò inserire ? Imho l'hai fatto più facile di quello che sembra ;)
Oppure ci appoggiamo ad un subsystem scritto in C e non in assembly ? In tal caso è ancora più facile...
:ops:
cdimauro
25-11-2008, 13:29
Peccato che il tuo sistema operativo in Python senza poter accedere alla memoria come se fosse un vettore non possa esistere.
Sicuramente è un ostacolo aggirabile, puoi sempre implementarla in assembly.
Altra cosa...esistono compilatori in codice macchina per Python e questo è appurato. Ma questi compilatori per Python come gestiscono il il garbage collector ? Sicuramente il garbage collector farà uso di primitive del sistema operativo per poter funzionare. Anche queste andranno riscritte in assembly.
Oppure bisogna modificare il linguaggio per escludere il garbage collector e permettere allocazione e deallocazione esplicite.
E la traduzione delle altre funzionalità del linguaggio come viene effettuata ? Vengono utilizzare librerie del linguaggio C ? Mi risponderai: facciamo i linking statico, bene, e queste librerie del linguaggio C utilizzano system call ? Ahi...a questo punto prima di poter cominciare a lavorare in Python su un sistema operativo dovrò mettermi praticamente a riscrivere il compilatore Python.
Al contrario in C siamo sicuri che se scrivo una funzione che non richiama funzioni di libreria le system call non saranno usate.
Con un compilatore C i primi passi per scrivere un sistema operativo (ovviamente dopo le parti in asm: il boot loader, che si può prendere già pronto, e l'avvio in modalità protetta con la configurazione dei registri della CPU) sono di scrivere un minimale gestore di memoria: una volta scritto quello (e non è detto che serva l'assembly) siamo a cavallo e possiamo iniziare lo sviluppo di tutti gli altri moduli del kernel.
Al contrario in Python dovrò riscrivermi il compilatore, per carità, è fattibile, ma quanti bug ci potrò inserire ? Imho l'hai fatto più facile di quello che sembra ;)
Oppure ci appoggiamo ad un subsystem scritto in C e non in assembly ? In tal caso è ancora più facile...
Sia chiaro che il post sopra vale anche per tutti gli altri linguaggi di alto e altissimo livello. C++ compreso se si va ad utilizzare in modo non compatibile con il C ;)
Esattamente. Sono gli stessi problemi che ha un Singolarity realizzato in C# e con parti in C o assembly.
Ovviamente si potrebbe anche fare a meno del C e usare soltanto l'assembly per le parti assolutamente necessarie per interfacciarsi con dettagli di livello (troppo) basso, ma ci sarebbe un costo maggiore da considerare per lo sviluppo.
~FullSyst3m~
25-11-2008, 14:24
Esattamente. Sono gli stessi problemi che ha un Singolarity realizzato in C# e con parti in C o assembly.
Ovviamente si potrebbe anche fare a meno del C e usare soltanto l'assembly per le parti assolutamente necessarie per interfacciarsi con dettagli di livello (troppo) basso, ma ci sarebbe un costo maggiore da considerare per lo sviluppo.
Oltre al costo io direi che ci sarebbe anche un tempo maggiore.
Comuque riguardo __init__ e __str__ il libro p troppo generico. Non si capisce un granchè, soprattutto le ultime due frasi del paragrafo 14.7:
"Quando scriviamo una nuova classe iniziamo quasi sempre scrivendo __init__ (la funzione che rende più facile istanziare oggetti) e __str__ (utile per il debug). "
Cioè, che funzione hanno di preciso __str__ e __init__?
Cioè, che funzione hanno di preciso __str__ e __init__?
La funzione __init__ non fa altro che inizializare tutte gli attributi della clase ad un valore standard così il codice che usa quell'oggetto non se ne deve occupare. Ad esempio la __init__ della classe punto potrebbe settare x e y nell'origine. Nota che la funzione viene chiamata automaticamente da python tu non devi fare niente.
__str__ invece ritorna una stringa che rappresenta l'oggetto. Invece di scrivere tutte le volte così:
print "(" + str(punto.x) + "," + str(punto.y) + ")"
Puoi limitarti a scrivere:
print punto
~FullSyst3m~
25-11-2008, 16:07
La funzione __init__ non fa altro che inizializare tutte gli attributi della clase ad un valore standard così il codice che usa quell'oggetto non se ne deve occupare. Ad esempio la __init__ della classe punto potrebbe settare x e y nell'origine. Nota che la funzione viene chiamata automaticamente da python tu non devi fare niente.
__str__ invece ritorna una stringa che rappresenta l'oggetto. Invece di scrivere tutte le volte così:
print "(" + str(punto.x) + "," + str(punto.y) + ")"
Puoi limitarti a scrivere:
print punto
Tutto qua?? Questo è sul libro, l'ho studiato, però mi è sembrato che mancasse qualcosa, come se era un pò generica la spiegazione. Meglio cosi :D
In definitiva allora __init__ viene caricato in automatico al momento dell'instanziazione di un oggetto e __str__ invece quando viene usata l'istruzione print. Corretto?
Tutto qua?? Questo è sul libro, l'ho studiato, però mi è sembrato che mancasse qualcosa, come se era un pò generica la spiegazione. Meglio cosi :D
In definitiva allora __init__ viene caricato in automatico al momento dell'instanziazione di un oggetto e __str__ invece quando viene usata l'istruzione print. Corretto?
Si tutto qui :D
AnonimoVeneziano
25-11-2008, 16:31
Ovviamente devi dare una tua implementazione della funzione __str__ che ritorni una stringa che è la corretta rappresentazione (in formato stringa) dell'attuale stato della tua classe.
Una domanda per Cesare:
Mi trovo a dover distribuire un applicazione fatta in Python a degli utenti che usano Windows. Dato che il target non è l'utente smaliziato che sa cos'è un interprete python più librerie ho deciso di pacchettizzare il tutto usando PY2EXE.
L'applicazione non è niente di gigantesco, ma nonostante ciò raggiunge la considerevole dimensione di 15 MB una volta pacchettizzata con PY2EXE includendo solo le librerie wxPython e mechanize.
Comprimendo il tutto in ZIP la dimensione della cartella scende fino a 5 MB che è già una dimensione più ragionevole, ma mi chiedevo se ci fosse un modo per ridurre ulteriormente la dimensione della cartella decompressa (una roba tipo UPX tanto per intenderci).
Ho cercato sul sito PY2EXE , ma non ho trovato niente a riguardo. Per caso tu ne sai qualcosa?
Grazie
Ciao
~FullSyst3m~
25-11-2008, 16:45
Ovviamente devi dare una tua implementazione della funzione __str__ che ritorni una stringa che è la corretta rappresentazione (in formato stringa) dell'attuale stato della tua classe
Cioè?
Comunque nel capitolo che sto facendo, riguardo l'overloading degli operatori alla fine c'è messo che per un trattato più ampio si può fare riferimento all'appendice. Il punto è che non so se mi conviene andare all'appendice visto che riguarda questo argomento, oppure studiare tutto il libro e poi fare le varie appendici alla fine. Non so che metodo di studio adottare, consigli?
AnonimoVeneziano
25-11-2008, 17:03
Cioè?
Esempio:
Classe "Tempo" definita senza fare l'overloading della funzione __str__ :
>>> class Tempo(object):
def __init__(self, ore, minuti, secondi):
self.ore = ore
self.minuti = minuti
self.secondi = secondi
>>> t = Tempo(5, 30, 20)
>>> print t
<__main__.Tempo object at 0x00BB6F10>
Come vedi la "print t" fornisce la rappresentazione standard dell'oggetto data dall'interprete
Facendo invece l'overloading della __str__ come in questo caso invece :
>>> class Tempo(object):
def __init__(self, ore, minuti, secondi):
self.ore = ore
self.minuti = minuti
self.secondi = secondi
def __str__(self):
return 'Il tempo è:\n\tOre: ' + str(self.ore) + '\n\tMinuti: ' + str(self.minuti) + '\n\tSecondi: ' + str(self.secondi)
>>> t = Tempo(5, 30, 20)
>>> print t
Il tempo è:
Ore: 5
Minuti: 30
Secondi: 20
Come vedi qua l'output della "print t" ha molto più senso per un utente rispetto alla rappresentazione standard dell'interprete .
Ciao
~FullSyst3m~
25-11-2008, 17:46
Esempio:
Classe "Tempo" definita senza fare l'overloading della funzione __str__ :
>>> class Tempo(object):
def __init__(self, ore, minuti, secondi):
self.ore = ore
self.minuti = minuti
self.secondi = secondi
>>> t = Tempo(5, 30, 20)
>>> print t
<__main__.Tempo object at 0x00BB6F10>
Come vedi la "print t" fornisce la rappresentazione standard dell'oggetto data dall'interprete
Facendo invece l'overloading della __str__ come in questo caso invece :
>>> class Tempo(object):
def __init__(self, ore, minuti, secondi):
self.ore = ore
self.minuti = minuti
self.secondi = secondi
def __str__(self):
return 'Il tempo è:\n\tOre: ' + str(self.ore) + '\n\tMinuti: ' + str(self.minuti) + '\n\tSecondi: ' + str(self.secondi)
>>> t = Tempo(5, 30, 20)
>>> print t
Il tempo è:
Ore: 5
Minuti: 30
Secondi: 20
Come vedi qua l'output della "print t" ha molto più senso per un utente rispetto alla rappresentazione standard dell'interprete .
Ciao
Per come l'avevi detta prima sembrava un'altra cosa. Questo è normale che sia cosi ;)
AnonimoVeneziano
25-11-2008, 17:49
Per come l'avevi detta prima sembrava un'altra cosa. Questo è normale che sia cosi ;)
Ok, a scanso di incomprensioni :D
cdimauro
25-11-2008, 20:14
Oltre al costo io direi che ci sarebbe anche un tempo maggiore.
Certamente.
Una domanda per Cesare:
Mi trovo a dover distribuire un applicazione fatta in Python a degli utenti che usano Windows. Dato che il target non è l'utente smaliziato che sa cos'è un interprete python più librerie ho deciso di pacchettizzare il tutto usando PY2EXE.
L'applicazione non è niente di gigantesco, ma nonostante ciò raggiunge la considerevole dimensione di 15 MB una volta pacchettizzata con PY2EXE includendo solo le librerie wxPython e mechanize.
Comprimendo il tutto in ZIP la dimensione della cartella scende fino a 5 MB che è già una dimensione più ragionevole, ma mi chiedevo se ci fosse un modo per ridurre ulteriormente la dimensione della cartella decompressa (una roba tipo UPX tanto per intenderci).
Ho cercato sul sito PY2EXE , ma non ho trovato niente a riguardo. Per caso tu ne sai qualcosa?
Grazie
Ciao
Non ne sono a conoscenza. Comunque il risultato che hai ottenuto è già ottimo. wxPython da solo si mangia parecchi mega, ed è l'elemento che maggiormente incide in questo caso, ma... non se ne può fare a meno.
A parte cercare di includere soltanto i moduli necessari, non penso si possa fare molto (ma se non erro Py2Exe dovrebbe provvedere già alla selezione dei soli moduli necessari).
~FullSyst3m~
26-11-2008, 17:47
Funzione DirittoRovescio del libro:
def DirittoRovescio(Stringa):
import copy
Rovescio = copy.copy(Stringa)
Rovescio.reverse()
print str(Stringa) + str(Rovescio)
come mai con le stringhe non funziona?
Poi, poco più avanti c'è la funzione reverse, che io (forse sono stupido) non riesco a fare funzionare perchè la chiamo in tutti i modi (notazione punto, chiamata di funzione ecc) però mi dà sempre errore. Eccola:
def Reverse(self):
self.x, self.y = self.y, self.x
Il paragrafo che tratta queste cose è il 14.9, Polimorfismo http://www.python.it/doc/Howtothink/Howtothink-html-it/chap14.htm
Visto che ne avete parlato, faccio qui la mia proposta per il contest.
L'idea è quella di rendere il più possibile indipendente il contest dal linguaggio e di poter giudicare l'algoritmo migliore e non il programma più veloce.
Come fare ? L'unica soluzione che mi viene in mente è quella di proporre una soluzione di riferimento in pseudo-linguaggio data da chi propone il contest. Ovviamente questa sarà la soluzione più immediata, ma anche computazionalmente meno efficiente (ed esempio la forza bruta).
Per ogni linguaggio che partecipa al contest, il primo che lo usa deve proporre una soluzione che rispecchia fedelmente la soluzione in pseudo-linguaggio, con tanto di struttura e nomi corrispondenti.
Chi crea il contest si occuperà di raccogliere queste soluzioni nel primo post. Queste saranno le soluzioni di riferimento sulle quali il contest si dovrà basare e sulle quali verranno prese le misure di prestazioni delle soluzioni ottimizzate.
Posto 1000 il valore della soluzione di riferimento si dovrà ottenere il coefficiente relativo alla soluzione ottimizzata in questo modo:
X = (TempoEsecuzioneSoluzioneOttimizzata / TempoEsecuzioneSoluzioneRiferimento) * 1000
Vince il contest chi ottiene il coefficiente migliore rispetto alla soluzione di riferimento nel proprio linguaggio.
~FullSyst3m~
26-11-2008, 20:38
Visto che ne avete parlato, faccio qui la mia proposta per il contest.
L'idea è quella di rendere il più possibile indipendente il contest dal linguaggio e di poter giudicare l'algoritmo migliore e non il programma più veloce.
Come fare ? L'unica soluzione che mi viene in mente è quella di proporre una soluzione di riferimento in pseudo-linguaggio data da chi propone il contest. Ovviamente questa sarà la soluzione più immediata, ma anche computazionalmente meno efficiente (ed esempio la forza bruta).
Per ogni linguaggio che partecipa al contest, il primo che lo usa deve proporre una soluzione che rispecchia fedelmente la soluzione in pseudo-linguaggio, con tanto di struttura e nomi corrispondenti.
Chi crea il contest si occuperà di raccogliere queste soluzioni nel primo post. Queste saranno le soluzioni di riferimento sulle quali il contest si dovrà basare e sulle quali verranno prese le misure di prestazioni delle soluzioni ottimizzate.
Posto 1000 il valore della soluzione di riferimento si dovrà ottenere il coefficiente relativo alla soluzione ottimizzata in questo modo:
X = (TempoEsecuzioneSoluzioneOttimizzata / TempoEsecuzioneSoluzioneRiferimento) * 1000
Vince il contest chi ottiene il coefficiente migliore rispetto alla soluzione di riferimento nel proprio linguaggio.
Scusa, dove ne abbiamo parlato?
~FullSyst3m~
26-11-2008, 20:47
Funzione DirittoRovescio del libro:
def DirittoRovescio(Stringa):
import copy
Rovescio = copy.copy(Stringa)
Rovescio.reverse()
print str(Stringa) + str(Rovescio)
come mai con le stringhe non funziona?
Poi, poco più avanti c'è la funzione reverse, che io (forse sono stupido) non riesco a fare funzionare perchè la chiamo in tutti i modi (notazione punto, chiamata di funzione ecc) però mi dà sempre errore. Eccola:
def Reverse(self):
self.x, self.y = self.y, self.x
Non capisco come faccia a funzionare "nel libro". Il paragrafo che tratta queste cose è il 14.9, Polimorfismo http://www.python.it/doc/Howtothink/Howtothink-html-it/chap14.htm
Tornando in topic, apparte le cose che ho scritto, una cosa che non mi convince è che la funzione Reverse non ritorna nulla.. :confused:
Vincenzo1968
26-11-2008, 20:59
a parte.
AnonimoVeneziano
26-11-2008, 21:05
Tornando in topic, apparte le cose che ho scritto, una cosa che non mi convince è che la funzione Reverse non ritorna nulla.. :confused:
Beh grazie ... non c'è nessun return ....
come mai con le stringhe non funziona?
Probabilmente le stringhe non implementano la funzione reverse()
Poi, poco più avanti c'è la funzione reverse, che io (forse sono stupido) non riesco a fare funzionare perchè la chiamo in tutti i modi (notazione punto, chiamata di funzione ecc) però mi dà sempre errore.
Strano. Ho fatto una prova veloce e con la classe punto funziona. Posta il codice completo della classe e delle prove che hai fatto.
DanieleC88
26-11-2008, 21:11
una cosa che non mi convince è che la funzione Reverse non ritorna nulla.. :confused:
Perché, dovrebbe? :)
cdimauro
26-11-2008, 21:11
Funzione DirittoRovescio del libro:
def DirittoRovescio(Stringa):
import copy
Rovescio = copy.copy(Stringa)
Rovescio.reverse()
print str(Stringa) + str(Rovescio)
come mai con le stringhe non funziona?
Perché le stringhe non hanno il metodo reverse, perché questo è presente soltanto in oggetti di tipo sequenza che sono mutabili (e le stringhe non lo sono, visto che sono immutabili).
Credo ci sia un errore nel libro, perché se vedi dopo che ha definito DirittoRoverscio parla di liste, e infatti con queste funziona.
Poi, poco più avanti c'è la funzione reverse, che io (forse sono stupido) non riesco a fare funzionare perchè la chiamo in tutti i modi (notazione punto, chiamata di funzione ecc) però mi dà sempre errore. Eccola:
def Reverse(self):
self.x, self.y = self.y, self.x
Il paragrafo che tratta queste cose è il 14.9, Polimorfismo http://www.python.it/doc/Howtothink/Howtothink-html-it/chap14.htm
Questo metodo lo devi aggiungere alla definizione della classe Punto. E' così che funziona.
~FullSyst3m~
26-11-2008, 21:21
Perché le stringhe non hanno il metodo reverse, perché questo è presente soltanto in oggetti di tipo sequenza che sono mutabili (e le stringhe non lo sono, visto che sono immutabili).
Credo ci sia un errore nel libro, perché se vedi dopo che ha definito DirittoRoverscio parla di liste, e infatti con queste funziona.
Si infatti, in questo capitolo più che studiare ho cercato di scoprire gli errori.
Questo metodo lo devi aggiungere alla definizione della classe Punto. E' così che funziona.
L'ho aggiunto alla classe, ma mi dà sempre errore
cdimauro
26-11-2008, 21:26
Posta tutto il codice, la prova che hai fatto e l'errore che ti dà.
~FullSyst3m~
26-11-2008, 21:33
Posta tutto il codice, la prova che hai fatto e l'errore che ti dà.
Ho fatto semplicemente come è sul libro, e cioè ho scritto la funzione DirittoRovescio, poi ho scritto il modulo Reverse e ho chiamato DirittoRovescio, e mi dà errore. Ho pensato che magari era il libro che aveva qualche errore perchè non mi torna il fatto che chiamando DirittoRovescio viene chiamata anche Reverse, cosi ho chiamato Reverse con la notazione punto, ma niente. Comunque adesso sono sul divano con il cel, poi posto l'errore e il codice
cdimauro
26-11-2008, 22:28
Non è così. Leggi meglio quello che c'è scritto nel libro. La chiave di tutto è qui:
Le operazioni nel metodo DirittoERovescio includono copy, reverse e print.
copy funziona su ogni oggetto e abbiamo già scritto un metodo __str__ per gli oggetti di tipo Punto così l'unica cosa che ancora ci manca è il metodo reverse:
def reverse(self):
self.x , self.y = self.y, self.x
~FullSyst3m~
27-11-2008, 08:01
Non è così. Leggi meglio quello che c'è scritto nel libro. La chiave di tutto è qui:
Le operazioni nel metodo DirittoERovescio includono copy, reverse e print.
copy funziona su ogni oggetto e abbiamo già scritto un metodo __str__ per gli oggetti di tipo Punto così l'unica cosa che ancora ci manca è il metodo reverse:
def reverse(self):
self.x , self.y = self.y, self.x
Io l'ho letto il libro e anche bene. Ho scritto il metodo reverse e l'ho incapsulato nella classe, poi chiamo DirittoERovescio con l'oggetto Punto e mi dà errore
Perché, dovrebbe?
Non mi sono spiegato
Probabilmente le stringhe non implementano la funzione reverse()
Si infatti, probabilmente sarà un errore del libro come avevo pensato e come ha detto cdimauro
Strano. Ho fatto una prova veloce e con la classe punto funziona. Posta il codice completo della classe e delle prove che hai fatto.
Come hai provato scusa?
~FullSyst3m~
27-11-2008, 19:29
class Punto:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __str__(self):
return '(' + str(self.x) + ',' + str(self.y) + ')'
def __add__(self, AltroPunto):
return Punto(self.x + AltroPunto.x, self.y + AltroPunto.y)
def __sub__(self, AltroPunto):
return Punto(self.x - AltroPunto.x, self.y - AltroPunto.y)
def __mul__(self, AltroPunto):
return self.x * AltroPunto.x + self.y * AltroPunto.y
def __rmul__(self, AltroPunto):
return Punto(AltroPunto * self.x, AltroPunto * self.y)
def Reverse(self):
self.x, self.y = self.y, self.x
def DirittoRovescio(Stringa):
import copy
Rovescio = copy.copy(Stringa)
Rovescio.reverse()
print str(Stringa) + str(Rovescio)
P1 = Punto(3,4)
DirittoRovescio(P1)
Ecco cosa ottengo:
Rovescio.reverse()AttributeError: Punto instance has no attribute 'reverse'
Ora provo a cambiare qualcosa perchè alcuen cose non mi tornano, adesso ho postato questo codice per fare vedere che facendo come fa il libro a me non va, vorrei capire come lo ha chiamato VICIUS o cdimauro
class Punto:
...
def Reverse(self):
self.x, self.y = self.y, self.x
Deve chiamarsi reverse, con la r minuscola.
~FullSyst3m~
27-11-2008, 19:45
Deve chiamarsi reverse, con la r minuscola.
Cavolo, ora ho capito. Guardandola meglio, c'è la notazione punto, quindi la funzione non è "indipendente", ma viene chiamata sull'oggetto Rovescio che altro non è che la copia del punto passato come parametro. Scusatemi, errore grossolano mio. Avevo scritto la funzione con la r grande perchè le scrivo sempre cosi e credevo che era indipendente, ora che ho guardato meglio il codice però ho capito l'erroraccio che ho fatto :muro: :muro: :muro: :muro:
cdimauro
27-11-2008, 20:01
Sbagliato:
def Reverse(self):
self.x, self.y = self.y, self.x
Corretto:
def reverse(self):
self.x, self.y = self.y, self.x
;)
EDIT: ho visto che Mirko mi ha anticipato. :p
~FullSyst3m~
27-11-2008, 21:09
Sbagliato:
def Reverse(self):
self.x, self.y = self.y, self.x
Corretto:
def reverse(self):
self.x, self.y = self.y, self.x
;)
EDIT: ho visto che Mirko mi ha anticipato. :p
Errore sciocco, non avevo osservato correttamente la funzione DirittoERovescio. Solo che in ufficio è difficile studiare e non c'è la tranquillità necessaria :muro:
EDIT: ho visto che Mirko mi ha anticipato. :p
sed 's/k/c/' -
DanieleC88
27-11-2008, 21:16
sed 's/k/c/' -
Sei troppo nerd... :asd:
Ti avrà preso per Stan! :D
cdimauro
27-11-2008, 21:18
sed 's/k/c/' -
:rotfl: Scusami, è la forza dell'abitudine: ho amici e colleghi che si chiamano Mirko, per cui mi è naturale usare sempre la k anziché la c. :p
Sei troppo nerd... :asd:
Ti avrà preso per Stan! :D
:p
:rotfl: Scusami, è la forza dell'abitudine: ho amici e colleghi che si chiamano Mirko, per cui mi è naturale usare sempre la k anziché la c. :p
Perdonato.
~FullSyst3m~
27-11-2008, 21:43
sed 's/k/c/' -
mi è naturale usare sempre la k anziché la c
Ad intuito sembra un comando per sostituire qualche lettera o simbolo in una parola.. o sbaglio?
DanieleC88
27-11-2008, 21:49
Ad intuito sembra un comando per sostituire qualche lettera o simbolo in una parola.. o sbaglio?
Sì (e non solo). ;)
~FullSyst3m~
27-11-2008, 22:14
Sì (e non solo). ;)
A cos'altro serve? Ma in pratica quella sintassi significa di sostituire la k con la c, ma la s cosa sta a significare? Substitute?
Comunque questa sintassi è C? Mi sembra di averla vista pure in bash
DanieleC88
27-11-2008, 22:30
http://en.wikipedia.org/wiki/Sed
Ci hanno fatto pure una calcolatrice... :D
Comunque sì, serve generalmente per il matching di pattern e la sostituzione di testi. Non è C, e ciò che hai visto in BASH probabilmente erano espressioni regolari di grep, se ho ben capito ciò che intendi.
~FullSyst3m~
27-11-2008, 22:54
http://en.wikipedia.org/wiki/Sed
Ci hanno fatto pure una calcolatrice... :D
Comunque sì, serve generalmente per il matching di pattern e la sostituzione di testi. Non è C, e ciò che hai visto in BASH probabilmente erano espressioni regolari di grep, se ho ben capito ciò che intendi.
No, ho proprio visto questo comando in qualche codice bash. Se non è C cosa è?
DanieleC88
27-11-2008, 23:02
Vabbe', che tu l'abbia visto in qualche script è normale, è un'utility molto usata, ma questo non la rende parte di BASH. :D
La sintassi di sed è semplicemente una sua convenzione, non è un linguaggio di programmazione. Che intendi con sintassi C?
~FullSyst3m~
28-11-2008, 00:22
Vabbe', che tu l'abbia visto in qualche script è normale, è un'utility molto usata, ma questo non la rende parte di BASH. :D
La sintassi di sed è semplicemente una sua convenzione, non è un linguaggio di programmazione. Che intendi con sintassi C?
Alle volte io è tu non ci capiamo :D
Io volevo dire: sed è un'utility "propria" o fa parte della sintassi di qualche linguaggio? Ad esempio def fa parte della sintassi di Python e Ruby, void di C ecc. Capito che voglio dire?
DanieleC88
28-11-2008, 00:33
No, è un'utility a parte.
~FullSyst3m~
28-11-2008, 00:52
No, è un'utility a parte.
Ok, avevo questo dubbio
Ad intuito sembra un comando per sostituire qualche lettera o simbolo in una parola.. o sbaglio?
Usi linux e non conosci sed e grep! Dove andremo a finire... :muro:
cdimauro
28-11-2008, 08:00
Qui (http://www.microsoft.com). :fiufiu:
~FullSyst3m~
28-11-2008, 08:01
Usi linux e non conosci sed e grep! Dove andremo a finire... :muro:
Non è che devo conoscerli obbligatoriamente. grep lo conosco comunque, era sed che non conoscevo. Non ci vedo nulla di strano visto che non mi è mai capitato di usarlo, è difficile conoscere qualcosa quando non la si incontra o usa mai
~FullSyst3m~
28-11-2008, 08:02
Qui (http://www.microsoft.com). :fiufiu:
Pure tu ti ci metti? Non vedo cosa ci sia di cosi tragico. Potrei sapere un motivo per il quale dovrei conoscerlo?
cdimauro
28-11-2008, 13:58
Era una battuta... :stordita:
~FullSyst3m~
28-11-2008, 14:16
Era una battuta... :stordita:
Chissà, ma comunque...
DanieleC88
28-11-2008, 14:26
Animo, su con la vita... :rolleyes:
~FullSyst3m~
28-11-2008, 15:09
Animo, su con la vita... :rolleyes:
Una parola :rolleyes:
Comunque cdimauro la tua l'ho capito che era una battuta, era quella di VICIUS che tutto mi sembrava tranne che una battua. Ma ripeto: ma comunque...
Una parola :rolleyes:
Comunque cdimauro la tua l'ho capito che era una battuta, era quella di VICIUS che tutto mi sembrava tranne che una battua. Ma ripeto: ma comunque...
Non volevo assolutamente rimproverarti. Io poi sono l'ultima persona che dovrebbe dirti qualcosa visto che non uso nemmeno linux.
banryu79
28-11-2008, 15:48
Ehi, non fatemi irritare FullSyst3m che poi son volatili per diabetici :O
:p
P.S.: Full, anche secondo me erano semplici battute, nessun rimprovero (anche perchè cosa ci sarebbe da rimproverare?)
khelidan1980
28-11-2008, 17:07
Qui (http://www.microsoft.com). :fiufiu:
basta che non finisce quì (http://www.apple.com/it/support/leopard/) :sofico:
Mamma che flame.... :D
AnonimoVeneziano
28-11-2008, 17:40
Non volevo assolutamente rimproverarti. Io poi sono l'ultima persona che dovrebbe dirti qualcosa visto che non uso nemmeno linux.
/spit
:asd:
~FullSyst3m~
28-11-2008, 18:04
Doppio post, problema di connessione
~FullSyst3m~
28-11-2008, 18:06
Non importa, non è successo niente. Torniamo in topic ora.
Paragrafo 15.4, mi sembra che ci sia qualcosa che non torna:
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
Carta1 = Carta(1,1)
Carta2 = Carta(1,1)
print Carta1 > Carta2
Apparte la sintassi if: return che non sapevo fosse possibile, al posto di -1 mi viene ritornato 1 e lo 0 non mi viene ritornato mai, nemmeno se metto Carta1 == Carta2.
Dato che ci sono posto pure la mia soluzione all'esercizietto che c'è alla fine del paragrafo, cioè di fare in modo che Asso sia maggiore del Re:
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango == 1:
self.rango > 13
return 2
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
A me sembra funzionare provando a fare il confronto tra Carta1(1,1) e Carta2(1,13).
http://www.python.it/doc/Howtothink/Howtothink-html-it/chap15.htm
P.S: ma il modulo __str__ funziona solo con un oggetto della classe? Perchè chiamando print nel confronto stampa il valore booleano, non stampa quello che è nel modulo __str__
Apparte la sintassi if: return che non sapevo fosse possibile, al posto di -1 mi viene ritornato 1 e lo 0 non mi viene ritornato mai, nemmeno se metto Carta1 == Carta2.
Allega il codice completo delle prove perché la funzione sembra giusta quindi è probabile che l'errore sia da qualche altra parte.
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango == 1:
self.rango > 13
return 2
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
Cosa intendevi dire con quel self.rango > 13 e return 2? Così come lo hai scritto non ha molto senso.
P.S: ma il modulo __str__ funziona solo con un oggetto della classe? Perchè chiamando print nel confronto stampa il valore booleano, non stampa quello che è nel modulo __str__
Ovviamente stampa il valore dell'espressione. __str__ viene chiamata quando c'è bisogno di una stringa da stampare non ogni volta che compare l'oggetto.
~FullSyst3m~
28-11-2008, 20:29
Allega il codice completo delle prove perché la funzione sembra giusta quindi è probabile che l'errore sia da qualche altra parte.
Il codice l'ho già allegato
Cosa intendevi dire con quel self.rango > 13 e return 2? Così come lo hai scritto non ha molto senso.
L'esercizio vuole modificato __cmp__ in tal modo che l'asso sia superiore del re. Quindi ho scritto la condizione che se rango vale 1 allora è maggiore di 13, e il return era per fare una prova per vedere se funzionava e se mi ritornava il valore che ho scritto
Ovviamente stampa il valore dell'espressione. __str__ viene chiamata quando c'è bisogno di una stringa da stampare non ogni volta che compare l'oggetto
Da quello che ho letto nel libro c'è messo che viene invocato ogni volta che si usa print
MasterDany
28-11-2008, 20:38
Per un mio esercizio ho deciso di scrivere un programma eccolo:
import math
prova="Quanto è lungo il cateto1?"
c1=input(prova)
prompt1="Quant'è la lunghezza del cateto2?"
c2=input(prompt1)
def Ipotenusa(x,y):
ipotenusa=math.sqrt(x**2+y**2)
return ipotenusa
risultato=Ipotenusa(3,4)
print risultato
File "test2.py", line 3
SyntaxError: Non-ASCII character '\xe8' in file test2.py on line 6, bu
ing declared; see http://www.python.org/peps/pep-0263.html for details
Sono andato in quell'indirizzo e ho aggiunto questa parte al codice:
# coding=<encoding name>
quindi:
# coding=<encoding name>
import math
prova="Quanto è lungo il cateto1?"
c1=input(prova)
prompt1="Quant'è la lunghezza del cateto2?"
c2=input(prompt1)
def Ipotenusa(x,y):
ipotenusa=math.sqrt(x**2+y**2)
return ipotenusa
risultato=Ipotenusa(3,4)
print risultato
Il problema persiste...Forse non ho capito bene il paragrafo 4.12 del capitolo 4.4.Comunque mi stavo esercitando per lo sviluppo incrementale del paragrafo 5!
DanieleC88
28-11-2008, 20:46
# coding=<encoding name>
Devi metterci l'encoding effettivo (utf-8, cp-1252, etc...).
AnonimoVeneziano
28-11-2008, 20:48
# coding=iso-8859-15
import math
prova="Quanto è lungo il cateto1?"
c1=input(prova)
prompt1="Quant'è la lunghezza del cateto2?"
c2=input(prompt1)
def Ipotenusa(x,y):
ipotenusa=math.sqrt(x**2+y**2)
return ipotenusa
risultato=Ipotenusa(3,4)
print risultato
E' colpa del "è" che non è un carattere ASCII
Comunque non ho capito il senso di prendere in input c1 e c2 e poi usare Ipotenusa(3,4) :D
Ciao
MasterDany
28-11-2008, 20:50
Devi metterci l'encoding effettivo (utf-8, cp-1252, etc...).
non sono preparato sulle varie codifiche...quale devo inserire in questo caso?
Ma soprattutto dove posso impararle?
Grazie davvero Daniele
MasterDany
28-11-2008, 20:53
# coding=iso-8859-15
import math
prova="Quanto è lungo il cateto1?"
c1=input(prova)
prompt1="Quant'è la lunghezza del cateto2?"
c2=input(prompt1)
def Ipotenusa(x,y):
ipotenusa=math.sqrt(x**2+y**2)
return ipotenusa
risultato=Ipotenusa(3,4)
print risultato
E' colpa del "è" che non è un carattere ASCII
Comunque non ho capito il senso di prendere in input c1 e c2 e poi usare Ipotenusa(3,4) :D
Ciao
che gaf! è che stavo testando e cosi prima l'ho fatto con dei valori passati come parametri scelti da me.Poi ho cercato di "complicare" prendendoli in input...tutto sistemato grazie!
~FullSyst3m~
28-11-2008, 20:58
# coding=iso-8859-15
import math
prova="Quanto è lungo il cateto1?"
c1=input(prova)
prompt1="Quant'è la lunghezza del cateto2?"
c2=input(prompt1)
def Ipotenusa(x,y):
ipotenusa=math.sqrt(x**2+y**2)
return ipotenusa
risultato=Ipotenusa(3,4)
print risultato
E' colpa del "è" che non è un carattere ASCII
Comunque non ho capito il senso di prendere in input c1 e c2 e poi usare Ipotenusa(3,4) :D
Ciao
Esatto. Comunque non l'ho capito nemmeno io.
def Ipotenusa():
C1 = input("Inserisci il numero del primo cateto: ")
C2 = input("Inserisci il numero del secondo cateto: ")
Ipo= math.sqrt(C1**2 + C2**2)
return Ipo
print Ipotenusa()
Oppure:
def Ipotenusa():
C1 = input("Inserisci il numero del primo cateto: ")
C2 = input("Inserisci il numero del secondo cateto: ")
return math.sqrt(C1**2 + C2**2)
print Ipotenusa()
Il codice l'ho già allegato
Io vedo solo il codice della funzione __cmp__ e le tre linee di codice che istanziano gli oggetti e stampano il risultato. Tutto il resto mi pare mancare.
L'esercizio vuole modificato __cmp__ in tal modo che l'asso sia superiore del re. Quindi ho scritto la condizione che se rango vale 1 allora è maggiore di 13, e il return era per fare una prova per vedere se funzionava e se mi ritornava il valore che ho scritto
Come ragionamento ci siamo ma non è così che dovresti scriverlo in python. Il return è ok se si tratta solo di una prova ma quella condizione self.ranga > 13 non ha molto senso.
Da quello che ho letto nel libro c'è messo che viene invocato ogni volta che si usa print
Se c'è scritto così sul libro allora ci deve essere un errore.
non sono preparato sulle varie codifiche...quale devo inserire in questo caso?
Ma soprattutto dove posso impararle?
Grazie davvero Daniele
Sei ancora agli inizi non ti complicare la vita andando a spulciare dettagli tecnici come la codifica dei caratteri dei file di testo. Ricorda solo di non usare più strani caratteri accentati d'ora in avanti e non avrai più problemi. Fra tre o quattro mesi quando avrai un po' più di esperienza col linguaggio potrai permetterti di guardare queste cose.
~FullSyst3m~
28-11-2008, 22:17
Io vedo solo il codice della funzione __cmp__ e le tre linee di codice che istanziano gli oggetti e stampano il risultato. Tutto il resto mi pare mancare.
Non avevo capito, pensavo volevi solo il codice del modulo __cmp__. Ecco tutto il codice:
class Carta:
ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
ListaRanghi = ["impossibile", "Asso", '2', '3', '4', '5', '6', '7', '8', \
"9", "10", "Jack", "Regina", "Re"]
def __init__(self, seme=0, rango=0):
self.seme = seme
self.rango = rango
def __str__(self):
return (self.ListaRanghi[self.rango] + " di " + self.ListaSemi[self.seme])
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango == 1:
self.rango > 13
return 2
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
Carta1 = Carta(1,1)
Carta2 = Carta(1,13)
print Carta1 > Carta2
Come ragionamento ci siamo ma non è così che dovresti scriverlo in python. Il return è ok se si tratta solo di una prova ma quella condizione self.ranga > 13 non ha molto senso.
Perchè non ha molto senso scusa? L'oggetto carta vuole due parametri, seme e rango. Rango arriva fno a 13, quindi se l'asso deve essere maggiore la condizione che ho scritto mi sembra corretta, il programma infatti funziona
Se c'è scritto così sul libro allora ci deve essere un errore
E' scritto cosi, in ogni caso se lo chiamo sul solo oggetto allora __str__ viene ciamato, altrimenti se lo chiamo su un confronto come in questo caso il print si comporta in modo predefinito e non invoca __str__
DanieleC88
28-11-2008, 23:46
Stavolta voglio chiedere io una cosa a cdimauro. Ho questa funzione:
def sort(A, fn):
T = deepcopy(A)
print "Array originale:", T
fn(T)
print "Array ordinata usando \"%s\":" % (fn), T
print
che voglio stampi il nome della funzione che io ho passato come parametro e che svolge l'effettivo ordinamento dell'array.
Ora, nel modo che sto usando... "funziona", ma è un po' bruttino leggere:
Array originale: [6, 5, 3, 8, 4, 1, 2, 9, 0, 7]
Array ordinata usando "<function heapsort at 0xb7d3b41c>": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Magari leggere solo "heapsort" era meglio. :D
DanieleC88
29-11-2008, 00:09
Mi rispondo da solo...
[...]
print "Array ordinata usando %s():" % (fn.__name__), T
[...]
In fondo era piuttosto intuitivo. :)
~FullSyst3m~
29-11-2008, 07:20
Stavolta voglio chiedere io una cosa a cdimauro. Ho questa funzione:
def sort(A, fn):
T = deepcopy(A)
print "Array originale:", T
fn(T)
print "Array ordinata usando \"%s\":" % (fn), T
print
che voglio stampi il nome della funzione che io ho passato come parametro e che svolge l'effettivo ordinamento dell'array.
Ora, nel modo che sto usando... "funziona", ma è un po' bruttino leggere:
Array originale: [6, 5, 3, 8, 4, 1, 2, 9, 0, 7]
Array ordinata usando "<function heapsort at 0xb7d3b41c>": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Magari leggere solo "heapsort" era meglio. :D
Perchè gli slash prima e accanto all'operatore stringa? E poi, come mai hai messo la parentesi vuota accanto all'operatore stringa (parlo per la soluzione corretta)?
Perchè non ha molto senso scusa? L'oggetto carta vuole due parametri, seme e rango. Rango arriva fno a 13, quindi se l'asso deve essere maggiore la condizione che ho scritto mi sembra corretta, il programma infatti funziona
Non mi pare.
Carta1 = Carta(1,1)
Carta2 = Carta(1,1)
print Carta1 > Carta2
print Carta1 == Carta2
Questo stampa True e False che sono ovviamente valori sbagliati visto che si tratta delle stesse carte.
Il problema è nel codice che hai aggiunto.
~FullSyst3m~
29-11-2008, 07:24
Non mi pare.
Carta1 = Carta(1,1)
Carta2 = Carta(1,1)
print Carta1 > Carta2
print Carta1 == Carta2
Questo stampa True e False che sono ovviamente valori sbagliati visto che si tratta delle stesse carte.
Il problema è nel codice che hai aggiunto.
Quando ho detto che funziona parlavo del fatto che 1 è maggiore del re. Comunque si, devo sistemare un pò la condizione. Ma era un prova per vedere se funzionava quel pezzo di codice che ho aggiunto
~FullSyst3m~
29-11-2008, 07:31
Modificato il codice, ora sembra andare:
class Carta:
ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
ListaRanghi = ["impossibile", "Asso", '2', '3', '4', '5', '6', '7', '8', \
"9", "10", "Jack", "Regina", "Re"]
def __init__(self, seme=0, rango=0):
self.seme = seme
self.rango = rango
def __str__(self):
return (self.ListaRanghi[self.rango] + " di " + self.ListaSemi[self.seme])
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango == 1 and altro.rango != 1:
self.rango > 13
return 2
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
Carta1 = Carta(1,1)
Carta2 = Carta(1,1)
print Carta1 == Carta2
DanieleC88
29-11-2008, 11:19
Perchè gli slash prima e accanto all'operatore stringa?
Perché io volevo stampare le virgolette proprio, non chiudere la stringa (perciò l'escape).
E poi, come mai hai messo la parentesi vuota accanto all'operatore stringa (parlo per la soluzione corretta)?
L'ho fatto perché mi stampasse, ad esempio:
Array ordinata usando heapsort(): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
perché io sono abituato così, faccio seguire le parentesi vuote al nome della funzione, proprio ad indicare che si tratta di una funzione, di una cosa "invocabile", e non di un qualche altro identificatore nel mio codice sorgente.
^TiGeRShArK^
29-11-2008, 11:48
if self.rango == 1 and altro.rango != 1:
self.rango > 13
return 2
Non ha alcun senso.
~FullSyst3m~
29-11-2008, 12:23
Perché io volevo stampare le virgolette proprio, non chiudere la stringa (perciò l'escape).
E con gli slash come le stampavi le virgolette?
L'ho fatto perché mi stampasse, ad esempio:
Array ordinata usando heapsort(): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
perché io sono abituato così, faccio seguire le parentesi vuote al nome della funzione, proprio ad indicare che si tratta di una funzione, di una cosa "invocabile", e non di un qualche altro identificatore nel mio codice sorgente.
Capito ;)
Non ha alcun senso.
Fattostà che funziona. Tu come lo faresti dato che non ha senso?
^TiGeRShArK^
29-11-2008, 12:32
E con gli slash come le stampavi le virgolette?
Capito ;)
Fattostà che funziona. Tu come lo faresti dato che non ha senso?
non ho letto il problema e non so che si deve fare, ma di sicuro scrivere self.rango > 13 non serve a niente in questo caso.
~FullSyst3m~
29-11-2008, 13:22
non ho letto il problema e non so che si deve fare, ma di sicuro scrivere self.rango > 13 non serve a niente in questo caso.
Dire che non serve a niente mi sembra esagerato visto che il programma funziona. In pratica l'esercizio vuole che si modifichi il metodo __cmp__ per fare in modo che l'asso abbia un valore più alto del re. Il codice del libro è questo:
def __cmp__(self, altro):
#controlla il seme
if self.seme > altro.seme: return 1
if self.seme < altro.seme: return -1
#controlla il rango
if self.rango > altro.rango: return 1
if self.rango < altro.rango: return -1
#se anche il rango ? uguale allora le carte sono uguali
return 0
Carta1 = Carta(1,1)
Carta2 = Carta(1,1)
print Carta1 > Carta2
E l'altro che hai quotato tu è quello dell'esercizio
Dire che non serve a niente mi sembra esagerato visto che il programma funziona. In pratica l'esercizio vuole che si modifichi il metodo __cmp__ per fare in modo che l'asso abbia un valore più alto del re. Il codice del libro è questo:
Anche cancellando quella riga il programma continua a comportarsi come prima. Prova a pensare un attimo a quale parte del programma viene modificata da quella espressione logica.
DanieleC88
29-11-2008, 13:35
E con gli slash come le stampavi le virgolette?
Considera questo comando:
print "\""
che stamperà ".
Le virgolette più esterne:
print "\""
indicano l'inizio e la fine di una stringa.
All'interno invece:
print "\""
trovi una sequenza di escape, che dice a Python di considerare quelle virgolette per quello che sono, senza chiudere la stringa.
MasterDany
29-11-2008, 13:45
Esatto. Comunque non l'ho capito nemmeno io.
def Ipotenusa():
C1 = input("Inserisci il numero del primo cateto: ")
C2 = input("Inserisci il numero del secondo cateto: ")
Ipo= math.sqrt(C1**2 + C2**2)
return Ipo
print Ipotenusa()
Oppure:
def Ipotenusa():
C1 = input("Inserisci il numero del primo cateto: ")
C2 = input("Inserisci il numero del secondo cateto: ")
return math.sqrt(C1**2 + C2**2)
print Ipotenusa()
stavo testando! ;) adesso stavo migliorando il codice...
~FullSyst3m~
29-11-2008, 13:47
Questo lo so, ma non vedo la differenza tra i due codici che hai scritto
Anche cancellando quella riga il programma continua a comportarsi come prima. Prova a pensare un attimo a quale parte del programma viene modificata da quella espressione logica.
Come si comporta scusa? Il codice che ho scritto io per l'esercizio funziona, se metto Carta1 > Carta2 mi dice falso, e se metto Carta1 == Carta2 mi dice vero.
Ovviamente Carta1(1,1) e Carta2(1,1)
DanieleC88
29-11-2008, 13:50
Come si comporta scusa? Il codice che ho scritto io per l'esercizio funziona, se metto Carta1 > Carta2 mi dice falso, e se metto Carta1 == Carta2 mi dice vero.
Ovviamente Carta1(1,1) e Carta2(1,1)
Tu hai su una riga un confronto, e solo quello. Python valuterà l'espressione, e... la scarterà subito dopo. Perché?
MasterDany
29-11-2008, 13:52
Sei ancora agli inizi non ti complicare la vita andando a spulciare dettagli tecnici come la codifica dei caratteri dei file di testo. Ricorda solo di non usare più strani caratteri accentati d'ora in avanti e non avrai più problemi. Fra tre o quattro mesi quando avrai un po' più di esperienza col linguaggio potrai permetterti di guardare queste cose.
e' cosi?
~FullSyst3m~
29-11-2008, 13:52
Tu hai su una riga un confronto, e solo quello. Python valuterà l'espressione, e... la scarterà subito dopo. Perché?
In che senso la scarterà subito dopo? Come lo svolgeresti tu quell'esercizio?
DanieleC88
29-11-2008, 14:23
In che senso la scarterà subito dopo? Come lo svolgeresti tu quell'esercizio?
In questo senso:
[jmc@mordor ~]$ python
Python 2.6 (r26:66714, Oct 27 2008, 10:50:31)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> testValue = 10
>>> testValue > 13
False
>>> def funzioneDiProva(n):
... n > 13
... return True
...
>>> funzioneDiProva(testValue)
True
Ragionaci un'attimo. ;)
~FullSyst3m~
29-11-2008, 14:28
In questo senso:
[jmc@mordor ~]$ python
Python 2.6 (r26:66714, Oct 27 2008, 10:50:31)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> testValue = 10
>>> testValue > 13
False
>>> def funzioneDiProva(n):
... n > 13
... return True
...
>>> funzioneDiProva(testValue)
True
Ragionaci un'attimo. ;)
In pratica quella condizione ritorna sempre vero per come l'ho scritta io
In pratica quella condizione ritorna sempre vero per come l'ho scritta io
Il valore di n > 13 ovviamente viene valutato in vero o falso a seconda del valore di n. Il problema è che non assegni questo valore a nessuna variabile e non viene usata da nessuna struttura di controllo quindi sostanzialmente è come se non ci fosse.
Io l'esercizio lo scriverei così, usando le funzioni __cmp__ di seme e rango:
def __cmp__(self, altro):
confronto = self.seme.__cmp__(altro.seme)
if confronto == 0:
confronto = self.rango.__cmp__(altro.rango)
if confronto != 0 and self.rango == 1:
confronto = 1
return confronto
DanieleC88
29-11-2008, 14:32
In pratica quella condizione ritorna sempre vero per come l'ho scritta io
Tutto il contrario, ti ho proprio fatto vedere un caso in cui la condizione restituisce False, ma la funzione se ne frega e restituisce comunque True. ;)
~FullSyst3m~
29-11-2008, 14:32
Oggi vado a fare shopping natalizio e sto uscendo :D La prima cosa che mi viene in mente è di mettere subito dopo la defizione di __cmp__ un'assegnazione in modo che se rango = 1 allora gli cambio il valore e lo metto a 14 (maggiore di re). Spero sia giusto, altrimenti tutto il giorno mi girerà in testa questa cosa :asd:
è cosi?
Si è cosi
~FullSyst3m~
29-11-2008, 14:43
Il valore di n > 13 ovviamente viene valutato in vero o falso a seconda del valore di n. Il problema è che non assegni questo valore a nessuna variabile e non viene usata da nessuna struttura di controllo quindi sostanzialmente è come se non ci fosse.
Io l'esercizio lo scriverei così, usando le funzioni __cmp__ di seme e rango:
def __cmp__(self, altro):
confronto = self.seme.__cmp__(altro.seme)
if confronto == 0:
confronto = self.rango.__cmp__(altro.rango)
if confronto != 0 and self.rango == 1:
confronto = 1
return confronto
Sto codice non mi è chiaro. Mi sembra che manchi qualcosa. Oltretutto non capisco la sintassi self.seme.__cmp__(altro.seme). __cmp__ che confronto fa in automatico?
P.S: a quale valore ti riferisci?
Tutto il contrario, ti ho proprio fatto vedere un caso in cui la condizione restituisce False, ma la funzione se ne frega e restituisce comunque True.
Eh, infatti. Ho detto questo io
MasterDany
29-11-2008, 15:15
sto studiano il capitoloil capotolo 5 paragrafo 5.3 la composizione:
ecco il codice:
import math
pxc1="coordinate x per il centro del cerchio"
xc=input(pxc1)
pyc1="coordinate x per il punto del cerchio "
yc=input(pyc1)
pxc2="coordinate x per il centro del cerchio"
xp=input(pxc2)
pyc2="coordinate y per il punto del cerchio "
yp=input(pyc2)
def Raggio(x1,x2,y1,y2):
raggio=math.sqrt((x2-x1)**2+(y2-y1)**2)
return raggio
def AreaDelCerchio2(r):
risultato=r**2*math.pi
return risultato
def AreaDelCerchio(xc,xp,yc,yp):
raggio=Raggio(xc,xp,yc,yp)
a=AreaDelCerchio2(raggio)
return a
p=AreaDelCerchio(xc,xp,yc,yp)
print p
con l'interpete python riporta 25.1327412287
con la calcolatrice:25.147946
~FullSyst3m~
29-11-2008, 15:17
sto studiano il capitoloil capotolo 5 paragrafo 5.3 la composizione:
ecco il codice:
import math
pxc1="coordinate x per il centro del cerchio"
xc=input(pxc1)
pyc1="coordinate x per il punto del cerchio "
yc=input(pyc1)
pxc2="coordinate x per il centro del cerchio"
xp=input(pxc2)
pyc2="coordinate y per il punto del cerchio "
yp=input(pyc2)
def Raggio(x1,x2,y1,y2):
raggio=math.sqrt((x2-x1)**2+(y2-y1)**2)
return raggio
def AreaDelCerchio2(r):
risultato=r**2*math.pi
return risultato
def AreaDelCerchio(xc,xp,yc,yp):
raggio=Raggio(xc,xp,yc,yp)
a=AreaDelCerchio2(raggio)
return a
p=AreaDelCerchio(xc,xp,yc,yp)
print p
con l'interpete python riporta 25.1327412287
con la calcolatrice:25.147946
La calcolatrice ti arrotonda, Python invece usa gli interi lunghi
MasterDany
29-11-2008, 15:19
La calcolatrice ti arrotonda, Python invece usa gli interi lunghi
Quindi il programma è corretto?!
~FullSyst3m~
29-11-2008, 15:23
Quindi il programma è corretto?!
Non l'ho guardato sinceramente, però se il risultato è quello e con la calcolatrice hai ottenuto il risultato arrotondato direi che il programma è giusto
Un consiglio: non c'è bisogno che scrivi il prompt e poi lo passi come parametro ad input, puoi scriverlo direttamente nel parametro:
xc=input("coordinate x per il centro del cerchio")
DanieleC88
29-11-2008, 15:26
Quindi il programma è corretto?!
Così pare.
~FullSyst3m~
29-11-2008, 15:28
Inoltre, tratto dal libro:
"Per convenzione cmp prende due parametri, self e Altro, e ritorna 1 se il primo è il più grande, -1 se è più grande il secondo e 0 se sono uguali."
Io ancora non li ho visti però
MasterDany
29-11-2008, 15:28
Non l'ho guardato sinceramente, però se il risultato è quello e con la calcolatrice hai ottenuto il risultato arrotondato direi che il programma è giusto?
Un consiglio: non c'è bisogno che scrivi il prompt e poi lo passi come parametro ad input, puoi scriverlo direttamente nel parametro:
xc=input("coordinate x per il centro del cerchio")
E che credevo che per ottente un intero bisognava fare cosi.
Invece da quelle che mi hai detto è che con raw_input è una stringa e con input un intero o sbaglio?
~FullSyst3m~
29-11-2008, 15:30
E che credevo che per ottente un intero bisognava fare cosi.
Invece da quelle che mi hai detto è che con raw_input è una stringa e con input un intero o sbaglio?
Si, con raw_input il prompt si aspetta di riceve una stringa, con input invece si aspetta un numero
DanieleC88
29-11-2008, 15:33
Quindi il programma è corretto?!
No, aspetta, c'è un errore matematico ora che lo leggo bene.
Qual'è la formula per calcolare l'area di un cerchio conoscendone il raggio? Attento agli operatori... :)
~FullSyst3m~
29-11-2008, 15:39
No, aspetta, c'è un errore matematico ora che lo leggo bene.
Qual'è la formula per calcolare l'area di un cerchio conoscendone il raggio? Attento agli operatori... :)
:read:
Sto codice non mi è chiaro. Mi sembra che manchi qualcosa.
C'è tutto, almeno mi pare :)
Oltretutto non capisco la sintassi self.seme.__cmp__(altro.seme). __cmp__ che confronto fa in automatico?
Seme è una variabile intera. Invece di fare il confronto a mano usando due if chiamo direttamente la funzione __cmp__ per gli interi e faccio fare tutto a lei.
P.S: a quale valore ti riferisci?
Prova a pensare all'espressione "6 > 7". Viene letta dall'interprete di python che esegue il confronto e ritorna il valore falso perché ovviamente 6 non può essere maggiore di 7. Nel tuo caso di prima questo valore veniva semplicemente ignorato perché non era assegnato a niente.
con l'interpete python riporta 25.1327412287
con la calcolatrice:25.147946
Cambia calcolatrice :asd:
Inoltre, tratto dal libro:
"Per convenzione cmp prende due parametri, self e Altro, e ritorna 1 se il primo è il più grande, -1 se è più grande il secondo e 0 se sono uguali."
Io ancora non li ho visti però
Quei valori sono usati da python tu non li vedi quando fai un confronto normale usando gli operatori >, < o ==. Se vuoi usare quei valori devi chiamare direttamente la funzione __cmp__
No, aspetta, c'è un errore matematico ora che lo leggo bene.
È r quadro per pigreco, come ha scritto lui. Non ci vedo errori nella formula. :confused:
DanieleC88
29-11-2008, 16:17
È r quadro per pigreco, come ha scritto lui. Non ci vedo errori nella formula. :confused:
:doh:
Non avevo ancora preso il caffé e mi è scappata una cazzata. Non fateci caso, è normale. :asd:
~FullSyst3m~
29-11-2008, 19:28
C'è tutto, almeno mi pare :)
Si, c'è tutto. E' che ancora non ho la visuale con questa sintassi
Seme è una variabile intera. Invece di fare il confronto a mano usando due if chiamo direttamente la funzione __cmp__ per gli interi e faccio fare tutto a lei.
E la sintassi? Come mai prima di altro.seme non hai messo il punto?
Prova a pensare all'espressione "6 > 7". Viene letta dall'interprete di python che esegue il confronto e ritorna il valore falso perché ovviamente 6 non può essere maggiore di 7. Nel tuo caso di prima questo valore veniva semplicemente ignorato perché non era assegnato a niente.
Tu parli del valore booleano? O del 13?
Quei valori sono usati da python tu non li vedi quando fai un confronto normale usando gli operatori >, < o ==. Se vuoi usare quei valori devi chiamare direttamente la funzione __cmp__
Allora se io non li vedo che senso ha metterli? Cioè, se io metto return 1, mi aspetto che mi venga ritornato 1, -1 oppure 0
MasterDany
29-11-2008, 19:52
ot (mi scuso con i mod):
XNA+python è possibile?
ot (mi scuso con i mod):
XNA+python è possibile?
Dovresti essere in grado di usare uno qualsiasi dei linguaggi .net, quindi anche python, ma che io sappia solo c# è supportato.
E la sintassi? Come mai prima di altro.seme non hai messo il punto?
Per quale motivo avrei dovuto metterci un punto?
Tu parli del valore booleano? O del 13?
Del booleano che risultava dal confronto con 13
Allora se io non li vedo che senso ha metterli? Cioè, se io metto return 1, mi aspetto che mi venga ritornato 1, -1 oppure 0
Perché servono a python.
~FullSyst3m~
29-11-2008, 23:07
Per quale motivo avrei dovuto metterci un punto?
Mi sono accorto ora che hai usato la notazione punto, fai finta che non abbia detto nulla. Non capisco solo: il metodo __cmp__ fa i confronti in automatico pure? Cioè, invocandolo su self.seme lui fa il confronto con altro.seme in automatico in pratica. Ma cosa confronta? Se è maggiore, minore o uguale? E in caso, cosa restituisce per i vari confronti?
Del booleano che risultava dal confronto con 13
E a chi lo dovevo assegnare? Non ho capito cosa vuoi dire
Perché servono a python
Ma io mi aspetto pur sempre uno di quei valori, non True e False. Questa cosa non mi è chiara. Oltretutto nel codice che hai scritto tu non c'è traccia di 1, -1 e 0. Se servono a Python com'è che non li hai messi tu?
~FullSyst3m~
29-11-2008, 23:10
Dovresti essere in grado di usare uno qualsiasi dei linguaggi .net, quindi anche python, ma che io sappia solo c# è supportato.
:confused:
Considera questo comando:
print "\""
che stamperà ".
Le virgolette più esterne:
print "\""
indicano l'inizio e la fine di una stringa.
All'interno invece:
print "\""
trovi una sequenza di escape, che dice a Python di considerare quelle virgolette per quello che sono, senza chiudere la stringa.
Tornando a questo messaggio che mi ha messo un pò di curiosità. Io non vedo nessuna differenza tra i due codici...
Mi sono accorto ora che hai usato la notazione punto, fai finta che non abbia detto nulla. Non capisco solo: il metodo __cmp__ fa i confronti in automatico pure? Cioè, invocandolo su self.seme lui fa il confronto con altro.seme in automatico in pratica. Ma cosa confronta? Se è maggiore, minore o uguale? E in caso, cosa restituisce per i vari confronti?
Dentro alla variabile seme ci sarà un intero che di sicuro ha già una funzione __cmp__ scritta dagli autori di python. Sto usando quella per confrontare i due valori. Il valore di ritorno è identico a quello che dovrebbe dare la __cmp__ che devi scrivere te per Carta. -1 se è minore, 0 se uguale e 1 se maggiore.
E a chi lo dovevo assegnare? Non ho capito cosa vuoi dire
A nessuno visto che non serve.
Ma io mi aspetto pur sempre uno di quei valori, non True e False. Questa cosa non mi è chiara. Oltretutto nel codice che hai scritto tu non c'è traccia di 1, -1 e 0. Se servono a Python com'è che non li hai messi tu?
Ancora una volta tu NON usi la funzione __cmp__, non hai alcun motivo di aspettarti -1. Tu vuoi semplicemente sapere se A è maggiore di B. Per fare questo usi gli operatori del confronto che possono dare solo vero o falso.
Nel mio codice il valore è contenuto nella variabile risultato.
MasterDany
30-11-2008, 10:51
Il paragrafo 5.3 del capitolo 5.
Non riesco a capire la composizione senza leggere il testo(cioè ho letto la prima parte ho creato questo):
import math
xc=input("coordinate x per il centro del cerchio")
yc=input("coordinate x per il punto del cerchio")
xp=input("coordinate x per il centro del cerchio")
yp=input("coordinate y per il punto del cerchio")
def Raggio(x1,x2,y1,y2):
return math.sqrt((x2-x1)**2+(y2-y1)**2)
def AreaDelCerchio2(r):
return r**2*math.pi
def AreaDelCerchio(xc,xp,yc,yp):
return AreaDelCerchio2(Raggio(xc,xp,yc,yp))
p=AreaDelCerchio(xc,xp,yc,yp)
print p
La sintassi è chiare ma non riesco a capirne l'uso ei vantaggi avete qualche esempio da postarmi?
Poi l'esercizio dice
scrivi una funzione Pendenza(x1, y1, x2, y2) che ritorna il valore della pendenza della retta passante per i punti (x1, y1) e (x2, y2). Poi usa questa funzione in una seconda funzione chiamata IntercettaY(x1, y1, x2, y2) che ritorna il valore delle ordinate quando la retta determinata dagli stessi punti ha X uguale a zero.
Come si calcola la pendenza?
Non ho capito cosa deve fare la funziona intercetta
Come si calcola la pendenza?
È il coefficiente angolare della retta. Nel tuo caso è meglio se lo ricavi come rapporto dei cateti.
Non ho capito cosa deve fare la funziona intercetta
Devi semplicemente ricavare il valore di y quando x vale 0.
MasterDany
30-11-2008, 11:24
È il coefficiente angolare della retta. Nel tuo caso è meglio se lo ricavi come rapporto dei cateti.
Puoi scrivermi la formula faccio il primo liceo questi argomenti li ho affrontati più di un annetto fa in 3° media quindi non me li ricordo(non studiavo mai ;) )
Penso che dovrò prendermi un libro di geometria di base..che mi consigli?
Puoi scrivermi la formula faccio il primo liceo questi argomenti li ho affrontati più di un annetto fa in 3° media quindi non me li ricordo(non studiavo mai ;) )
Penso che dovrò prendermi un libro di geometria di base..che mi consigli?
Male. Molto male! Queste sono cose da sapere a memoria. Tira fuori il libro delle medie e mettiti a studiare l'equazione della retta. Queste sono cose che ti serviranno sempre anche più avanti nelle superiori. Non serve comprare un libro solo sulla geometria analitica, basta sapere bene quella che ti insegnano a scuola.
MasterDany
30-11-2008, 11:35
Male. Molto male! Queste sono cose da sapere a memoria. Tira fuori il libro delle medie e mettiti a studiare l'equazione della retta. Queste sono cose che ti serviranno sempre anche più avanti nelle superiori. Non serve comprare un libro solo sulla geometria analitica, basta sapere bene quella che ti insegnano a scuola.
Le varie aree me li ricordo tutte...pitogora lo so benissimo...euclide un po' meno però lo so...
Quali sono le altre cose più importanti?
~FullSyst3m~
30-11-2008, 12:16
Dentro alla variabile seme ci sarà un intero che di sicuro ha già una funzione __cmp__ scritta dagli autori di python. Sto usando quella per confrontare i due valori. Il valore di ritorno è identico a quello che dovrebbe dare la __cmp__ che devi scrivere te per Carta. -1 se è minore, 0 se uguale e 1 se maggiore.
Io come valore di ritorno vedo solo True o False, non vedo altro.
A nessuno visto che non serve.
Ho capito, io non capisco cosa volevi dire con assegnare il valore di ritorno per il confronto. Postami un esempio cosi ci capiamo
Ancora una volta tu NON usi la funzione __cmp__, non hai alcun motivo di aspettarti -1. Tu vuoi semplicemente sapere se A è maggiore di B. Per fare questo usi gli operatori del confronto che possono dare solo vero o falso.
Nel mio codice il valore è contenuto nella variabile risultato
Allora che senso ha scrivere __cmp__ se alla fine si usano gli oepratori di confronto "tradizionali". E nel tuo codice non vedo nessuna variabile risultato, vedo che ritorna confronto e alla fine anche il tuo codice ritorna o vero o falso
MasterDany
30-11-2008, 12:40
paragrafo 5.4 capitolo 5:
def Divisibile(x, y):
return x%y == 0
Il libro dice:
>>> Divisibile(6, 4)
0
>>> Divisibile(6, 3)
1
A me stampa True e False.La cosa che vorrei sapere adesso è se cambia qualcosa tra i risultati che l'IDLE stampa a me (True e False) e quelli del libro (1 e 2).
Significano la stessa cosa però a livello "di valore" cambia qualcosa?
Le varie aree me li ricordo tutte...pitogora lo so benissimo...euclide un po' meno però lo so...
Quali sono le altre cose più importanti?
In questo caso ti serve l'equazione della retta.
y = mx + q
Quel "m" è il coefficiente angolare della retta o pendenza come la chiama in questo esercizio.
DanieleC88
30-11-2008, 12:50
Significano la stessa cosa però a livello "di valore" cambia qualcosa?
Mi pare di aver letto da cdimauro che un tempo True e False venissero semplicemente valutati come 1 e 0, quindi forse fa riferimento ad una vecchia versione di Python. Adesso i booleani sono solo True e False.
paragrafo 5.4 capitolo 5:
def Divisibile(x, y):
return x%y == 0
Il libro dice:
A me stampa True e False.La cosa che vorrei sapere adesso è se cambia qualcosa tra i risultati che l'IDLE stampa a me (True e False) e quelli del libro (1 e 2).
Significano la stessa cosa però a livello "di valore" cambia qualcosa?
L'output è giusto. Non ti preoccupare e dovuto al fatto che il libro è stato scritto molto tempo fa con una vecchia versione di python.
Allora che senso ha scrivere __cmp__ se alla fine si usano gli oepratori di confronto "tradizionali". E nel tuo codice non vedo nessuna variabile risultato, vedo che ritorna confronto e alla fine anche il tuo codice ritorna o vero o falso
Se non scrivi __cmp__ gli operatori normali non hanno la più pallida idea di quale carta viene prima delle altre.
Al resto ti ho risposto nel pvt.
MasterDany
30-11-2008, 12:53
In questo caso ti serve l'equazione della retta.
y = mx + q
Quel "m" è il coefficiente angolare della retta o pendenza come la chiama in questo esercizio.
allora sono andato in soffitta a riprendere i libri ma questa non c'è..
Non riesco capirla..Puoi farmi degli esempi anche con le coordinate?
Grazie Mille.
MasterDany
30-11-2008, 13:01
sempre il capitolo 5 paragrafo 5.4:
Esercizio: scrivi una funzione CompresoTra(x,y,z) che ritorna 1 se yle xle z, altrimenti ritorna 0.
che cosa significa "yle xle z"?
allora sono andato in soffitta a riprendere i libri ma questa non c'è..
Non riesco capirla..Puoi farmi degli esempi anche con le coordinate?
Grazie Mille.
y = -3x + 4
Se poni x = 0 -3x si annulla e diventa y = 4 che è il punto in cui la retta si interseca con l'asse y, il risultato della seconda funzione che devi scrivere insomma. La pendenza invece è -3.
MasterDany
30-11-2008, 13:12
y = -3x + 4
Se poni x = 0 -3x si annulla e diventa y = 4 che è il punto in cui la retta si interseca con l'asse y, il risultato della seconda funzione che devi scrivere insomma. La pendenza invece è -3.
continuo a non capire perchè -3 si annulla?
mi sembra che è una regola delle eqauzione che non ricordo però!
~FullSyst3m~
30-11-2008, 13:13
paragrafo 5.4 capitolo 5:
def Divisibile(x, y):
return x%y == 0
Il libro dice:
A me stampa True e False.La cosa che vorrei sapere adesso è se cambia qualcosa tra i risultati che l'IDLE stampa a me (True e False) e quelli del libro (1 e 2).
Significano la stessa cosa però a livello "di valore" cambia qualcosa?
Il libro si riferisce alla versione 1 di Python nella quale i valori booleani che restituiva erano 0 e 1. Adesso restituisce True e False, ma è la stessa cosa. True = 1, False = 0.
Riguardo la pendenza io l'avevo fatto cosi quando avevo iniziato a studiare Python:
def Pendenza(x1,y1,x2,y2):
if (x1 == 0) and (x2 == 0):
print "Immettere valori superiori allo 0"
else:
dx = x2 - x1
if dx==0:
print "Impossibile"
else:
ny = y2 - y1
Temp = ny / dx
return Temp
che cosa significa "yle xle z"?
E' un'errore di impaginazione. Quello è il "codice" per scrivere minore. Dovrebbe essere:
y < x < z
MasterDany
30-11-2008, 13:15
Il libro si riferisce alla versione 1 di Python nella quale i valori booleani che restituiva erano 0 e 1. Adesso restituisce True e False, ma è la stessa cosa. True = 1, False = 0.
Riguardo la pendenza io l'avevo fatto cosi quando avevo iniziato a studiare Python:
def Pendenza(x1,y1,x2,y2):
if (x1 == 0) and (x2 == 0):
print "Immettere valori superiori allo 0"
else:
dx = x2 - x1
if dx==0:
print "Impossibile"
else:
ny = y2 - y1
Temp = ny / dx
return Temp
Si questa c'avevo pensato anche io.l'ho trovata qua:
http://www.professionearchitetto.it/bacheca/info/108185.aspx
Qulla di VISIUS è diversa o sbaglio?
E' un'errore di impaginazione. Quello è il "codice" per scrivere minore. Dovrebbe essere:
y < x < z
Grazie
continuo a non capire perchè -3 si annulla?
mi sembra che è una regola delle eqauzione che non ricordo però!
-3 * 0 quanto fa?
MasterDany
30-11-2008, 13:21
-3 * 0 quanto fa?
ops vero scuate ma sono parecchi mesi che non smanetto con l'algebra...la riaffronterò fra qualche giorno però ;)
MasterDany
30-11-2008, 13:23
-3 * 0 quanto fa?
la pendenza è -3 ma poi come la trovo?
la pendenza è -3 ma poi come la trovo?
Te l'ho gia detto. È il rapporto tra i due cateti, esattamente quello che ha fatto FullSystem nel suo codice, ragiona su quello e vedrai che non è difficile.
MasterDany
30-11-2008, 13:29
y=mx è l'equazione della retta passante per l'origine.
M è il coefficente angolare della retta e individua la pendenza rispetto all'asse delle x.Q è l'ordinata dall'origine.
Attribusisco a x il valore di 1:
2*1+3=2+3=5
5 è x?
edit:
Cioè hai due punti sottrai le x eppoi le y.E dividi i valori!
AnonimoVeneziano
30-11-2008, 13:50
Male. Molto male! Queste sono cose da sapere a memoria. Tira fuori il libro delle medie e mettiti a studiare l'equazione della retta. Queste sono cose che ti serviranno sempre anche più avanti nelle superiori. Non serve comprare un libro solo sulla geometria analitica, basta sapere bene quella che ti insegnano a scuola.
Poveretto dai , è in un periodo difficile della sua vita , ci siamo passati tutti :D
MasterDany
30-11-2008, 13:55
Forse ho capito allora è -3 perchè m è il coefficente angolare. Prendo per esempio quesa retta:
y=2x
Tabella:
x y
-2 -4
0 0
2 4
Qui il coefficente angolare è 2 e questa retta passa per l'orgine
MasterDany
30-11-2008, 14:11
Devi semplicemente ricavare il valore di y quando x vale 0.
non riesco a capire nemmeno questa seconda funzione..
~FullSyst3m~
30-11-2008, 16:03
non riesco a capire nemmeno questa seconda funzione..
def IntercettaY (x1,y1,x2,y2):
x = input ("Inserisci un numero:")
if x > 0:
return Pendenza (x1,y1,x2,y2)
elif x == 0:
return y1, y2
Guarda questo codice e ragionaci
MasterDany
30-11-2008, 17:32
def IntercettaY (x1,y1,x2,y2):
x = input ("Inserisci un numero:")
if x > 0:
return Pendenza (x1,y1,x2,y2)
elif x == 0:
return y1, y2
Guarda questo codice e ragionaci
praticamente se x è maggiore di 0 calcola la pendenza altrimenti da i valori di y1 e y2.
X è riferito a x1 e x2?
~FullSyst3m~
30-11-2008, 17:44
praticamente se x è maggiore di 0 calcola la pendenza altrimenti da i valori di y1 e y2.
X è riferito a x1 e x2?
No, x è x = input ("Inserisci un numero: ")
cdimauro
30-11-2008, 19:41
Mi pare di aver letto da cdimauro che un tempo True e False venissero semplicemente valutati come 1 e 0, quindi forse fa riferimento ad una vecchia versione di Python. Adesso i booleani sono solo True e False.
Sì, True e False discendono dagli interi (sono numeri interi a tutti gli effetti) e hanno il valore 1 e 0 rispettivamente. Infatti si possono usare anche in operazioni matematiche:
>>> True * 5
5
>>> True + False
1
MasterDany
30-11-2008, 20:07
No, x è x = input ("Inserisci un numero: ")
si ma non ho capito a cosa serve messo li cosi.Per vedere se il programma puo partire?Insomma a che cosa serve l'input x?
~FullSyst3m~
30-11-2008, 22:26
si ma non ho capito a cosa serve messo li cosi.Per vedere se il programma puo partire?Insomma a che cosa serve l'input x?
Serve a prendere un numero in input dall'utente e poi viene controllato se è maggiore di 0
DanieleC88
30-11-2008, 22:50
Serve a prendere un numero in input dall'utente e poi viene controllato se è maggiore di 0
Sì, ma è un input totalmente inutile: a che serve ai fini del programma? :wtf:
~FullSyst3m~
01-12-2008, 07:14
Sì, ma è un input totalmente inutile: a che serve ai fini del programma? :wtf:
Serve a quello che ho detto. Se x è maggiore di 0 ritorna il valore di Pendenza, altrimenti se è uguale a 0 ritorna y. In ogni caso io non ricordo il testo dell'esercizio, quando lo avevo fatto io e l'ho postato mi hanno detto che era giusto.
Serve a quello che ho detto. Se x è maggiore di 0 ritorna il valore di Pendenza, altrimenti se è uguale a 0 ritorna y. In ogni caso io non ricordo il testo dell'esercizio, quando lo avevo fatto io e l'ho postato mi hanno detto che era giusto.
Quindi se x è uguale a zero, la retta intercetta l'asse delle ordinate in ben due punti, y1 e y2. Prova a fare un disegno e guarda se trovi una retta che si comporta in questo modo ;)
~FullSyst3m~
01-12-2008, 12:10
Quindi se x è uguale a zero, la retta intercetta l'asse delle ordinate in ben due punti, y1 e y2. Prova a fare un disegno e guarda se trovi una retta che si comporta in questo modo ;)
Sinceramente non ricordo nemmeno cosa voleva l'esercizio, forse quello era il codice provvisorio. Posto un altro codice:
def IntercettaY (x1, y1, x2, y2):
if Pendenza (x1, y1, x2, y2) == 0:
return y1, y2
Sinceramente non ricordo nemmeno cosa voleva l'esercizio, forse quello era il codice provvisorio. Posto un altro codice:
def IntercettaY (x1, y1, x2, y2):
if Pendenza (x1, y1, x2, y2) == 0:
return y1, y2
Completamente sbagliato. Una retta non incontra mai l'asse delle ordinate due volte, specialmente quando pendenza è 0.
Esercizio:
Prova a ricavare l'equazione della retta che passa per i punti P1(2,7) e P2(8,25). Fai il disegno su carta dei punti e traccia la retta. Ti dico subito che i valori giusti sono 3 per la pendenza e 1 per l'intercetta.
MasterDany fallo pure te visto che questo era un tuo problema :)
~FullSyst3m~
01-12-2008, 14:01
Completamente sbagliato. Una retta non incontra mai l'asse delle ordinate due volte, specialmente quando pendenza è 0.
Esercizio:
Prova a ricavare l'equazione della retta che passa per i punti P1(2,7) e P2(8,25). Fai il disegno su carta dei punti e traccia la retta. Ti dico subito che i valori giusti sono 3 per la pendenza e 1 per l'intercetta.
MasterDany fallo pure te visto che questo era un tuo problema :)
Adesso ho altro da studiare, devo ancora mettermi sull'esercizio del metodo __cmp__. Oltretutto dovrei andare a ripassare le formule geometriche. Comunque lo avevo fatto questo esercizio tempo fa, ma devo trovare il codice corretto
MasterDany
01-12-2008, 14:30
Completamente sbagliato. Una retta non incontra mai l'asse delle ordinate due volte, specialmente quando pendenza è 0.
Esercizio:
Prova a ricavare l'equazione della retta che passa per i punti P1(2,7) e P2(8,25). Fai il disegno su carta dei punti e traccia la retta. Ti dico subito che i valori giusti sono 3 per la pendenza e 1 per l'intercetta.
MasterDany fallo pure te visto che questo era un tuo problema :)
mmm...mi servono le formule geometriche..
edit:
y=mx+q rappresenta l'equzione di una retta.
DanieleC88
01-12-2008, 14:39
Non servono molte formule geometriche, eh... È una cosa piuttosto facile, se ci ragionate. :)
Tip: l'equazione di una generica retta ve l'ha detta VICIUS prima, ora pensate a quali valori vi servono all'interno di quell'equazione.
MasterDany
01-12-2008, 15:07
allora ecco l'equazione della retta:
y-2 x-2 y-2 x-2
___=___ = ____=____ =1(y-2)=3(x-2)=y-2=3x-6
25-7 8-2 18 6
Come si calcola?
DanieleC88
01-12-2008, 15:24
Riducila alla forma y = mx + q, e poi ragiona sul significato delle variabili, capirai subito il funzionamento. ;)
MasterDany
01-12-2008, 15:24
Riducila alla forma y = mx + q, e poi ragiona sul significato delle variabili, capirai subito il funzionamento. ;)
non so calcolarla..chi se le ricorda più le equazioni :stordita:
DanieleC88
01-12-2008, 15:35
Ma se nell'ultimo post l'hai calcolata... :mbe:
Mancava solo un passaggio, per altro banale... guardaci bene e capirai. :D
MasterDany
01-12-2008, 15:43
y-2 x-2 y-2 x-2
___=___ = ____=____ =1(y-2)=3(x-2)=y-2=3x-6=y-3x+2+6=0
25-7 8-2 18 6
DanieleC88
01-12-2008, 15:54
Non mettere segni di uguale ovunque, sennò non si capisce niente. Tu eri rimasto a:
y - 2 = 3x - 6
quindi ti bastava portare il -2 a destra (aggiungere quindi +2 sia a sinistra che a destra):
y = 3x - 4
Ora, sai che questa equazione ti sta dicendo "per ogni valore di x, y vale 3 volte il valore di x meno 4".
Quindi, quando la retta incontra l'asse delle Y, quanto vale x? Risolvi questo e saprai se e dove la retta incontra l'asse delle Y. ;)
MasterDany
01-12-2008, 16:04
Non mettere segni di uguale ovunque, sennò non si capisce niente. Tu eri rimasto a:
y - 2 = 3x - 6
quindi ti bastava portare il -2 a destra (aggiungere quindi +2 sia a sinistra che a destra):
y = 3x - 4
Ora, sai che questa equazione ti sta dicendo "per ogni valore di x, y vale 3 volte il valore di x meno 4".
Quindi, quando la retta incontra l'asse delle Y, quanto vale x? Risolvi questo e saprai se e dove la retta incontra l'asse delle Y. ;)
Allora la pendenza riporta(3)Ora bisogna calcolare il valore di x quando la retta interseca L'asse y.Allora
y=0 -------> 0=3x-4 -----> 3x=5 -----> x=???
non sono sicuro che ci va li?
DanieleC88
01-12-2008, 16:15
In quel caso sarebbe 5/3 (anche se il valore esatto sarebbe 4/3, da dove esce quel 5? :wtf: ), ma hai appena calcolato l'ascissa sulla quale passa la retta intersecando l'asse delle X... ripensa alle coordinate, a te serve l'ordinata sulla quale passa la retta intersecando l'asse delle Y, invece. :)
MasterDany
01-12-2008, 16:20
cosi?
y=3*0-4 ----->y=0-4 ------> y=-4
Non è nemmeno questa visto che non riporta..
DanieleC88
01-12-2008, 16:23
Non riporta cosa? Invece sì, tu ora sai che quando è x = 0 allora è y = -4. Quindi la retta passa per l'asse Y sul punto di coordinate (0; -4). Perché non sarebbe giusta?
MasterDany
01-12-2008, 16:27
Non riporta cosa? Invece sì, tu ora sai che quando è x = 0 allora è y = -4. Quindi la retta passa per l'asse Y sul punto di coordinate (0; -4). Perché non sarebbe giusta?
scusa ho sbagliato.La parte matematica è finita adesso?
Posso passare alla scrittura del codice?
y-2 x-2 y-2 x-2
___=___ = ____=____ =1(y-2)=3(x-2)=y-2=3x-6=y-3x+2+6=0
25-7 8-2 18 6
Hai scelto la strada più difficile. Specialmente se vuoi implementarla tramite delle funzioni. Oltretutto c'è un errore al primo numeratore che ha compromesso tutto. Fai una prova con l'equazione sostituendo i punti che ti ho dato.
Se vuoi fare prima pensa alla forma esplicita: y = mx + q. Dove m è il rapporto dei cateti mentre q si ricava usando l'equazione qui sopra e uno dei punti che ti ho dato.
MasterDany
01-12-2008, 16:30
Hai scelto la strada più difficile. Specialmente se vuoi implementarla tramite delle funzioni. Oltretutto c'è un errore al primo numeratore che ha compromesso tutto. Fai una prova con l'equazione sostituendo i punti che ti ho dato.
Se vuoi fare prima pensa alla forma esplicita: y = mx + q. Dove m è il rapporto dei cateti mentre
non ci sto capendo niente cosi :cry:
Qualche esempio più concreto.??
Sono d'accordo con la forma esplicita ma io in quel caso l'ho trovata.
q si ricava usando l'equazione qui sopra e uno dei punti che ti ho dato.
Qui non ci capisco proprio niente.... :cry: :cry: :cry:
non ci sto capendo niente cosi :cry:
Qualche esempio più concreto.??
Intanto trova l'errore nei tuoi calcoli. L'equazione che hai ricavato è sbagliata. Poi questa sera vedo se riesco a fare qualche disegno per cercare di spiegarti meglio questo affare.
Sto lentamente cominciando a capire come mai la mia professoressa delle superiori aveva un tic nervoso all'occhio :asd:
MasterDany
01-12-2008, 16:38
Intanto trova l'errore nei tuoi calcoli. L'equazione che hai ricavato è sbagliata. Poi questa sera vedo se riesco a fare qualche disegno per cercare di spiegarti meglio questo affare.
L'errore è che apposto del 2 ci va sette perchè è y1
Sto lentamente cominciando a capire come mai la mia professoressa delle superiori aveva un tic nervoso all'occhio :asd:[/QUOTE]
:confused:
DanieleC88
01-12-2008, 16:43
È vero, i valori erano sballati, non avevo notato il post originale.
MasterDany, fatti un piccolo riepilogo e prova a disegnare dei grafici, se la cosa ti aiuta:
Equazione: y = mx + q
m = (y1 - y0)/(x1 - x0)
q la ricavi per sostituzione
MasterDany
01-12-2008, 16:45
È vero, i valori erano sballati, non avevo notato il post originale.
MasterDany, fatti un piccolo riepilogo e prova a disegnare dei grafici, se la cosa ti aiuta:
Equazione: y = mx + q
m = (y1 - y0)/(x1 - x0)
q la ricavi per sostituzione
la q rimane l'uncio problema...
la q rimane l'uncio problema...
Se hai già m prendi il primo punto con coordinate (2,7) e sostituisci i valori nella equazione:
y = mx + q
che diventa:
7 = 3*2 + q
Ed ottieni:
q = 1
Che guarda caso è anche il risultato che deve dare la seconda funzione che devi creare perché ponendo x a 0 ottieni y = 1.
EDIT: Capito il procedimento, tradurlo in python è banale.
MasterDany
01-12-2008, 17:02
non ci siamo ancora con la seconda funzione...
MasterDany
01-12-2008, 17:07
def IntercettaY(x1,y1,x2,y2):
return y1/Pendenza(x1,y1,x2,y2)*x1+1
c'entra qualcosa??
edit:
no :stordita:
MasterDany
01-12-2008, 17:13
Forse ho capito allora q è 1:
quindi sarebbe:
y=3*0+1 ----->y=0+1 ------> y=+4
In python:
def IntercettaY(x1,y1,x2,y2):
return Pendenza(x1,y1,x2,y2)*0+1
DanieleC88
01-12-2008, 17:17
No, se moltiplichi una cosa per zero, la azzeri, il 3 non può resuscitare. :D
In più, nel codice Python che senso ha calcolare un valore ed azzerarlo appena dopo? ;)
MasterDany
01-12-2008, 17:22
allora com'è?
DanieleC88
01-12-2008, 17:27
Certo che tu e ~FullSystem~ portate proprio fretta... :D
Carta e penna! Se tu sai che l'equazione in funzione di y è:
y = mx + q
allora in funzione di q è:
y - mx = q
q = y - mx
E tu x ed y li conosci, m lo calcoli... non ti manca niente... :)
MasterDany
01-12-2008, 17:34
Certo che tu e ~FullSystem~ portate proprio fretta... :D
Carta e penna! Se tu sai che l'equazione in funzione di y è:
y = mx + q
allora in funzione di q è:
y - mx = q
q = y - mx
E tu x ed y li conosci, m lo calcoli... non ti manca niente... :)
x quant'è?? 0 oppure il valore del primo punto?
forse ci siamo.
MasterDany
01-12-2008, 17:37
q è 1 perchè
q=7-(3*2)=7-6=1
Fino a qui ci sono poi?
x è 2
MasterDany
01-12-2008, 17:48
def IntercettaY(x1,y1,x2,y2):
return y1-Pendenza(x1,y1,x2,y2)*2
edit: sbaglia anche questa uhm.
~FullSyst3m~
01-12-2008, 17:52
Certo che tu e ~FullSystem~ portate proprio fretta... :D
Carta e penna! Se tu sai che l'equazione in funzione di y è:
y = mx + q
allora in funzione di q è:
y - mx = q
q = y - mx
E tu x ed y li conosci, m lo calcoli... non ti manca niente... :)
Che c'entro io? Dove vado di fretta? Io scrivo su carta vedi prima di provare il codice, non scrivo codice su pc da una settimana ormai, faccio tutto su carta prima e poi provo il codice
DanieleC88
01-12-2008, 18:09
Madonna però, non prendere ogni minima osservazione come un attacco personale. Stavo solo facendo una battuta, in questo caso poteva fermarsi giusto un attimo in più a pensarci e sarebbe arrivato anche da solo alla risposta... Ho detto così solo perché in passato è capitato anche a te, ma sono errori che si commettono, quindi non pensare che fosse un'accusa di qualche tipo. :rolleyes:
MasterDany
01-12-2008, 18:11
def IntercettaY(x1,y1,x2,y2):
return y1-Pendenza(x1,y1,x2,y2)*2 #7-3*2
DanieleC88
01-12-2008, 18:11
edit: sbaglia anche questa uhm.
Il valore di x è sempre 2?
MasterDany
01-12-2008, 18:12
il valore cambia in base all'input
~FullSyst3m~
01-12-2008, 18:12
Madonna però, non prendere ogni minima osservazione come un attacco personale. Stavo solo facendo una battuta, in questo caso poteva fermarsi giusto un attimo in più a pensarci e sarebbe arrivato anche da solo alla risposta... Ho detto così solo perché in passato è capitato anche a te, ma sono errori che si commettono, quindi non pensare che fosse un'accusa di qualche tipo.
Non prendo ogni minima osservazione come un attacco personale, ho voluto solo spcificare. E' normale che capita a tutti, è capitato anche a te, nessuno nasce insegnato
DanieleC88
01-12-2008, 18:14
il valore cambia in base all'input
Appunto... :)
MasterDany
01-12-2008, 18:38
mmm..spero di esserci:
X1=input("coordinate x per il punto 1 - ")
Y1=input("coordinate y per il punto 1 - ")
X2=input("coordinate x per il punto 2 - ")
Y2=input("coordinate y per il punto 2 - ")
def Pendenza(x1,y1,x2,y2):
if (x1 == 0) and (x2 == 0):
print "Immettere valori superiori allo 0"
else:
dx = x2 - x1
if dx==0:
print "Impossibile"
else:
ny = y2 - y1
return ny / dx
def Intercetta(x1,y1,x2,y2):
return y1-Pendenza(x1,y1,x2,y2)*x1 #q = y - mx
print Intercetta(X1,Y1,X2,Y2)
DanieleC88
01-12-2008, 18:46
Ok, dovrebbe andare bene adesso. Solo una cosa:
def Pendenza(x1,y1,x2,y2):
if (x1 == 0) and (x2 == 0):
print "Immettere valori superiori allo 0"
else:
dx = x2 - x1
if dx==0:
print "Impossibile"
else:
ny = y2 - y1
return ny / dx
A che serve il primo if? Se x1 = 0 ed x2 = 0, allora dx = x2 - x1 = 0 - 0 = 0, quindi è un caso già considerato. :)
MasterDany
01-12-2008, 18:50
X1=input("coordinate x per il punto 1")
Y1=input("coordinate y per il punto 1")
X2=input("coordinate x per il punto 2")
Y2=input("coordinate y per il punto 2")
def Pendenza(x1,y1,x2,y2):
dx = x2 - x1
if dx==0:
print "Impossibile"
else:
ny = y2 - y1
Temp = ny / dx
return Temp
def Intercetta(x1,y1,x2,y2):
return y1-Pendenza(x1,y1,x2,y2)*x1 #q = y - mx
print Intercetta(X1,Y1,X2,Y2)
Troppo interessante questo topic.. ;)
DanieleC88
01-12-2008, 19:00
Ok, la puoi fare anche un po' più compatta:
def Pendenza(x1, y1, x2, y2):
dx = (x2 - x1)
dy = (y2 - y1)
if (dx == 0):
print "Impossibile!"
return None
return (dy / dx)
Intendiamoci, il tuo codice andava bene, era solo un appunto "stilistico". :)
Bravo. ;)
MasterDany
01-12-2008, 19:05
Ok, la puoi fare anche un po' più compatta:
def Pendenza(x1, y1, x2, y2):
dx = (x2 - x1)
dy = (y2 - y1)
if (dx == 0):
print "Impossibile!"
return None
return (dy / dx)
Intendiamoci, il tuo codice andava bene, era solo un appunto "stilistico". :)
Bravo. ;)
return None
cosa significa?
MasterDany
01-12-2008, 19:14
Problemi col paragrafo 5.4 del capitolo 5...allora l'esercizio l'ho fatto ecco il codice:
ny=input("Digita un numero")
nx=input("Digita un'altro numero")
nz=input("Digita di nuovo un numero")
def CompresoTra(x,y,z):
if y<x<z:
return True
else:
return False
print CompresoTra(nx,ny,nz)
questo codice fa quello che deve fare molto bene...però sul libro c'è scritto anche che:
Le funzioni booleane sono spesso usate in istruzioni condizionali:
if Divisibile(x, y):
print x, "e' divisibile per", y
else:
print x, "non e' divisibile per", y
come faccio a fare il mio programma con questo codice?
Cosi:
def CompresoTra(x,y,z):
return y<x<z
if CompresoTra(x,y,z):
print x,"e' minore di ",z ,"ma maggiore di",y
else:
print "errore"
Non funziona da il seguqnte errore:
Traceback (most recent call last):
File "ct2.py", line 3, in <module>
if CompresoTra(x,y,z):
NameError: name 'x' is not defined
Come risolvo?
DanieleC88
01-12-2008, 19:14
return None
cosa significa?
Significa che alla funzione fai restituire... "niente", ed è ciò che Python restituisce se non trova un diverso return prima dell'uscita dalla funzione. È un valore speciale che non dovresti usare per funzioni come questa, che si aspettano un valore numerico in output (altrimenti la funzione chiamante dovrebbe controllare sempre di non aver ricevuto un None al posto di un numero). Però te l'ho messo perché per ovviare al problema dovresti ricorrere alle eccezioni, che sono un argomento che studierai solo in seguito, era un po' presto per introdurlo.
MasterDany
01-12-2008, 19:16
Significa che alla funzione fai restituire... "niente", ed è ciò che Python restituisce se non trova un diverso return prima dell'uscita dalla funzione. È un valore speciale che non dovresti usare per funzioni come questa, che si aspettano un valore numerico in output (altrimenti la funzione chiamante dovrebbe controllare sempre di non aver ricevuto un None al posto di un numero). Però te l'ho messo perché per ovviare al problema dovresti ricorrere alle eccezioni, che sono un argomento che studierai solo in seguito, era un po' presto per introdurlo.
Le eccezioni le ho già studiate in Java
DanieleC88
01-12-2008, 19:20
def CompresoTra(x,y,z):
return y<x<z
if CompresoTra(x,y,z):
print x,"e' minore di ",z ,"ma maggiore di",y
else:
print "errore"
Be', x, y e z sono definite in CompresoTra(), ma fuori dallo scope della funzione quanto dovrebbero valere? :)
DanieleC88
01-12-2008, 19:21
Le eccezioni le ho già studiate in Java
E che ne posso mai sapere io di che hai fatto e che non hai fatto? :p
~FullSyst3m~
01-12-2008, 19:22
Troppo interessante questo topic.. ;)
Troppo interessante Python direi.
P.S: usa il tag code per il codice ;)
~FullSyst3m~
01-12-2008, 19:26
Be', x, y e z sono definite in CompresoTra(), ma fuori dallo scope della funzione quanto dovrebbero valere? :)
Esatto, tu chiami la funzione con i valori x,y,z che sono passati nella definizione, quando tu li chiami fuori dalla funzione non esistono quei valori perchè sono variabili locali
MasterDany
01-12-2008, 19:36
Perchè cosi non va?
def CompresoTra(x,y,z):
return y<x<z
if CompresoTra(4,2,6):
print x,"e' minore di ",z ,"ma maggiore di",y
else:
print "errore"
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.