Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Ritornare stringa tramite sottostringa

r
rosario.salerno (3010 points)
15 30 44
in Programmare in Python by (3.0k points)
closed by
Salve a tutti, devo svolgere il seguente esercizio :  
firstline(t, s) ritorna la prima linea della stringa t che contiene la stringa s, se s non occorre in t ritorna None. Esempio
t = u'''Quant’è bella giovinezza che si fugge tuttavia! Chi vuol esser lieto, sia: del doman non c’è certezza.'''
firstline(t, 'non')  ritorna  u'del doman non c’è certezza.'

Ho scritto il seguente codice :
def firstline(t,s):
     ...:     t = t.splitlines()
     ...:     for x in t:
     ...:        if s in x:
     ...:         return x
     ...:        else:
     ...:         return None
     ...:
     ...:

purtroppo però funziona solo con la prima riga. Se faccio firstline(frase,'bella') mi ritorna "quanto è bella giovinezza", ma se faccio firstline(frase,'non') mi ritorna None nonostante sia contenuto nella quarta riga.

frase = ''' Quant'è bella giovinezza
     ...: che si fugge tuttavia!
     ...: Chi vuol esser lieto, sia:
     ...: del doman non c'è certezza'''
427 views
closed with the note: answered

1 Answer

Luca T. (5410 points)
3 20 38
by (5.4k points)
Ti ritorna none perché il tuo for esegue il controllo sulla prima linea, poi non trovando il "non" nella prima linea ritorna none. Per come hai scritto il codice, le altre linee non verranno mai controllate.
Luca T. (5410 points)
3 20 38
by (5.4k points)
edited by
Return ti fa uscire immediatamente dal for ed è anche un modo un po' brusco per uscirne. Ti consiglierei di utilizzare un while a cui passi magari una variabile che incrementi ad ogni ciclo e controlli che sia minore del numero di righe e di utilizzare sempre "s in x" per controllare se la stringa è presente nella linea. Dopo, fuori dal ciclo, esegui il controllo nello stesso modo in cui hai fatto nel for. Così ci sono due casi:
    - o esci dal while perché la variabile è diventata maggiore del numero di righe, allora la stringa non è presente nella
      linea;
    - o esci dal while perché la stringa è presente nella linea
r
rosario.salerno (3010 points)
15 30 44
by (3.0k points)
Purtroppo il while non l'ho ancora studiato seguendo le lezioni, quindi dovrebbe essere risolvibile anche senza,  c'è un modo per risolvere senza utilizzarlo?  Da quello che ho capito il return controlla solo la prima stringa che si è venuta a creare, se non trova la sottostringa torna None.
Luca T. (5410 points)
3 20 38
by (5.4k points)
Il problema è che il return interrompe la funzione che hai creato e anche il for di conseguenza e ritorna la x o none a seconda del caso. Una cosa molto semplice che potresti fare è togliere il caso else e quindi lasciare semplicemente l'if con return x. Fuori dal for poi metti return none. Nel caso in cui la stringa è presente nella linea la funzione ritornerà la linea, in caso non trovasse la stringa in nessuna delle linee invece uscirà dal for e ritornerà none.
r
rosario.salerno (3010 points)
15 30 44
by (3.0k points)
Grazie mille, così funziona!