Edex Pubblicato: 13 Gennaio 2011 Segnalazione Share Pubblicato: 13 Gennaio 2011 Salve a tutti,sono un neoprogrammatore e stavo scrivendo il mio primo programma. Finora ho incontrato qualche problema ma sono riuscito a risolverlo, ora però ho un ostacolo che non riesco a sormontare: io ho creato un programma che lavoro su di una lista. Io do al programma alcune parole e lui le cerca fina a quando non le trova e stampa a video la parte di lista interessata dalla mia ricerca. Per fare ciò ho posto ogni parola come elemento, poi mi faccio dare dall'utente la parole iniziali e finali e inizio la ricerca. Questo è il codice delle istruzioni condizionali per la ricerca: while a != 0: #Condizioni parole iniziali if par1 in versioni: item_par1 = versioni.index(par1) item_par2 = item_par1 + 1 if par2 == versioni[item_par2]: item_par3 = item_par2 + 1 if par3 == versioni[item_par3]: item_par4 = item_par3 + 1 if par4 == versioni[item_par4]: item_par5 = item_par4 + 1 if par5 == versioni[item_par5]: item_par6 = item_par5 + 1 if par6 == versioni[item_par6]: if par_fin1 in versioni: item_par_fin1 = versioni.index(par_fin1) #Condizione grandezza if item_par_fin1 > item_par1: item_par_fin2 = item_par_fin1 + 1 #Condizioni parole finali if par_fin2 == versioni[item_par_fin2]: item_par_fin3 = item_par_fin2 + 1 if par_fin3 == versioni[item_par_fin3]: item_par_fin4 = item_par_fin3 + 1 if par_fin4 == versioni[item_par_fin4]: item_par_fin5 = item_par_fin4 + 1 if par_fin5 == versioni[item_par_fin5]: Stampa_versione() a = a - 1 else: Cancella_par_fin1_4() Ricerca() else: Cancella_par_fin1_3() Ricerca() else: Cancella_par_fin1_2() Ricerca() else: Cancella_par_fin1() Ricerca() #Condizione grandezza else: Cancella_par_fin1_gr() Ricerca() else: print "Versione non trovate" a = a - 1 #Condizioni parole iniziali else: Cancella_par1_5() Ricerca() else: Cancella_par1_4() Ricerca() else: Cancella_par1_3() Ricerca() else: Cancella_par1_2() Ricerca() else: Cancella_par1() Ricerca() else: print "Versione non trovata" a = a - 1 Il mio problema è il seguente: se tutte le condizioni sono vere va tutto bene, se sono false nella prima parte (nelle parole iniziali) va tutto ok. Se invece una parola è sbagliata nelle parole finali(nella seconda parte) il programma mi da questo errore: Traceback (most recent call last): File "/home/edex/Scaricati/debug iniziale.py", line 263, in <module> Ricerca() File "/home/edex/Scaricati/debug iniziale.py", line 63, in Ricerca Ricerca() File "/home/edex/Scaricati/debug iniziale.py", line 66, in Ricerca Ricerca() File "/home/edex/Scaricati/debug iniziale.py", line 66, in Ricerca Ricerca() File "/home/edex/Scaricati/debug iniziale.py", line 42, in Ricerca Cancella_par_fin1() File "/home/edex/Scaricati/debug iniziale.py", line 142, in Cancella_par_fin1 if par2 != versioni[item_par_fin2]: NameError: global name 'item_par_fin2' is not defined Ma io la variabile globale item_par_fin2 non l'ho definita qui? if item_par_fin1 > item_par1: item_par_fin2 = item_par_fin1 + 1 Avevo avuto lo stesso problema con la prima parte(le parole iniziali) ma ho risolto scrivendo questa funzione: def Cancella_par1(): b = 1 item_par1 = versioni.index(par1) item_par2 = versioni.index(par2) while b != 0: if item_par2 < item_par1: del versioni[item_par2] item_par2 = versioni.index(par2) else: del versioni[item_par1] b = 0 La funzione Cancella_par_fin1 è: def Cancella_par_fin1(): if par2 != versioni[item_par_fin2]: del versioni[item_par_fin1] . Io avevo provato anche a modificare questa funzione scrivendone una simile a quella per le parole iniziali: def Cancella_par_fin1_2(): h = 0 item_par_fin1 = versioni.index(par_fin1) item_par_fin3 = versioni.index(par_fin3) while h != 0: if item_par_fin3 < item_par_fin1: del versioni[item_par_fin3] item_par_fin3 = versioni.index(par_fin3) else: del versioni[item_par_fin1] h = 0 Però quando veniva eseguita il programma andava in loop e restituiva questo errore: RuntimeError: maximum recursion depth exceeded in cmp Grazie per il tempo che mi avete dedicato e spero in un vostro aiuto Link to comment Condividi su altri siti More sharing options...
memoryn70 Pubblicato: 14 Gennaio 2011 Segnalazione Share Pubblicato: 14 Gennaio 2011 (modificato) Beh ora non ho molto tempo per capire la logica del tuo programma ma: item_par_fin2 se lo definisci in un if e però non ci entra NON è definito!! Ti conviene definirlo prima... Comunque dovresti in primis riordinare il codice un pochettino. Quel runtime error non l'ho mai visto ma credo sia legato al numero di istruzioni incluse nell'if o il ciclo?! Credo, eh Dovresti leggere la documentazione EDIT: per "scorrere" un array ti conviene fare for par in <nome array>: #par assumerà ogni ciclo un elemento della lista, partendo dal primo Se vuoi fare con indici for i in xrange(0, len(array)-1): #i sarà prima 0, poi 1 ecc par = array Modificato 14 Gennaio 2011 da memoryn70 Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 15 Gennaio 2011 Autore Segnalazione Share Pubblicato: 15 Gennaio 2011 Grazie memoryn ho smanettato un pò qua e la e ho risolto. Ora però ho un altro problema: ho trasferito lo script sul cellulare, lo eseguo ee va a buon fine, però mi salta l'ultima parte di comandi. print Stampa_versione() print "---------------------------" Prova() a = a - 1 esegue solo fino a Stampa_versione() (codice) def Stampa_versione(): global num global num_fin b = 1 item_par1 = item[0] + num item_par_fin7 = item[13] + num_fin while b != 0: if item_par1 < item_par_fin7: print versioni3[item_par1], item_par1 = item_par1 + 1 elif item_par1 == item_par_fin7: print versioni3[item_par1] return poi smette di funzionare e non esegue nè il successivo print, ne la funzione Prova() (codice) def Prova(): global num item_par1 = item[0] + num if 0 <= item_par1 <= 15: print prova[0] else: print prova[1] Hai idea del perchè? Lo fa solo sul cellulare, sul pc funziona bene ed esegue fino alla fine. Link to comment Condividi su altri siti More sharing options...
memoryn70 Pubblicato: 15 Gennaio 2011 Segnalazione Share Pubblicato: 15 Gennaio 2011 Grazie memoryn ho smanettato un pò qua e la e ho risolto. Ora però ho un altro problema: ho trasferito lo script sul cellulare, lo eseguo ee va a buon fine, però mi salta l'ultima parte di comandi. print Stampa_versione() print "---------------------------" Prova() a = a - 1 esegue solo fino a Stampa_versione() (codice) def Stampa_versione(): global num global num_fin b = 1 item_par1 = item[0] + num item_par_fin7 = item[13] + num_fin while b != 0: if item_par1 < item_par_fin7: print versioni3[item_par1], item_par1 = item_par1 + 1 elif item_par1 == item_par_fin7: print versioni3[item_par1] return poi smette di funzionare e non esegue nè il successivo print, ne la funzione Prova() (codice) def Prova(): global num item_par1 = item[0] + num if 0 <= item_par1 <= 15: print prova[0] else: print prova[1] Hai idea del perchè? Lo fa solo sul cellulare, sul pc funziona bene ed esegue fino alla fine. uhm probabilmente non termina il while ma non capisco perché sull'emu non lo fa...Ma poi l'applicazione è come boccata? O riesci ad aprire il menu della shell? Link to comment Condividi su altri siti More sharing options...
lento Pubblicato: 15 Gennaio 2011 Segnalazione Share Pubblicato: 15 Gennaio 2011 (modificato) Gentilmente non potresti essere un pò più chiaro generalizzando il problema, di modo che altri possano trarre vantaggio dalla tua domanda. Esempio: Ho una frase testuale ed all'interno di essa devo estrarre parole che corrispondono alle parole fonitemi da un ipotetico utente. farse="Qui comincia la disavventura del signor Buonaventura" se l'utente mi da le parole "Qui" e "signor" devo eliminarle dalla frase ottenendo frase="comincia la disavventura del Buonaventura" Altro esempio: Ho una lista di parole tipo: lista=["Qui","comincia","la","disavventura","del","signor","Buonaventura"] Devo togliere dalla lista due parole che mi passa l'utente del programma. Oppure ricevo la lettera iniziale e finale della parola e devo estrarre tutte le parole che corrispondono. Esempio mi da la lettera iniziale "c" e la lettera finale "a" devo poter estrearre perciò la parola "comincia" Non è necessario sapere l'utilizzo che ne vuoi fare.(Giusto per la privacy). Modificato 30 Gennaio 2011 da lento Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 15 Gennaio 2011 Autore Segnalazione Share Pubblicato: 15 Gennaio 2011 @memoryn: No il programma continua a funzionare benissimo. Se una volta concluso clicco di nuovo options/run script parte tutto. Solo che non conclude il ciclo e non capisco perchè sul pc lo concluda e invece sul cell no. @lento: Ok. Comunque questo programma in pratica si fa dare un tot di parole iniziali e finali, le ricerca all'interno della lista (in ordine così come sono fornite) e stampa a video gli elementi della lista a partire dalla prima parola fino all'ultima (parole inserite ovviamente). Poi fa una corrispondenza tra l'indice della prima parola inserita dall'utente e delle condizioni che io specifico in una funzione e stampa a video un elemento di un'altra lista. Va bene così?? Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 16 Gennaio 2011 Autore Segnalazione Share Pubblicato: 16 Gennaio 2011 (modificato) Ho provato anche implementare i print della funzione prova nella funzione Stampa_versione, in maniera che fosse una unica: def Stampa_versione(): global num global num_fin b = 1 item_par1 = item[0] + num item_par_fin7 = item[13] + num_fin while b != 0: if item_par1 < item_par_fin7: print versioni3[item_par1], item_par1 = item_par1 + 1 elif item_par1 == item_par_fin7: print versioni3[item_par1] b = b - 1 print "-------------------" c = 1 while c != 0: if 0 <= item_par1 <= 15: print prova[0] c = 0 else: print prova[1] c = 0 sul pc continua ad andare ma sul cell no, dopo aver stampato la prima parte aggiunge uno spazio e si ferma. Però la shell continua a funzionare. EDIT: ho scoperto il problema, mi si fermava ( anche nello stampare la prima parte) quando incontrava il carattere è, sostituendolo funziona però a me servirebbe, se possibile, anche di inserure caratteri accentati. Come posso fare? Che codifica mi serve? Modificato 16 Gennaio 2011 da Edex Link to comment Condividi su altri siti More sharing options...
lento Pubblicato: 18 Gennaio 2011 Segnalazione Share Pubblicato: 18 Gennaio 2011 sul pc continua ad andare ma sul cell no, dopo aver stampato la prima parte aggiunge uno spazio e si ferma. Però la shell continua a funzionare. EDIT: ho scoperto il problema, mi si fermava ( anche nello stampare la prima parte) quando incontrava il carattere è, sostituendolo funziona però a me servirebbe, se possibile, anche di inserure caratteri accentati. Come posso fare? Che codifica mi serve? Grazie della spiegazione sopra riportata. Se utilizzi la versione Python 2.0 aggiungi questo commento ad inizio programma. # -*- coding: utf-8 -*- Ne ho dato una sintesi di uso nel post poetografo PS. con la versione 3 di Python il tormento delle codifiche dovrebbe finire ma per ora....bisogna lavorare di conversioni con u" " per le stringhe fp=codecs.open("E:\\testo.txt","w",'utf_8') per i files ecc... @memoryn70 potrebbe fare un bel How-to! per aiutarci.... Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 23 Gennaio 2011 Autore Segnalazione Share Pubblicato: 23 Gennaio 2011 Eccomi di nuovo..xD Il programma sul pc gira che è una meraviglia, è ritornato il problema del cellulare che non completa il ciclo. La funzione che ho scritto: def Stampa_versione(): global num global num_fin b = 1 item_par1 = item[0] + num item_par_fin7 = item[13] + num_fin while b != 0: if item_par1 < item_par_fin7: print versioni3[item_par1], item_par1 = item_par1 + 1 elif item_par1 == item_par_fin7: print versioni3[item_par1] print "-------------------" item_par1 = item[0] + num c = 1 while c != 0: if 0 <= item_par1 <= 249: print traduzioni[0] c = 0 elif 250 <= item_par1 <= 337: print traduzioni[1] print traduzioni[2] c = 0 elif 338<= item_par1 <= 593: print traduzioni[3] c = 0 b = 0 che ho scritto anche i un altro modo: def Stampa_versione(): global num global num_fin b = 1 item_par1 = item[0] + num item_par_fin7 = item[13] + num_fin while b != 0: if item_par1 < item_par_fin7: print versioni3[item_par1], item_par1 = item_par1 + 1 elif item_par1 == item_par_fin7: print versioni3[item_par1] print "-------------------" b = 0 item_par1 = item[0] + num if item_par1 in range(0,250): print traduzioni[0] if item_par1 in range(250,338): print traduzioni[1] print traduzioni[2] if item_par1 in range(338,593): print traduzioni[3] sul pc viene eseguita completamente, sul cellulare invece viene eseguita tutta solo se la variabile item_par1 è contenuta tra 250 e 338. Pensavo fosse un problema di conteggio ma ho fatto stampare la variabile ed è giusta, poi credevo fosse un problema di caratteri(anche se ho inserito la stringa di codifica utf-8) e ho cambiato un elemento della lista traduzioni con "ciao" ma non stampa neanche quello. Non ho più idee, voi? Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 28 Gennaio 2011 Autore Segnalazione Share Pubblicato: 28 Gennaio 2011 Sempre io...xD Mi è sorto un altro problema e stavolta non riesco proprio a capire perchè faccia così: il mio programma ricerca (come ho già detto) le corrispondenze delle parole in una lista, ora se l' indice della parola finale è minore dell'indice della parola iniziale io faccio cancellare al programma la parola finale e lancio nuovamente la ricerca, e fin qui va tutto bene. Il problema è che quando il programma poi ricerca, nella stessa lista, la parola finale non mi prende la prima come dovrebbe fare in automatico. Vi faccio vedere: non 331 dubito 332 fore 333 plerosque 334 attice 335 qui 336 hoc 337 in 91 non 331 dubito 332 fore 333 plerosque 334 attice 335 qui 336 hoc 337 in 331 non 331 dubito 332 fore 333 plerosque 334 attice 335 qui 336 hoc 337 in 332 eo 333 non 331 dubito 332 fore 333 plerosque 334 attice 335 qui 336 hoc 337 in 196 non 331 dubito 332 fore 333 plerosque 334 attice 335 qui 336 hoc 337 Mi sono fatto stampare a video le parole trovate e i loro indici, le parole "non dubito fore plerosque attice qui hoc" sono le parole iniziali, "in" è la prima parola finale. Come potete notare la prima volta che ricerca in lo trova con indice 91 (che è minore di 331) e quindi cancella in, poi la seconda volta trova in con indice 331 e non è possibile perchè ce ne sono altri di in prima di quell'indice. Lo posso dire sia perchè ho controllato a vista, sia perchè poi il programma trova in con indice 196 (vi ho mostrato solo una parte di quello che il programma mi ha stampato. Ho pensato che fosse un problema della lista ma ho fatto stampare a video anche quello ed è tutto ok, il programma salta prorpio alcuni "in", perchè?Avete idee? Io è da stamattina che ci provo ma niente...-.-' Link to comment Condividi su altri siti More sharing options...
memoryn70 Pubblicato: 7 Febbraio 2011 Segnalazione Share Pubblicato: 7 Febbraio 2011 Ti dirò francamente che ora proprio non ho tempo di controllare tutto Ti do alcuni consigli generali! Comunque se hai tenuto la stessa struttura dei programmi precenti ti consiglio vivamente di riordinare il tutto. Non ti dimenticare che un indice negativo vuol dire leggere al contrario la lista (-1 è l'ultimo elemento per dire) Due parole uguali in una lista e index ti darà solo la prima Ah ora che mi viene in mente: mi raccomando se copi una lista devi fare cosi: copia = originale [:] e non solo copia = originale !!! Altrimenti appena modifichi copia, automaticamente cambia anche originale. Meglio: una lista è identificata da un indirizzo (come ogni oggetto del resto) e in python vengono gestite appunto cosi (ma anche c++). Quindi anche negli argomenti di funzioni: def a(lista) lista = [] f = [123123,1231,123,123] a(f) f -> [] OT: ormai 2000 messaggi Link to comment Condividi su altri siti More sharing options...
Edex Pubblicato: 7 Febbraio 2011 Autore Segnalazione Share Pubblicato: 7 Febbraio 2011 (modificato) sisi ok quello lo so, ci sono Il mio problema, il che mi sembra impossibile, è che index non restituisce il primo valore che trovato nella lista uguale a quello che gli dico di cercare, ne restituisce uno con indice maggiore e poi torna indietro, non capisco perchè... Comunque come consigli di riordinare il codice? E' il mio primo programma e non sono molto esperto... xD Modificato 7 Febbraio 2011 da Edex Link to comment Condividi su altri siti More sharing options...
memoryn70 Pubblicato: 9 Febbraio 2011 Segnalazione Share Pubblicato: 9 Febbraio 2011 sisi ok quello lo so, ci sono Il mio problema, il che mi sembra impossibile, è che index non restituisce il primo valore che trovato nella lista uguale a quello che gli dico di cercare, ne restituisce uno con indice maggiore e poi torna indietro, non capisco perchè... Comunque come consigli di riordinare il codice? E' il mio primo programma e non sono molto esperto... xD Beh dividi alcune cose in funzioni specifiche che ti crei tu per esempio... Ah una piccolo consiglio: usa xrange che è più ottimizzato perché non crea in memoria un intero array di interi Poi appunto ricordati che se hai n elementi di una lista e vuoi spolverarli: for i in xrange(0, n-1) ma credo lo sapessi già hehe Mi risulta un po difficile aiutarti perché non ho molto ben capito le tue intenzioni (forse non mi sono messo su troppo ) Occhio anche alle variabili globali... Link to comment Condividi su altri siti More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Accedi Ora