2010-08-21 5 views
0

Pourquoi est-ce que le code ci-dessous imprime 'None' ainsi que ce que je lui dis d'écrire lorsqu'aucune correspondance n'est trouvée?Python imprime plus que je ne veux

def subStringMatchExact(target,key): 
    list=[] 
    for fsi in range (len(target)): 
     if key==target[fsi:fsi+len(key)]: 
      list=list+[fsi,] 
      #return list 
    if list!=[]: 
     return list 
    else: 
     print 'no match found' 

print subStringMatchExact("banana","x") 

Répondre

4

Parce qu'il existe un return None implicite à la fin de chaque fonction. Cela signifie que lorsque vous ne renvoyez rien, comme dans le bloc else de votre exemple, votre fonction renvoie quand même None. Ainsi, subStringMatchExact("banana","x") renvoie None et ceci est imprimé. Pensez à ce qui se passe dans la clause else ici.

9

Regardons cela.

print subStringMatchExact("banana","x") 

Quelle est la valeur retournée par subStringMatchExact ("banane", "x")? Ne regardez pas ce que fait. Regardez ce que renvoie. Pour un indice sur ce qu'une fonction renvoie, lisez les instructions return. Tous. S'il n'y a pas de valeur sur un return ou return, il renvoie None.

Que fait print avec cette valeur?

+0

Salut à tous, Tnx pour la pointe! mieux vaut d'abord bien les bases :) tnx again Baba – raoulbia

+0

Que signifie "Tnx"? –

+0

@S.Lott: Je crois que c'est court pour 'thanx' –

2

Dans la clause if, votre fonction renvoie une valeur. Dans la clause else, que retourne-t-il?

C'est pourquoi vous obtenez le résultat que vous obtenez. L'instruction print imprime la valeur de retour de la fonction, quelle que soit la branche du if. Si une fonction se termine sans retourner explicitement une valeur, elle renvoie None.

1

Chaque fois que vous ne renvoyez pas explicitement une valeur d'une fonction en Python, None est implicitement retourné.
En imprimant la valeur de retour de la fonction subStringMatchExact même si aucune correspondance n'est trouvée, vous obtenez None, car la clause else ne termine pas le flux avec une instruction return.

0

Essayez quelque chose comme ceci:

def subStringMatchExact(target,key): 
    list=[] 
    for fsi in range (len(target)): 
     if key==target[fsi:fsi+len(key)]: 
      list=list+[fsi,] 
      #return list 
    return list 

De cette façon, vous êtes toujours retourner une liste, et le code d'appel subStringMatchExact peut vous soucier de ce qu'il faut faire avec la liste vide (ie print introuvable, jeter erreur etc .)

+0

-1 Les quatre dernières lignes de votre réponse peuvent être remplacées simplement par 'return list' –

+0

Remplacé les quatre dernières lignes par" return list " – joshaidan

1

utilisation retour 'aucune correspondance trouvée' au lieu de print 'aucune correspondance trouvée'

def subStringMatchExact(target, key): 
    if key in target: 
     n_target = len(target) 
     n_key = len(key) 
     return [n for n in xrange(n_target) if key == target[n:n + n_key]] 
    else: 
     return 'no match found' 
+1

Ou même" raise SomeError ('no match found') " – viraptor

0

Vous utilisez la commande print pour imprimer tout ce qui est renvoyé par la fonction. Ainsi, dans le cas "else", vous devez retourner plutôt qu'imprimer dans la fonction.

Le code correct est donc:

def subStringMatchExact(target,key): 
    list=[] 
    for fsi in range (len(target)): 
     if key==target[fsi:fsi+len(key)]: 
      list=list+[fsi,] 
      #return list 
    if list!=[]: 
     return list 
    else: 
     return 'no match found' 

print subStringMatchExact("banana","x") 
Questions connexes