2010-08-26 18 views
3

Niveau: Débutantà propos de l'expression de retour

le code suivant affichera 'Faux'

def function(x): 
    if len(x) == 5: return True 
    else: return x[0] == x[-1] 

print function('annb') 

pourquoi la ligne "else: return x [0] == x [-1]" print Faux? Je comprends ce qui se passe mais j'ai du mal à le mettre en anglais ... comment décrire ce comportement?

Est-ce une "technique" couramment/souvent utilisée?

Je suis d'abord tombé sur cette syntaxe particulière en essayant de résoudre un exercice de palindrome récursif. Il semble que la seule façon de rendre le travail de récursion est d'utiliser cette approche raccourci:

def isPalindrome(s): 
if len(s) <= 1: return True 
else: return s[0] == s[-1] and isPalindrome(s[1:-1]) 

print isPalindrome('anna') 

grâce Baba

Répondre

6

Désolé, je ne suis pas tout à fait sûr de ce que vous voulez dire, mais ici pense de cette façon :

return (x[0] == x[-1]) 

Si vous considérez que ce qui est dans la parenthèse, vous vous rendez compte que, que « déclaration » équivaut à une valeur booléenne, non? Voilà pourquoi vous pouvez aussi le faire:

if x[0] == x[-1] 

Donc, en gros, ce qui est de retour ici est un booléen qui dit si oui ou non x [0] est égal à [-1].

On pourrait être plus explicite et d'élargir cette déclaration à quelque chose comme ceci:

if x[0] == x[-1]: # if this is true 
    return True # then return true 
else: 
    return False 

Mais comme vous pouvez le voir, à la fois la condition et ce que vous souhaitez revenir sont la même valeur, donc on fait juste il sténographie comme vous avez vu:

return x[0] == x[-1] 

Désolé si j'ai mal compris votre question.

EDIT: Si vous avez fait référence à l'indice négatif (x[-1]), en Python, les indices négatifs essentiellement « enroulent autour », alors où que x[0] serait le premier élément de « gauche à droite » pour ainsi dire , x[-1] boucles autour de telle sorte que c'est le premier élément de «droite à gauche».

+0

Salut Blaenk, votre réponse me l'indique clairement. En tant que débutant, je dois donner un sens aux raccourcis, merci pour votre aide! – raoulbia

1

Je pense que la chose que vous êtes confus au sujet est le comportement de x[-1]. Les indices de tableau négatif sont relatifs à la fin du tableau, donc dans votre exemple, x[-1] == 'b'. Ce qui n'est évidemment pas égal à x[0] == 'a', donc la fonction retourne False.

0

Dans l'ensemble la fonction de votre fonction est: si la longueur de x est égal à 5, retour Vrai autre si le dernier caractère de la chaîne est égale à premier retour Vrai, else return False

Ce genre de condition d'autre condition ... else return False est mieux exprimé avec ou statement qui retourne False seulement si toutes les conditions sont fausses et renvoie la valeur du premier élément non-False. L'autre choix est n'importe quelle fonction qui fait fondamentalement la même chose avec n'importe quelle séquence.Ici essai de ces alternatives pour toutes les branches d'origine instruction if:

def function(x): 
    if len(x) == 5: return True 
    else: return x[0] == x[-1] 

def funcor(x): 
    return (len(x)==5) or (x[0] == x[-1]) 

def funcany(x): 
    return any((len(x)==5, x[0] == x[-1])) 

def funcverbal(sequence): 
    ## sequence[0] is the first element of zero based indexed sequence 
    ## endswith is string specific function so sequence must be string 
    ## if it's length is not 5 
    return len(sequence)==5 or sequence.endswith(sequence[0]) 

## function is normal data type in Python, so we can pass it in as variable 
def test(func): 
    print('Testing %s function' % func) 
    for value in ('12345','annb','ansa','23424242',('1','2','1'), 123, '131'): 
     try: 
      print ("%r -> %r" % (value,func(value))) 
     except: 
      print ("Failed to call function with " + repr(value)) 

    print(10 * '-'+'Finished testing '+str(func) + 10 * '-') 

for thisfunction in (function, funcor, funcany, funcverbal): 
    test(thisfunction) 

(fonction hightlighted comme mot réservé en bleu, mais il est erreur dans la routine de mise en évidence sur ce site)

Dans le cas de la fonction isPalindrome , la condition de longueur n'est pas arbitraire, mais il est nécessaire de reconnaître les cas primitifs pour arrêter la récursion, dans le cas de 'anna' la fonction palindrome fait:

voir si la longueur de 'anna' est inférieure à 2 (1 ou 0), non ils ne sont pas comparer 'a' avec 'a', continuer car ils sont identiques abandonnent la première et la dernière lettre et un appel par rapport isPalindrome avec « nn »

voir si la longueur de « nn » est inférieur à 2 (1 ou 0), non, ils ne sont pas comparer 'n « , n ', continuer comme ils sont identiques abandonner la première et la dernière lettre comparée et appeler isPalindrome avec' '

voir si la longueur de' 'est inférieure à 2 (1 ou 0), oui. Renvoie True lorsque nous avons trouvé le palindrome.

Voici une autre fonction shorte du test palindrome basée sur le fait que le palindrome inversé est le même que le palindrome.

def isPalindrome(s): 
    return s==s[::-1]