2 votes

Nested if ... else (exercice Python)

J'essaie de construire une fonction qui vérifie lequel de a, b, c est inférieur et renvoie la valeur la plus faible.

def minimal_three(a,b,c):
    if a < b:
        if a < c:
            return (a)
    elif b < a:
        if b < c:
            return (b)
    elif c < a:
        if c < b:
            return (c)
    else:
        return 'none'

Jusqu'à présent, le code fonctionne bien jusqu'à ce qu'il arrive au contrôle 'c', puis il ne renvoie rien, les instructions if else imbriquées sont déjà très déroutantes pour moi.

3voto

danche Points 1225

Vous ne devriez pas utiliser if-else car les 3 conditions ne sont pas exclusives.

Par exemple, [3, 4, 1] devrait retourner dans la 3ème condition mais convient aussi dans la 1ère condition, donc il ne retourne rien.

Si vous ne voulez pas changer beaucoup votre code. Vous pouvez utiliser :

def minimal_three(a,b,c):
    if a < b:
        if a < c:
            return (a)
    if b < a:
        if b < c:
            return (b)
    if c < a:
        if c < b:
            return (c)
    return 'none'

Pour plus de simplicité, vous pouvez essayer :

def minimal_three(a,b,c):
    return min(a, b, c)

3voto

hamster on wheels Points 1012

Pourquoi ce code ne fonctionne pas :

def minimal_three(a,b,c):
    if a < b:
        if a < c:
            return (a)
        else:
            # what if a >= c and a < b ?
            return "i returned nothing"
    elif b < a:
        if b < c:
            return (b)
        else:
            # what if b >= c and a > b ?
            return "i returned nothing"
    elif c < a:
        if c < b:
            return (c)
        else:
            # what if b <= c and a < c ?
            return "i returned nothing"
    else:
        return 'none'

Alternatif :

def min_of_two(a, b):
    if a > b:
        return b
    return a

def min_of_three(a, b, c):
    min_ab = min_of_two(a, b)
    min_abc = min_of_two(min_ab, c)
    return min_abc

def min_of_three_v2(a, b, c):
    min_ab = a
    if a > b:
        min_ab = b
    min_abc = min_ab
    if min_ab > c:
        min_abc = c
    return min_abc

def min_of_three_v3(a, b, c):
    min_abc = a
    if min_abc > b:
        min_abc = b
    if min_abc > c:
        min_abc = c
    return min_abc

si vous voulez vraiment utiliser des if/else imbriqués (ce code est si long) :

# if-elif-else is ok.
# nested if is hard to read
# if-elif-elif-elif-elif...-else is hard to read.
# hard to read == easy to have bugs, which is bad.

def min_abc_slower(a, b, c):
    if a > b:
        # a > b. This means min(a, b) == b
        if b > c:
            # b > c. This means min(c, min(a, b)) == c
            return c
        else:
            # b > c is False. This means b <= c.
            # So, min(c, min(a, b)) == b
            return b
    else:
        # a > b is False. This means a <= b.
        # So, min(a, b) = a
        if a > c:
            # a > c. This means min(c, min(a, b)) == c
            return c
        else:
            # a > c is False. This means a <= c
            # So, min(c, min(a, b)) == a
            return a

1voto

Rahul Points 69

Utilisez le pouvoir de if...elif...else plutôt que if...if...if ou if...else...if...else. La façon dont vous avez écrit votre code, déprécie le pouvoir de elif . La méthode correcte devrait être la suivante :

def minimal_three(a,b,c):
if a < b and a < c:
        return (a)
elif b < c:
        return (b)
else
        return (c)

Ce code renverra toujours le min peu importe les chiffres que vous donnez.

Explication :

Dans votre code, la ligne if a < b vous indique déjà la comparaison entre a et b qui est la plus grande. Donc, en vérifiant à nouveau cette condition dans le deuxième if if b < a est inutile. Si a n'est pas inférieur à b, alors il est manifestement supérieur à b ou égal à b. Vous devez donc vérifier si b est inférieur à c pour prouver que b est le plus petit ou même a ou b à la fois, mais la valeur renvoyée est toujours minimale. J'espère que vous avez compris.

Je ne comprends pas non plus pourquoi vous voulez renvoyer None. Si vous fournissez trois nombres à une fonction pour trouver le nombre minimum, elle devrait toujours et toujours retourner un nombre. Dites-moi un cas où vous pouvez attendre un None.

-1voto

krishnair1123 Points 43

Il est facile de le faire en utilisant min fonction intégrée :

def min_value(a,b,c):
    return (min(a,min(b,c)))

Le nombre d'étapes dans votre code peut également être réduit avec quelques modifications.

-2voto

Milad Points 293

Ça marche - Trouver deux plus grands en trois int :

def Biggest(a, b, c):
    if a >= b >= c:
        print a, b, 'are the biggest two'
    elif b >= c >= a:
        print b, c, 'are the biggest two'
    else:
        print c, a, 'are the biggest two'

Trouvez le plus grand dans trois nombres entiers :

def Biggest(a, y, z):
    Max = a
    if y > Max:
        Max = y    
    if z > Max:
        Max = z
        if y > z:
            Max = y
    return Max

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X