Jump to content
Nokioteca Forum

Python


Edex
 Share

Recommended Posts

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

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 da memoryn70
Link to comment
Condividi su altri siti

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

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

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 da lento
Link to comment
Condividi su altri siti

@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

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 da Edex
Link to comment
Condividi su altri siti

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

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

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

  • 2 settimane dopo...

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 :spacca:

Link to comment
Condividi su altri siti

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 da Edex
Link to comment
Condividi su altri siti

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

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy