View Full Version : [Python]Gestione output liste e dizionari
Ciao, ho appena iniziato a guardare un po' python e mi sto facendo un programmino per calcolarmi la media pesata dei voti universitari.
#! /usr/bin/python
from collections import defaultdict
...
#Main
dummyMarks=defaultdict(list) #Creates a dictionary of list
fp=open('voti.txt','r')
for line in fp:
dummy1=line.split('\t')
dummyMarks[dummy1[0]].append(dummy1[1:len(dummy1)-1])
#Print marks in alphabetical order
dummyKeys=dummyMarks.keys()
dummyKeys.sort()
for k in dummyKeys:
print '%s: %s' %(k, dummyMarks[k])
...
Il problema che ora ho è come gestire l'output per i dizionari e le liste.
Come si può vedere, nel 'main' ho creato un dizionario di liste in cui carico i voti presi da un file di testo opportunatemente formattato:
NomeCorso \t Peso \t Voto \t DataRegistrazione\n
Ora l'output che mi stampa è:
Nome Corso: [['Peso', 'Voto']]
Vorrei togliere le quadre e magari poter scrivere prima il voto e poi il peso.
Come prima cosa ho pensato che era necessario mettere i valori ( quindi peso e voto ) dentro una lista tramite dummyMarks.values()
Ho provato a guardare su internet: http://www.decalage.info/en/python/print_list
Il guaio è che i miei voti alcuni sono interi, altri sono stringhe ( ad esempio 30 Lode ) e non ho trovato una soluzione valida.
Inoltre trovo veramente macchinoso gestire l'output di questi dati ( Liste, Dizionari ), ma forse si tratta di inesperienza.
Sto pensando che forse fare una classe dalla quale poi creo un oggetto voto che mi tiene il nome del corso, il voto e il peso venga più facile. Ma ancora devo vedere come si costruiscono le classi. Per ora ho fatto solo programmazione modulare.
Una piccola nota: Al di là della gestione dell'output, trovo veramente fantastico python. In 2 giorni ho fatto da 0 questo programmino, riuscendo a leggere da file e cacciare dentro le variabili i dati in maniera corretta.
Mi viene da ridere se penso di doverlo fare in C... :D
Un'ulteriore nota: Non mi è chiaro come funziona la dichiarazione di variabili. Non esiste una funzione principale ( il caro e vecchio main? ) dove dichiarare le variabili? Le variabili sono tendenzialmente sempre globali ( come nel mio caso )? Non è un abuso? E i passaggi per riferimento non esistono immagino, dato che da quel che ne so i puntatori non esistono, come si ovvia a questo problema (?) ?
ingframin
16-10-2012, 14:13
Prova a mettere questo nel for, non ho provato ma credo che funzioni.
print '%s: %s,%s' % (k,str(dummyMarkers[k][0]),str(dummyMarkers[k][1]))
Per quanto riguarda il main non esiste in python.
Il file e' il main in pratica ma puoi fare una cosa del genere:
If __name__ == '__main__':
Codice...
In modo da eseguire quella parte solo quando il file in cui e' e' chiamato come primo.
Per le variabili basta che non dichiari variabili in giro per il codice ma solo localmente dove ti servono.
Un po' come nei linguaggi funzionali... Ricordati inoltre che puoi passare funzioni come parametro ad altre funzioni e rendere eseguibile una classe in cui definisci il metodo __call__()!
Sembra un po'macchinoso all'inizio ma una votla che ci prendi mano vai liscio
come l'olio ;)
Ah! Se dividi il programma su piu' file ricordati che le variabili che definisci in un file non sono visibili negli altri e soprattutto una variabile e' visibile solo dal
codice che le sta sotto!
Prova a mettere questo nel for, non ho provato ma credo che funzioni.
print '%s: %s,%s' % (k,str(dummyMarkers[k][0]),str(dummyMarkers[k][1]))
Non va, da questo errore.
IndexError: list index out of range
Credo per il fatto che il dizionario è formato da una chiave ( nel mio caso il nome del corso ) e un valore ( il peso + il voto ) e ho come l'impressione che il valore sia un'unica cosa inscindibile.
Per quanto riguarda il main non esiste in python.
Il file e' il main in pratica ma puoi fare una cosa del genere:
If __name__ == '__main__':
Codice...
In modo da eseguire quella parte solo quando il file in cui e' e' chiamato come primo.
Ma si usa? O è solo per i nostalgici?
Un po' come nei linguaggi funzionali... Ricordati inoltre che puoi passare funzioni come parametro ad altre funzioni e rendere eseguibile una classe in cui definisci il metodo __call__()!Ancora non ho studiato questa parte delle funzioni e dei parametri. Ho letto la guida sul sito ufficiale della 3.3 e mi è sembrata un po' intricata.
e soprattutto una variabile e' visibile solo dal
codice che le sta sotto!
Pure le variabili globali?
Cioè se definisco fuori da una funzione ma sotto, una variabile, questa non è accessibile dalla funzione?? :mbe:
def funzione():
return 0
variabile=0
cdimauro
17-10-2012, 08:32
Ciao, ho appena iniziato a guardare un po' python e mi sto facendo un programmino per calcolarmi la media pesata dei voti universitari.
#! /usr/bin/python
from collections import defaultdict
...
#Main
dummyMarks=defaultdict(list) #Creates a dictionary of list
fp=open('voti.txt','r')
for line in fp:
dummy1=line.split('\t')
dummyMarks[dummy1[0]].append(dummy1[1:len(dummy1)-1])
#Print marks in alphabetical order
dummyKeys=dummyMarks.keys()
dummyKeys.sort()
for k in dummyKeys:
print '%s: %s' %(k, dummyMarks[k])
...
Lo so che è il tuo primo programma Python, ma alcune indicazioni veloci te lo fornisco lo stesso, perché così impari cose nuove che ti saranno utili dopo (e tra l'altro il programma risulta semplificato).
Se non usi fp.close() alla fine, lasciando che sia Python a chiudere il file quando non viene più referenziato, puoi scrivere questo:
for line in open('voti.txt'):
che sostituisce quelle 2 righe.
Questo perché un file è un oggetto che può essere "iterato", e ti restituisce una alla volta tutte le righe (ovviamente dev'essere un file di testo).
Inoltre non serve specificare il tipo di accesso, 'r', perché è il default.
Se non t'interessa l'ultimo valore (o, in generale, gli ultimi valori) di una sequenza (tupla, lista, stringhe, ecc.), puoi usare questa espressione:
dummy1[1 : -1]
Il -1 indica l'ultimo elemento della sequenza, per cui Python si fermerà quando arriverà a lui (ma NON lo prenderà; si tratta del limite strettamente superiore dell'intervallo che t'interessa).
Ovviamente con -2 scarta gli ultimi due, ecc.
Se t'interessa scorrere gli elementi di dizionario ordinandoli, puoi usare la funzione built-in sorted, e quindi il tuo for diventerà:
for k in sorted(dummyKeys):
sorted funziona con qualunque oggetto iterabile (sequenze, dizionari, insiemi, array, ecc.)
Il problema che ora ho è come gestire l'output per i dizionari e le liste.
Come si può vedere, nel 'main' ho creato un dizionario di liste in cui carico i voti presi da un file di testo opportunatemente formattato:
NomeCorso \t Peso \t Voto \t DataRegistrazione\n
Ora l'output che mi stampa è:
Nome Corso: [['Peso', 'Voto']]
Vorrei togliere le quadre e magari poter scrivere prima il voto e poi il peso.
Succede perché hai creato una lista, a cui appendi elementi che sono anch'essi delle liste. Il metodo split, infatti, restituisce una lista.
Con la print di sopra, tu stampi tutti i voti di uno specifico corso, che non sono singoli valori, ma più valori. Dunque dovresti, per ogni corso, stampare (ordinamente, come chiedi sotto) tutti i loro elementi. Ad esempio:
for k in sorted(dummyKeys):
print k + ':'
for Peso, Voto in dummyKeys[k]:
print ' ', Voto, Peso
Questo risolve anche il tuo problema di prima, cioè il voler stampare prima il voto e poi il peso.
Come prima cosa ho pensato che era necessario mettere i valori ( quindi peso e voto ) dentro una lista tramite dummyMarks.values()
Ho provato a guardare su internet: http://www.decalage.info/en/python/print_list
Il guaio è che i miei voti alcuni sono interi, altri sono stringhe ( ad esempio 30 Lode ) e non ho trovato una soluzione valida.
Qui puoi dare spazio alla fantasia, perché soluzioni ce ne sono possono essere diverse.
Esempio: controlla il voto, e se è '30 Lode' memorizzi la tupla (30, ' Lode'), altrimenti memorizzi la tupla (int(Voto), ''). In questo modo hai convertito i valori in una struttura (tupla di due valori) che consente di essere ordinata mettendo alla fine i 30 e lode. In fase di stampa, ti basterà il seguente codice:
Voto, Lode = tupla
print str(voto) + Lode
Per visualizzare correttamente il risultato. Anche perché, come vedi sopra, ho messo uno spazio prima della parola Lode, proprio per facilitare la concatenazione del voto.
Inoltre trovo veramente macchinoso gestire l'output di questi dati ( Liste, Dizionari ), ma forse si tratta di inesperienza.
Devi farci la mano. Poi vedrai che ti troverai benissimo.
Sto pensando che forse fare una classe dalla quale poi creo un oggetto voto che mi tiene il nome del corso, il voto e il peso venga più facile. Ma ancora devo vedere come si costruiscono le classi. Per ora ho fatto solo programmazione modulare.
Nello specifico, non serve. Aggiusta un po' il codice e vedrai che te ne esci fuori senza tirare in ballo le classi.
Le classi preferisco utilizzarle quando devo esprimere una relazione fra oggetti. Come "contenitori" preferisco i dizionari.
Una piccola nota: Al di là della gestione dell'output, trovo veramente fantastico python. In 2 giorni ho fatto da 0 questo programmino, riuscendo a leggere da file e cacciare dentro le variabili i dati in maniera corretta.
Mi viene da ridere se penso di doverlo fare in C... :D
Rideresti ancora di più se avessi usato il modulo csv, che ti semplificava ancora di più il parsing dei dati del file. :D
Un'ulteriore nota: Non mi è chiaro come funziona la dichiarazione di variabili. Non esiste una funzione principale ( il caro e vecchio main? ) dove dichiarare le variabili?
No. Vien considerato come "principale" il modulo da cui è partita l'esecuzione, e puoi saperlo come ti ha indicato correttamente ingframin.
Le variabili sono tendenzialmente sempre globali ( come nel mio caso )?
Sono locali se le dichiari all'interno di una funzione. Globali altrimenti.
Non è un abuso?
No. Dipende tutto da quello che vuoi farci. In genere le variabili che dichiari fuori dalle funzioni sono globali, ma appartengono al modulo. Non sono, quindi, visibili all'intero programma. Ma vi puoi accedere ovunque con la sintassi Modulo.NomeVariabile.
E i passaggi per riferimento non esistono immagino, dato che da quel che ne so i puntatori non esistono, come si ovvia a questo problema (?) ?
Anche qui, dipende tutto da quello che si vuole realizzare. In Python per restituire più di un valore si utilizzano le tuple:
def f():
return 8.5, 'Monti', [1, 1, 2, 3, 5]
OttoEMezzo, Vampiro, Fibo = f()
Non va, da questo errore.
IndexError: list index out of range
Credo per il fatto che il dizionario è formato da una chiave ( nel mio caso il nome del corso ) e un valore ( il peso + il voto ) e ho come l'impressione che il valore sia un'unica cosa inscindibile.
E' dovuto al fatto che hai una lista di liste, come ti dicevo.
Ma si usa? O è solo per i nostalgici?
Si usa quando devi distinguere se un modulo è stato eseguito come programma (principale) oppure semplicemente importato dal programma (o da uno degli altri moduli da lui importati).
E' comodissimo perché, ad esempio, se lo lanci come programma principale puoi eseguire una batteria di test per controllare che le funzioni e/o classi in esso definite funzioni.
Oppure, più semplicemente, perché il modulo ti offre una serie di funzionalità che sono comode da usare dall'esterno. Ad esempio se hai scritto un modulo che calcola equazioni di primo grado, secondo grado, ecc., lanciandolo come programma principale puoi selezionare il tipo di equazione da risolvere, passargli i parametri da linea di comando, e visualizzare il risultato.
Ancora non ho studiato questa parte delle funzioni e dei parametri. Ho letto la guida sul sito ufficiale della 3.3 e mi è sembrata un po' intricata.
Sono funzionalità molto più avanzate, per cui al momento fermati e fatti le ossa con cose più semplici.
Ma è roba estremamente potente. Ad esempio l'ultima applicazione del metodo speciale __call__ che ho scritto mi consente di fare questo:
Service = JSONBin.Service('http://127.0.0.1:8080/WSGI/POST/')
Service.Test(JSONBin.BinaryStringResource('y', 'filename.py', 'Prova! \x80'), x = 1)
Service è la classe in cui è definito __call__. E' un proxy a un server HTTP che accetta chiamate a un nuovo protocollo che ho realizzato (che ho chiamato JSON+Bin).
Test è un'API esposta dal server, e che accetta un certo numero di parametri in formato JSON (+Bin :D ma non ne voglio parlare al momento).
Come vedi, chiamare quest'API del server è esattamente come invocare un metodo a cui passi gli eventuali parametri. Sarà poi la classe, internamente, a intercettare la chiamata, prendere l'API, costruire opportunamente l'URL (ma si può ottimizzare lasciando aperta la connessione HTTP ed eseguendo altre richieste), impacchettare i parametri passati in formato JSON (+Bin), spedirli al server, leggere il response, e restituirlo al chiamante.
Semplicissimo da usare, ma l'implementazione non è nemmeno complicata (anzi!) per chi ha imparato queste funzionalità.
Con Python ci si può sbizzarrire molto, come vedi. :cool:
Pure le variabili globali?
Cioè se definisco fuori da una funzione ma sotto, una variabile, questa non è accessibile dalla funzione?? :mbe:
def funzione():
return 0
variabile=0
No, è accessibile.
def funzione():
return variabile
variabile=0
print funzione() # Stampa 0
Ma bisogna stare attenti ad alcuni casi particolari:
def funzione():
return variabile
print funzione() # Genera un'eccezione perché non trova variabile
variabile=0
Questo succede perché il modulo in cui hai definito il codice viene eseguito riga per riga da Python, fino alla fine. Nello specifico, hai eseguito funzione, che fa uso della variabile "variabile". Solo che in quel momento Python non aveva ancora incontrato la riga che la definisce (variabile = 0), e quindi per lui non esiste nessuna variabile che si chiama così, e genera un'eccezione.
Se non usi fp.close() alla fine, lasciando che sia Python a chiudere il file quando non viene più referenziato, puoi scrivere questo:
for line in open('voti.txt'):
che sostituisce quelle 2 righe.
Questo perché un file è un oggetto che può essere "iterato", e ti restituisce una alla volta tutte le righe (ovviamente dev'essere un file di testo).
Inoltre non serve specificare il tipo di accesso, 'r', perché è il default.
Si questo lo sapevo ma preferisco fare le cose con rigore rispettando, almeno formalmente, i prototipi di classi e funzioni nelle librerie standard, questo almeno all'inizio.
Se non t'interessa l'ultimo valore (o, in generale, gli ultimi valori) di una sequenza (tupla, lista, stringhe, ecc.), puoi usare questa espressione:
dummy1[1 : -1]
Il -1 indica l'ultimo elemento della sequenza, per cui Python si fermerà quando arriverà a lui (ma NON lo prenderà; si tratta del limite strettamente superiore dell'intervallo che t'interessa).
Ovviamente con -2 scarta gli ultimi due, ecc.
Ecco lo slicing lo trovo poco logico per il fatto che il valore a dx dei due punti viene scartato.
Devo ancora prenderci la mano.. :stordita:
Succede perché hai creato una lista, a cui appendi elementi che sono anch'essi delle liste. Il metodo split, infatti, restituisce una lista.
Quello che ancora non riesco a capire è quanti indici posso aggiungere per ricavare i miei elementi.
Tipo, faccio un esempio C-style:
variabile -> Nessun indice
Vettore -> [i]
Matrice -> [i][j]
Matrice 3d -> [i][j][k]
ecc...
Finendo con il mettere liste dentro liste dentro dizionari perdo il senso di quanto 'a fondo' sono andato... :(
Con la print di sopra, tu stampi tutti i voti di uno specifico corso, che non sono singoli valori, ma più valori. Dunque dovresti, per ogni corso, stampare (ordinamente, come chiedi sotto) tutti i loro elementi. Ad esempio:
for k in sorted(dummyKeys):
print k + ':'
for Peso, Voto in dummyKeys[k]:
print ' ', Voto, Peso
Questo risolve anche il tuo problema di prima, cioè il voler stampare prima il voto e poi il peso.
Ho provato questo e fa ciò che voglio. Tuttavia, come faccio a impedirgli di andare a capo dopo il primo print?
Esempio: controlla il voto, e se è '30 Lode' memorizzi la tupla (30, ' Lode'), altrimenti memorizzi la tupla (int(Voto), ''). In questo modo hai convertito i valori in una struttura (tupla di due valori) che consente di essere ordinata mettendo alla fine i 30 e lode. In fase di stampa, ti basterà il seguente codice:
Voto, Lode = tupla
print str(voto) + Lode
Per visualizzare correttamente il risultato. Anche perché, come vedi sopra, ho messo uno spazio prima della parola Lode, proprio per facilitare la concatenazione del voto.
In realtà ora in fase di stampa funziona tutto... senza nessun particolare accorgimento.
Il problema sarà quando dovrò fare la media.
Ma per controllare una stringa mi basta fare
if stringa == '30 Lode':
...
?
Rideresti ancora di più se avessi usato il modulo csv, che ti semplificava ancora di più il parsing dei dati del file. :D:eek:
No. Vien considerato come "principale" il modulo da cui è partita l'esecuzione, e puoi saperlo come ti ha indicato correttamente ingframin.
Si usa quando devi distinguere se un modulo è stato eseguito come programma (principale) oppure semplicemente importato dal programma (o da uno degli altri moduli da lui importati).
E' comodissimo perché, ad esempio, se lo lanci come programma principale puoi eseguire una batteria di test per controllare che le funzioni e/o classi in esso definite funzioni.
Oppure, più semplicemente, perché il modulo ti offre una serie di funzionalità che sono comode da usare dall'esterno. Ad esempio se hai scritto un modulo che calcola equazioni di primo grado, secondo grado, ecc., lanciandolo come programma principale puoi selezionare il tipo di equazione da risolvere, passargli i parametri da linea di comando, e visualizzare il risultato.
Hmm non è ben chiaro: se faccio un file con il 'main' e dentro ci metto le chiamate alle funzione/classi ( poste in altri file ) per testarle, non so già io che quel file sarà il main e gli altri saranno cose secondarie?
Perchè dovrei usare quell'if?
Bene o male ho finito il programma.
Una domanda: siccome tra gli esami ho dovuto escludere un esame che non faceva media ( per il quale non c'è nemmeno un voto, ma solo un superato ), per farlo ho fatto:
dummyMarks=defaultdict(list) #Creates a dictionary of list
fp=open('voti.txt') #If not specified, file is opened in read mode
for line in fp:
dummy1=line.split('\t')
if 'sup' not in line: #Remove english exam, not required for mean
dummyMarks[dummy1[0]].append(dummy1[1:-1]) #Exclude the date with dummy1[1:-1]
Quello che mi chiedo è: se ho una riga che contiene sup dentro una parola ( 'insuperabile' ad esempio ), viene matchata dalla mia condizione, quindi me la toglie?
cdimauro
17-10-2012, 13:42
Si questo lo sapevo ma preferisco fare le cose con rigore rispettando, almeno formalmente, i prototipi di classi e funzioni nelle librerie standard, questo almeno all'inizio.
In Python si usano molto gli argomenti di default. Devi cominciare a farci l'abitudine, perché ti semplificano la vita. ;)
Ecco lo slicing lo trovo poco logico per il fatto che il valore a dx dei due punti viene scartato.
Devo ancora prenderci la mano.. :stordita:
Non ricordo se è stato Dijkstra a dimostrare che per definire degli intervalli nella programmazione è più conveniente che l'estremo destro sia aperto. Non sono riuscito a recuperare il link al paper.
Comunque, sì, è questione di abitudine.
Quello che ancora non riesco a capire è quanti indici posso aggiungere per ricavare i miei elementi.
Tipo, faccio un esempio C-style:
variabile -> Nessun indice
Vettore -> [i]
Matrice -> [i][j]
Matrice 3d -> [i][j][k]
ecc...
Finendo con il mettere liste dentro liste dentro dizionari perdo il senso di quanto 'a fondo' sono andato... :(
Mi pare semplice: ogni oggetto "indicizzabile" rappresenta un "livello".
L'unico problema che vedo qui, è che bisogna comprendere che si stanno usando due liste: quella principale, e quelle che sono contenute in ogni suo elemento.
Chiarito questo, diventa tutto più facile.
Ho provato questo e fa ciò che voglio. Tuttavia, come faccio a impedirgli di andare a capo dopo il primo print?
Metti un ; alla fine della print. Ovviamente dopo il for metti una print singola, in modo da andare a capo.
In realtà ora in fase di stampa funziona tutto... senza nessun particolare accorgimento.
Il problema sarà quando dovrò fare la media.
Ma per controllare una stringa mi basta fare
if stringa == '30 Lode':
...
?
Yes. In Python con gli appositi operatori (==, !=, <, <=, =>, >) puoi confrontare qualunque oggetto, anche molto complesso.
:eek:
Guarda qui (http://docs.python.org/library/csv.html) gli esempi.
Hmm non è ben chiaro: se faccio un file con il 'main' e dentro ci metto le chiamate alle funzione/classi ( poste in altri file ) per testarle, non so già io che quel file sarà il main e gli altri saranno cose secondarie?
Perchè dovrei usare quell'if?
Perché in Python il "main" non è altro che un modulo: non c'è nessuna differenza.
Però può essere utile capire se un modulo è stato eseguito (quindi come "main") oppure semplicemente importato.
Perché è importante distinguere fra le due cose? Perché posso incapsulare il codice di testing del modulo direttamente al suo interno, ma voglio che sia eseguito esclusivamente quando il modulo viene fatto girare come applicazione e non quando è importato.
Se mettessi alla fine del modulo l'istruzione EseguiTest(), questa verrebbe chiamata sempre, sia che il modulo sia eseguito come applicazione, sia che venga importato. Se invece scrivo:
if __name__ == '__main__':
EseguitTest()
Il codice di test viene richiamato esclusivamente se il modulo viene eseguito come applicazione, e mai quando viene semplicemente importato.
Quando lo importo io voglio soltanto che mi metta a disposizione le sue funzioni, classi, e altro. Non voglio che venga eseguito codice di test.
Bene o male ho finito il programma.
Una domanda: siccome tra gli esami ho dovuto escludere un esame che non faceva media ( per il quale non c'è nemmeno un voto, ma solo un superato ), per farlo ho fatto:
dummyMarks=defaultdict(list) #Creates a dictionary of list
fp=open('voti.txt') #If not specified, file is opened in read mode
for line in fp:
dummy1=line.split('\t')
if 'sup' not in line: #Remove english exam, not required for mean
dummyMarks[dummy1[0]].append(dummy1[1:-1]) #Exclude the date with dummy1[1:-1]
Quello che mi chiedo è: se ho una riga che contiene sup dentro una parola ( 'insuperabile' ad esempio ), viene matchata dalla mia condizione, quindi me la toglie?
Esattamente.
Mi pare semplice: ogni oggetto "indicizzabile" rappresenta un "livello".
L'unico problema che vedo qui, è che bisogna comprendere che si stanno usando due liste: quella principale, e quelle che sono contenute in ogni suo elemento.
Mi ristudierò quello che ho costruito.
Quello che disapprovo di questi linguaggi di alto livello è che spesso riesci a fare le cose senza capire a fondo cosa stai facendo.
Metti un ; alla fine della print. Ovviamente dopo il for metti una print singola, in modo da andare a capo.
for k in sorted(dummyMarks): #Print marks in alphabetical order
print k,':';
for peso, voto in dummyMarks[k]:
print ' Voto:',voto, 'Peso: ',peso
Non va... Non cambia nulla...
Guarda qui (http://docs.python.org/library/csv.html) gli esempi.
Impressive ;)
Perché in Python il "main" non è altro che un modulo: non c'è nessuna differenza.
Si ma quando parte il programma, non sei tu a decidere quale file parte per primo?
Esattamente.
E quindi come faccio a dirgli di matchare la stringa come parola intera?
cdimauro
17-10-2012, 21:01
Mi ristudierò quello che ho costruito.
Quello che disapprovo di questi linguaggi di alto livello è che spesso riesci a fare le cose senza capire a fondo cosa stai facendo.
E' un problema di conoscenza. Sei all'inizio, e non hai ancora appreso gli strumenti del linguaggio. Poi tutto ti verrà naturale.
for k in sorted(dummyMarks): #Print marks in alphabetical order
print k,':';
for peso, voto in dummyMarks[k]:
print ' Voto:',voto, 'Peso: ',peso
Non va... Non cambia nulla...
Scusami, devi mettere la , alla fine, non il ;
Non lo uso mai, per cui ho scambiato i due caratteri.
Si ma quando parte il programma, non sei tu a decidere quale file parte per primo?
Certamente, e quello sarà il "main" del programma.
Ma il punto è che un modulo può anche essere usato per importare delle funzionalità, e in questo caso non deve fare niente.
Se, però, vuoi testarlo, puoi anche lanciarlo come programma, e in questo caso deve "attivarsi". Con quel controllo che è stato riportato puoi verificare se è stato importato o lanciato come programma, e comportarsi di conseguenza.
E quindi come faccio a dirgli di matchare la stringa come parola intera?
Così:
if line != 'sup':
Ma il punto è che un modulo può anche essere usato per importare delle funzionalità, e in questo caso non deve fare niente.
Se, però, vuoi testarlo, puoi anche lanciarlo come programma, e in questo caso deve "attivarsi". Con quel controllo che è stato riportato puoi verificare se è stato importato o lanciato come programma, e comportarsi di conseguenza.Inizio ad intuire..
Così:
if line != 'sup':
No ma così il controllo è fatto sull'intera stringa.
Io in line ho NomeCorso Peso Voto Data ( è un'unica stringa )
E quello che voglio fare io è cercare all'interno di questa stringa se come parola intera c'è 'sup'.
cdimauro
17-10-2012, 22:23
Ho capito adesso. Ecco qui:
if 'sup' not in line.split():
Col metodo split la stringa line viene suddivisa in una lista, prendendo tutto il whitespace (spazi, tab, newline) come separatore.
Siccome una lista è una sequenza, con l'operatore "in" puoi cercare se un elemento (nella sua interezza) vi appartiene; e con "not in" se non vi appartiene.
Eccellente! :D
Esiste un reference manual tipo il K&R per C ma di Python dove siano indicate tutte le funzioni standard? Una cosa concisa con prototipo della funzione, piccola descrizione e magari un esempio.
La guida di python va bene, ma spesso si perde in cose che non mi interssano e ci metto molto a trovare ciò che mi serve. Uguale a cercare su internet.
Per evitare che il print vada a capo ad esempio ho trovato soluzioni di non so quante righe di codice e mi pareva IMPOSSIBILE che python potesse fare molte cose ma cadesse su una banalità come questa...
Anche questa cosa dello split, se avessi avuto in mano un manuale la risolvevo in fretta senza nemmeno chiedere :sofico:
cdimauro
17-10-2012, 23:50
Dentro l'installazione di Python, per lo meno con Windows, è presente un file in formato CHM, che contiene tutto: tutorial, guida, libreria di riferimento, e... molto altro.
E' comodissimo perché puoi fare velocemente delle ricerche, e trovare tutto quello ti serve.
Ad esempio, se cerchi print, e poi selezioni statement, trovi la sintassi e la descrizione completa, che riporta anche il funzionamento della virgola usata come ultimo carattere.
Diciamo che è la bibbia di Python. :p
Dentro l'installazione di Python, per lo meno con Windows, è presente un file in formato CHM, che contiene tutto: tutorial, guida, libreria di riferimento, e... molto altro.
E' comodissimo perché puoi fare velocemente delle ricerche, e trovare tutto quello ti serve.
Ad esempio, se cerchi print, e poi selezioni statement, trovi la sintassi e la descrizione completa, che riporta anche il funzionamento della virgola usata come ultimo carattere.
Diciamo che è la bibbia di Python. :p
Hmm, diciamo che sono su Mac OS dove python è installato di default... :p
cdimauro
18-10-2012, 11:18
Da me si chiama python272.chm. Controlla la tua versione di Python, e vedi se c'è un file "equivalente". :)
HoldenCaulfield1987
18-02-2013, 09:54
A volte però con la doc mi trovo scomodo, perchè non ti dice tutto tutto.
Qualche volta le cose te le devi cercare facendo dei test.
Ad esempio la conversione di un oggetto in intero tramite int() funziona con le stringhe a meno che la stringa in questione non rappresenti un numero (es: 'abc'), nel qual caso genera una eccezione.
Nella doc questo non viene detto, ma sopratutto non viene detto che eccezione lancia.
cdimauro
18-02-2013, 10:00
int([x[, base]])
Convert a string or number to a plain integer. If the argument is a string, it must contain a possibly signed decimal number representable as a Python integer, possibly embedded in whitespace. The base parameter gives the base for the conversion (which is 10 by default) and may be any integer in the range [2, 36], or zero. If base is zero, the proper radix is determined based on the contents of string; the interpretation is the same as for integer literals. (See Numeric literals.) If base is specified and x is not a string, TypeError is raised. Otherwise, the argument may be a plain or long integer or a floating point number. Conversion of floating point numbers to integers truncates (towards zero). If the argument is outside the integer range a long object will be returned instead. If no arguments are given, returns 0.
A me pare molto chiaro.
Comunque è vero che la documentazione non copre sempre bene tutti gli aspetti del linguaggio o della libreria.
Preferirei, tra l'altro, che vi fossero più esempi, specialmente per le caratteristiche più avanzate. In ogni caso con qualche rapida ricerca in genere si trova proprio tutto (specialmente su StackOverflow).
HoldenCaulfield1987
18-02-2013, 10:05
If base is specified and x is not a string, TypeError is raised.
Non so da dove esce...
Se faccio: help(int()) mi da:
Convert a string or number to an integer, if possible. A floating
point argument will be truncated towards zero (this does not include a
string representation of a floating point number!) When converting a
string, use the optional base. It is an error to supply a base when
converting a non-string.
HoldenCaulfield1987
18-02-2013, 10:09
Sulla doc della 2.6 è come dice cdmauro, dalla 2.7 in poi invece è stata cambiata.
cdimauro
18-02-2013, 10:21
Sì, c'è differenza fra la docstring restituita dalla funzione help, e la documentazione standard (nel mio caso presa dal file chm).
P.S. Uso Python 2.7.2.
HoldenCaulfield1987
18-02-2013, 10:34
Sì, c'è differenza fra la docstring restituita dalla funzione help, e la documentazione standard (nel mio caso presa dal file chm).
P.S. Uso Python 2.7.2.
Strano, io ho preso le informazioni dalla doc sul sito, e sia la 2.7 che la 3 non menzionano l'eccezione.
cdimauro
18-02-2013, 10:45
E' vero, c'è discrepanza fra la documentazione online e il chm per la stessa versione.
Tra l'altro nella documentazione online della 2.6 c'è riportato il TypeError.
Mah. Non so che dire, a parte che non mi piace questa differenza.
Vincenzo1968
18-02-2013, 13:03
Una piccola nota: Al di là della gestione dell'output, trovo veramente fantastico python. In 2 giorni ho fatto da 0 questo programmino, riuscendo a leggere da file e cacciare dentro le variabili i dati in maniera corretta.
Mi viene da ridere se penso di doverlo fare in C... :D
:asd:
Vincenzo1968
18-02-2013, 13:19
Quello che disapprovo di questi linguaggi di alto livello è che spesso riesci a fare le cose senza capire a fondo cosa stai facendo.
:asd:
Vincenzo1968
18-02-2013, 13:22
Appena ho un po' di tempo posto la versione C con automa a stati finiti che è la soluzione più efficiente in casi come questo.
Ma in C! Che ridere! Uh! le risate!
:sbonk:
:rotfl:
cdimauro
18-02-2013, 14:05
Magari c'arrivi prima della pensione. :O
Vincenzo1968
18-02-2013, 14:11
Che ridere! Uh! le risate!
cdimauro
18-02-2013, 14:12
Non ti stanchi mai di fare il troll...
Vincenzo1968
18-02-2013, 14:15
Vuoi vedere che tu puoi pesantemente criticare il C dicendo che fa ridere* mentre io, al minimo accenno di critica(pesantezza del GC) su python, mi debbo beccare del troll ogni volta? :mbe:
* cdimauro dixit: "Rideresti ancora di più se avessi usato il modulo csv, che ti semplificava ancora di più il parsing dei dati del file."
Beh quello che ho detto è vero: quasi sicuramente spendi più righe di codice in C per fare la stessa cosa che in python, però per uno come me che ha iniziato in C ( e ha una visione abbastanza completa sul linguaggio ) diviene difficile gestire le cose con linguaggi di più alto livello come python, dove molte cose sono 'pappa pronta'.
Io parlo per quello che è successo/sta succedendo a me, tutto qua.
Ma come ho ripetuto più e più volte, è inesperienza la mia...
Vincenzo1968
18-02-2013, 15:05
Beh quello che ho detto è vero: quasi sicuramente spendi più righe di codice in C per fare la stessa cosa che in python, però per uno come me che ha iniziato in C ( e ha una visione abbastanza completa sul linguaggio ) diviene difficile gestire le cose con linguaggi di più alto livello come python, dove molte cose sono 'pappa pronta'.
Io parlo per quello che è successo/sta succedendo a me, tutto qua.
Ma come ho ripetuto più e più volte, è inesperienza la mia...
Ma io non ce l'ho con te. Ce l'ho con cdimauro che non perde occasione per parlare male del C. E l'espressione "pesanti critiche al C" è solo un eufemismo.
Le sue sono graziose battutine(talvolta "acide" come da lui stesso ammesso).
Io invece trollo. Dice lui.
Ma io non ce l'ho con te. Ce l'ho con cdimauro che non perde occasione per parlare male del C. E l'espressione "pesanti critiche al C" è solo un eufemismo.
Le sue sono graziose battutine(talvolta "acide" come da lui stesso ammesso).
Io invece trollo. Dice lui.
Ma si ma queste sono guerre di religione.
Ognuno ha le sue preferenze.
Io sono più esperto di C, e per questo mi viene più facile scrivere in C piuttosto che in python o java, ma preferisco Python per la classe intrinseca del linguaggio
Vincenzo1968
18-02-2013, 18:28
No è questione di rispetto per chi ci lavora col C(il linguaggio dico).
Non è che uno può far comparire, ad ogni occasione, chi lavora col C una specie di mentecatto sadomasochista e poi prendersela se uno scherza un attimino con la classificazione tra linguaggi "buoni" e "non buoni".
In Python si usano molto gli argomenti di default. Non ricordo se è stato Dijkstra a dimostrare che per definire degli intervalli nella programmazione è più conveniente che l'estremo destro sia aperto. Non sono riuscito a recuperare il link al paper.
http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1019.html
Nello specifico, non serve. Aggiusta un po' il codice e vedrai che te ne esci fuori senza tirare in ballo le classi.
Le classi preferisco utilizzarle quando devo esprimere una relazione fra oggetti. Come "contenitori" preferisco i dizionari.
E poi più avanti può guardarsi le namedtuple nel modulo collections, che parlando di containers sono più che utilissime.
p.s. fa sempre piacere incontrare un altro pythonista convinto :)
cdimauro
19-02-2013, 06:22
http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1019.html
Grazie, era da un pezzo che lo cercavo, ma non ero riuscito a trovarlo.
E poi più avanti può guardarsi le namedtuple nel modulo collections, che parlando di containers sono più che utilissime.
Senz'altro. Manipolare tuple esclusivamente con gli indici non è il massimo. In genere preferisco "spacchettare" la tupla se è costituita da pochi elementi, oppure ricorrere a una named tuple (a meno che non m'interessi guardare alle prestazioni, perché, in CPython, l'accesso a un attributo è più lento rispetto a quello a un indice; ma è raro che mi capiti di fare queste scelte).
p.s. fa sempre piacere incontrare un altro pythonista convinto :)
Idem. :) Il linguaggio (sarebbe meglio dire la piattaforma) merita, quindi mi prodigo, nel mio piccolo, per farlo conoscere e apprezzare, per cui se ci sono altri programmatori nella mia stessa condizione non posso che esserne felice.
ingframin
19-02-2013, 08:49
Grazie, era da un pezzo che lo cercavo, ma non ero riuscito a trovarlo.
Senz'altro. Manipolare tuple esclusivamente con gli indici non è il massimo. In genere preferisco "spacchettare" la tupla se è costituita da pochi elementi, oppure ricorrere a una named tuple (a meno che non m'interessi guardare alle prestazioni, perché, in CPython, l'accesso a un attributo è più lento rispetto a quello a un indice; ma è raro che mi capiti di fare queste scelte).
Idem. :) Il linguaggio (sarebbe meglio dire la piattaforma) merita, quindi mi prodigo, nel mio piccolo, per farlo conoscere e apprezzare, per cui se ci sono altri programmatori nella mia stessa condizione non posso che esserne felice.
Come diceva la tua vecchia immagine:
In python we trust
:D
cdimauro
19-02-2013, 09:08
Già. D'altra parte i frutti si vedono. :cool:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.