Forum >> Principianti >> Le Funzioni in Python: definizione, chiamata, esecuzione, come posso andare in uno specifica punto del programma dopo vaver eseguito una funzione ?

Pagina: 1

Salve,





sono un elettronico votato alla programmazione e sono un neo iscritto a questo forum.




Ho iniziato a programmare in Python e fatto alcuni programmini che "manipolano" file di testo e poi li stampano.




Mi è chiaro tutto ciò che riguarda la Funzione cioè definizione, chiamata, esecuzione ecc.. e quindi mi è chiaro che una funzione , quando viene eseguita, memorizzi in punto del programma in modo che dopo l'esecuzione del codice ritorni a quel punto.




Invece, mi trovo a risolvere la seguente questione: ho una funzione (ricerca su file) che se trova il parametro impostato, esegue il codice ecc... ma se non trova il parametro impostato esce e chiama un'altra funzione che esegue il suo codice e NON DOVREBBE ritornare alla funzione precedente MA andare in un punto specifico del programma.




Come posso risolvere il problema ?




LR

ho una funzione (ricerca su file) che se trova il parametro impostato, esegue il codice ecc... ma se non trova il parametro impostato esce e chiama un'altra funzione che esegue il suo codice e NON DOVREBBE ritornare alla funzione precedente MA andare in un punto specifico del programma.

Come posso risolvere il problema ?

Puoi risolvere il Tuo problema strutturando adeguatamente il Tuo codice, p.e. utilizzando dei cicli decisionali, oppure inserendo in cicli while

I GOTO ed i GOSUB non mi risulta esistano in python e, comunque, sarebbero indizio di pessimo codice, riguardo alle funzioni python esse restituiscono sempre e comunque un valore reperibile nel punto di chiamata ("None" in assenza di un return valorizzato), funziona così e non si può fare altrimenti.




In ogni caso, se Ti occorrono suggerimenti, esplicita chiaramente e magari con brevi esempi di codice ciò che vorresti fare che si vede.




Ciao

Fatti non foste a viver come bruti...
Io di solito creo una variabile di controllo.

creo un controllo della variabile per saltare le righe di programma che non voglio che


vengano eseguite in una determinata condizione.




esempio:

1 variabile1 = 0 # variabile di controllo


2


3 condizione 1 ;

4 variabile1= 0

5


6


7 condizione 2;


8 variabile1= 1




9 if variabile1==0;

10 # esegui il programma regolarmente

11 - righe di programma

12 - righe di programma

13 - righe di programma

14


15 # alla fine ( if )


16 # rimetti la variavile nella condizione iniziale

17 variabile1 = 0

18 - righe di programma non saltate


19 - righe di programma non saltate


in questo modo quando soddisfo la condizione 2 salta dalla riga 9 alla 15




Spero di essere stato chiaro.. a volte sono contorto nelle spiegazioni






Salve,

ringrazio Gabbo e Nuzzopippo per le risposte e i suggerimenti.

inserisco un pezzo di codice del mio programmino che, sinteticamente, dovrebbe:

1) da input di un file report es. rep1

2) leggere le righe e trovare delle stringhe

3) modificare le suddette stringhe

4) stampare (veramente le scrive in un altro file) le suddette stringhe.

Il mio programmino funziona, soltanto che quando no trova la stringa , chiede l'impu di un altro file report, ma invece di ri-iniziare la ricerca delle stringhe, salta la ricerca delle strighe trovate in precedenza.

La mia richiesta è lecita: se da un file prendo delle stringhe, le modifico e le scrivo in un altro file, se non trovo una stringa, devo prendere un alto file e ricercare tutte le stringhe.


In qualche modo ho risolto ma inserisco una parte del codice a uso "didattico" per i principianti come me.




Una parte del codice del mio programmino è la seguente:





path = "C:\\Python\\"

def Start ():
global FileTracemark
FileTracemark = input('Inserisci il nome_file: ')

def Tr_fail():
print("Parametro Non trovato")
Start()

def Tr_read(a, x, y):

''' Funzione che legge file report (riga x riga), cerca il parametro a = stringa contenuta nella riga,
x e y posizione inizio e fine della riga '''

f = open(path + FileTracemark, "r")
riga = f.readline()

while riga != "": # ciclo di wile per stampare tutte le righe del file report
if riga.find(a) >= 0: # cerco se "riga" (a) es. contiene "ECU="
a = riga[x:y] # assegno alla variabile (a) es. ECU_SN il valore di parte della riga
#print(a) # stampo riga (a) es. 033323220000236 (15 caratteri)
return a # utilizzo la variabile (a) fuori dalla funzione
break # se la ricerca (find) è True interrompe il ciclo di wile
riga = f.readline() # leggo nuova riga
else:
f.close
Tr_fail()

f.close()

Start()

ECU_SN = Tr_read("ECU=", 4, 19)
PCBA_SN =Tr_read("PCBA=", 5, 20)
COD_PROD = Tr_read("CODICE_PROD=", 12, 25)
PCBA_HW = Tr_read("PCBA_HW=", 8, 10)
CODICE = Tr_read("CODICE_01=", 10, 16)
OMOL = Tr_read("OMOL_01=", 8, 21)
SW_1 = Tr_read("SW VERS1=", 9, 13)

from datetime import datetime
obj = datetime.now() # Estrazione della data corrente
DayToYear = obj.strftime("%j%y") # Estrazione nr. giorni da inizio anno %j e anno 2 caratteri %y
#WeekCode = obj.strftime("%W") # Estrazione nr. settimana da inizio anno

ECU_SN_COD = 'T' + DayToYear + '0' + str(ECU_SN[8:15]) + '0'
print(ECU_SN_COD)

def str_comp(var, x, y):

'''' Funzione che elabora la stringa (var) : Rimuove tutti gli 0 da sx -- Converte in esadecimale e trasforma in int --
Aggiunge tanti 0 a sx fino a quando la stringa diventa 8 caratteri -- x - y inizio e fine '''

var = str(var)
var = var[x:y].lstrip('0')
var = hex(int(var))
var = var[2:].zfill(8)
#print(var)
return var

PCBA_SN_COD = str_comp(PCBA_SN, 8, 15)

PCBA_SN_COD = PCBA_SN[6:8] + PCBA_SN[4:6] + PCBA_SN_COD + PCBA_HW + '0'
print(PCBA_SN_COD)

print(COD_PROD)
print(SW_1)



il file rep1, da dare come input è il seguente

1,0;
ECU=033323220000236
PCBA=033223200000134
CODICE_PROD=ABC12345-1000
PCBA_HW=01
CODICE_01=00AB10
OMOL_01=01-01-23 1037
SW VERS1=0103

L'output sul terminal di VSC è il seguente

PS C: "C:/Program Files/Python39/python.exe" c:/Python/Esempio.py
Inserisci il nome_file: rep1
T23623000002360
202300000086010
ABC12345-1000
0103
























Allegati


Pagina: 1



Esegui il login per scrivere una risposta.