Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-10-2012, 12:30   #1
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
[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.
Codice:
#! /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:
Codice:
NomeCorso \t Peso \t Voto \t DataRegistrazione\n
Ora l'output che mi stampa è:
Codice:
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...

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 (?) ?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2012, 15:13   #2
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Prova a mettere questo nel for, non ho provato ma credo che funzioni.
Codice:
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:

Codice:
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!
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2012, 20:18   #3
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da ingframin Guarda i messaggi
Prova a mettere questo nel for, non ho provato ma credo che funzioni.
Codice:
print '%s: %s,%s' % (k,str(dummyMarkers[k][0]),str(dummyMarkers[k][1]))
Non va, da questo errore.
Codice:
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.

Quote:
Originariamente inviato da ingframin Guarda i messaggi
Per quanto riguarda il main non esiste in python.
Il file e' il main in pratica ma puoi fare una cosa del genere:

Codice:
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?

Quote:
Originariamente inviato da ingframin Guarda i messaggi
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.

Quote:
Originariamente inviato da ingframin Guarda i messaggi
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??

Codice:
def funzione():
   return 0

variabile=0
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 09:32   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ciao, ho appena iniziato a guardare un po' python e mi sto facendo un programmino per calcolarmi la media pesata dei voti universitari.
Codice:
#! /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:
Codice:
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:
Codice:
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à:
Codice:
for k in sorted(dummyKeys):
sorted funziona con qualunque oggetto iterabile (sequenze, dizionari, insiemi, array, ecc.)
Quote:
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:
Codice:
NomeCorso \t Peso \t Voto \t DataRegistrazione\n
Ora l'output che mi stampa è:
Codice:
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:
Codice:
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.
Quote:
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:
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.
Quote:
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.
Quote:
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.
Quote:
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...
Rideresti ancora di più se avessi usato il modulo csv, che ti semplificava ancora di più il parsing dei dati del file.
Quote:
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.
Quote:
Le variabili sono tendenzialmente sempre globali ( come nel mio caso )?
Sono locali se le dichiari all'interno di una funzione. Globali altrimenti.
Quote:
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.
Quote:
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:
Codice:
def f():
  return 8.5, 'Monti', [1, 1, 2, 3, 5]

OttoEMezzo, Vampiro, Fibo = f()
Quote:
Originariamente inviato da kwb Guarda i messaggi
Non va, da questo errore.
Codice:
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.
Quote:
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.
Quote:
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:
Codice:
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 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.
Quote:
Pure le variabili globali?
Cioè se definisco fuori da una funzione ma sotto, una variabile, questa non è accessibile dalla funzione??

Codice:
def funzione():
   return 0

variabile=0
No, è accessibile.

Codice:
def funzione():
   return variabile

variabile=0
print funzione() # Stampa 0
Ma bisogna stare attenti ad alcuni casi particolari:
Codice:
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.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 11:24   #5
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Se non usi fp.close() alla fine, lasciando che sia Python a chiudere il file quando non viene più referenziato, puoi scrivere questo:
Codice:
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.

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Se non t'interessa l'ultimo valore (o, in generale, gli ultimi valori) di una sequenza (tupla, lista, stringhe, ecc.), puoi usare questa espressione:
Codice:
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..

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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...

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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:
Codice:
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?

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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:
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
Codice:
if stringa == '30 Lode':
  ...
?
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Rideresti ancora di più se avessi usato il modulo csv, che ti semplificava ancora di più il parsing dei dati del file.


Quote:
Originariamente inviato da cdimauro Guarda i messaggi
No. Vien considerato come "principale" il modulo da cui è partita l'esecuzione, e puoi saperlo come ti ha indicato correttamente ingframin.
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 12:46   #6
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
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:
Codice:
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?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 14:42   #7
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da kwb Guarda i messaggi
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.
Quote:
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..
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.
Quote:
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.
Quote:
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.
Quote:
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
Codice:
if stringa == '30 Lode':
  ...
?
Yes. In Python con gli appositi operatori (==, !=, <, <=, =>, >) puoi confrontare qualunque oggetto, anche molto complesso.
Quote:
Guarda qui gli esempi.
Quote:
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:
Codice:
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.
Quote:
Originariamente inviato da kwb Guarda i messaggi
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:
Codice:
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.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 20:36   #8
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Metti un ; alla fine della print. Ovviamente dopo il for metti una print singola, in modo da andare a capo.
Codice:
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...
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Guarda qui gli esempi.
Impressive

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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?

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Esattamente.
E quindi come faccio a dirgli di matchare la stringa come parola intera?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 22:01   #9
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da kwb Guarda i messaggi
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.
Quote:
Codice:
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.
Quote:
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.
Quote:
E quindi come faccio a dirgli di matchare la stringa come parola intera?
Così:
Codice:
if line != 'sup':
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 22:52   #10
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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..

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Così:
Codice:
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'.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2012, 23:23   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Ho capito adesso. Ecco qui:
Codice:
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.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2012, 00:32   #12
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Eccellente!

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
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2012, 00:50   #13
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
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.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2012, 11:25   #14
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.
Hmm, diciamo che sono su Mac OS dove python è installato di default...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2012, 12:18   #15
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Da me si chiama python272.chm. Controlla la tua versione di Python, e vedi se c'è un file "equivalente".
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2013, 10:54   #16
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
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.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2013, 11:00   #17
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
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).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2013, 11:05   #18
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Quote:
If base is specified and x is not a string, TypeError is raised.
Non so da dove esce...

Se faccio: help(int()) mi da:
Quote:
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 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2013, 11:09   #19
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Sulla doc della 2.6 è come dice cdmauro, dalla 2.7 in poi invece è stata cambiata.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2013, 11:21   #20
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
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.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Tory Bruno ha lasciato la società...
L'immagine di Natale del telescopio spaz...
STMicroelectronics e SpaceX proseguono l...
Numeri da record, Xiaomi distribuisce ol...
BitLocker accelerato via hardware: Micro...
Blue Origin prosegue lo sviluppo dei lan...
Moore Threads: nuove GPU 15 volte pi&ugr...
Steam diventa esclusivamente 64-bit: Val...
La Corte Suprema restituisce a Elon Musk...
X lancia Creator Studio su mobile: nuovi...
Dieci anni fa SpaceX fece atterrare per ...
POCO M8 e M8 Pro arriveranno nel 2026: e...
Caos Formula 1: il motore Mercedes &egra...
Tariffe nazionali per le chiamate e gli ...
Tassa chilometrica non solo per elettric...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v