0
votes

Pourquoi mon implémentation spécifique ne fonctionne-t-elle pas pour renvoyer la lettre du milieu d'une fonction?

Le but est de renvoyer la lettre du milieu d'une chaîne, ou " " si la chaîne est paire. Je ne vois pas pourquoi mon code ne fonctionne pas. Toute sorte de clarification serait formidable, merci!

def mid(ml):

    x=len(ml)
    y=x+1
    z=y/2
    if isinstance(z,int)==True:
        return (ml[z-1])
    else:
        return (" ")
        
print (mid("abc"))


0 commentaires

3 Réponses :


4
votes

/ ne retourne pas un int ; même si le nombre qu'il renvoie peut être représenté comme un:

# Read as: "If z is odd", or, "If division of z by 2 has a remainder of 1"
if z % 2 == 1:  
    return ml[z-1]
else:
    return " "

Il serait préférable de vérifier explicitement si le nombre est pair ou non:

>>> 4 / 2
2.0  # A float


1 commentaires

Je ne savais pas que "/" renvoie un flotteur! Je l'ai Merci!



-2
votes

En suivant la réponse de @Carcigenicate ci-dessus, vous pouvez essayer le code suivant:

def mid(ml):
    x=len(ml)
    y=x+1
    z=y/2
    return (ml[int(z-1)])
        
print (mid("abc"))


2 commentaires

Cela échoue pour mid("abcd") où il devrait renvoyer " "


Cela ne correspond pas aux exigences



1
votes

Ce problème se produit, car l'opérateur / renvoie un float . Bien que la façon la plus intelligente de résoudre ce problème soit l'utilisation de l' opérateur modulo , si vous voulez vous en tenir à votre code, vous pouvez utiliser la méthode is_integer() de float comme ceci:

def mid(ml):
    return ml[len(ml)//2] if len(ml) % 2 else ""

Meilleure façon de le faire:

def mid(ml):

    x=len(ml)
    y=x+1
    z=y/2
    if z.is_integer():
        return (ml[int(z)-1])
    else:
        return (" ")
        
print (mid("abc"))


5 commentaires

Votre premier bloc de code déclenche une TypeError car vous utilisez un flottant comme index.


Non, c'est l'opérateur // , qui renvoie un int .


Vous n'utilisez pas // dans votre premier bloc de code.


Vous avez raison à propos du TypeError, j'étais confus car ce n'était pas à l'origine mon code. J'ai déjà corrigé le len(ml) % 2 avant que vous ne commentiez.


Ouais je ne connaissais pas vraiment l'opérateur modulo, merci pour votre aide!