Optimisation

Benjosss -  
NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis débutant en python en je voudrais savoir comment réduire toutes ces lignes (si possible)..

Merci :)


price = 0

if (engine_displacement <= 50):
price =+ 5

if (engine_displacement > 50) and (engine_displacement <= 125):
price =+ 6

if (engine_displacement > 125) and (engine_displacement <= 250):
price =+ 7

if (engine_displacement > 250) and (engine_displacement <= 300):
price =+ 8

if (engine_displacement > 300) and (engine_displacement <= 450):
price =+ 9

if (engine_displacement > 450) and (engine_displacement <= 500):
price =+ 10

if (engine_displacement > 500) and (engine_displacement <= 690):
price =+ 11

if (engine_displacement > 690) and (engine_displacement <= 700):
price =+ 12

if (engine_displacement > 700) and (engine_displacement <= 800):
price =+ 13

if (engine_displacement > 800) and (engine_displacement <= 900):
price =+ 14

if (engine_displacement > 900) and (engine_displacement <= 1000):
price =+ 16

if (engine_displacement > 1000) and (engine_displacement <= 10000):
price =+ 18

print(price)

1 réponse

  1. vortex
     
    Bonsoir,

    Comme toujours avec ce genre de chose, conteneur comme list ou tuple combiné à une simple boucle.

    Dans ton code, tu aurais déjà dû utiliser des elif, et également gérer le cas où ta valeur est hors limite.

    Ce qui pourrait donner par exemple :

    def get_price(v, min_price=0):
        prices = ((50, 5), (125, 6), (250, 7), (300, 8), (450, 9), (500, 10),
        (690, 11), (700, 12), (800, 13), (900, 14), (1_000, 16), (10_000, 16),)
        # Parcours du tuple de la fin vers le début
        for i in range(len(prices)-1, -1, -1):
            # Si 1er élément du tuple, on prend la valeur de min_price
            p_min = prices[i-1][0] if i > 0 else min_price
            # Oui, on peut faire ça en python =D
            if p_min < v <= prices[i][0]:
                return prices[i][1]
        # On lance une erreur si valeur hors plages
        error = f'Invalid value, got {v}, min is {min_price}, max is {prices[-1][0]}'
        raise ValueError(error)
    
    # On teste un peu cette jolie fonction
    for engine_displacement in (100_564, 564, 125, -56):
        print(engine_displacement, end=': ')
        try:
            print(get_price(engine_displacement))
        except ValueError as er:
            print(er)


    Bon, c'est sans doute un peu compliqué si tu es totalement débutant, mais pas tant que ça.
    0
    1. Benjosss
       
      Super merci à toi sa m’aideras surement : )
      0
    2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      Vu que tu fais un return quand l'occurente est bonne, pas besoin de faire un double check
       if v <= prices[i][0]:

      est suffisant, il faut juste que la liste soir triée.
      0