[Python] Argument d'une fonction, s'affranchir des ""

Répondre
Partager Rechercher
Salut,

Question de noob en Python

J'enseigne cette année l'utilisation du langage avec les nouveaux programmes et j'esssaie de travailler des petits programmes qui pourront servir. Du coup là typiquement j'aimerai faire un programme de conversion d'unités de longueurs à stocker dans la calculatrice.

Code:
def conv (n,debut,fin):
    """Convertit des unités de longueurs
    n = valeur , debut = unité de départ , fin = unité d'arrivée"""
    dico={"m":1,"dm":0.1,"cm":0.01"mm":0.001,"dam":10,"hm":100,"km":1000}
    #on stock dans un dictionnaire un chiffre associé pour chaque valeur
    rapport = dico[debut] / dico[fin]


    R = n * rapport
    #on calcule le résultat
    return ("{}{} = {}{}".format(n,debut,R,fin))

Ce programme fonctionne très bien si je tape par exemple conv(23,"m","cm") j'obtiens ce que je veux.

Sachant que j'essaie de travailler en utilisant des fonctions pour faire un parallèle avec les maths et que je ne souhaite pas utiliser d'inputs, j'ai un problème léger :
Est-ce possible de faire en sorte de pouvoir taper une chaine de caractère comme argument de la fonction sans mettre les "" ?

si je ne mets pas les "" il me sort une erreur de variable non définie (assez logique au final)
Pas sûr que cela soit possible.

Mais on peut le faire avec une astuce utilisant des variables globales :

Code:
(m,dm,cm,mm,dam,hm,km)=("m","dm","cm","mm","dam","hm","km")

# La fonction conv(v0,u0,u1) convertit des unités de longueurs
# v0 est la valeur, u0 est l'unité de cette valeur, u1 est l'unité dans laquelle on veut convertir cette valeur
def conv(v0,u0,u1):
    # on stocke dans un dictionnaire un coefficient associé à chaque unité
    dico={"m":1,"dm":0.1,"cm":0.01,"mm":0.001,"dam":10,"hm":100,"km":1000}
    # on calcule le coefficient multiplicateur permettant de passer de l'unité u0 à l'unité u1
    coef = dico[u0]/dico[u1]
    # on calcule la valeur v0 dans l'unité u1
    v1 = v0 * coef
    return ("{}{} = {}{}".format(v0,u0,v1,u1))
Avec cette méthode conv(5121,cm,m) et conv(5121,"cm","m") fonctionnent tous les 2 et renvoient le même résultat.

Dernière modification par Melchiorus ; 13/10/2019 à 14h04.
Après je ne suis pas sur que ce tu demandes soit une bonne chose. Déjà l'utilisation de tout ce qui est variable globale est en général déconseillé dans la plupart des langage des programmation, ça rend en général les programmes plus complexe à maintenir. Je resterai donc sur ta première version du programme, ou il faut passer l'unité entre guillemets. Tu pourrais faire ce que tu veux proprement en définissant ton propre type d'unité, mais ça me parait pas utile pour une initiation.

En outre, en permettant ici d'appeler conv avec "cm" ou cm, tu entretiens pour un débutant, je pense, plus la confusion entre variable et la valeur d'une variable, et dans une optique d'apprentissage je ne suis pas certains que ce soit une bonne idée.

Autre point, on est plus en 1960 où chaque caractère compte, du coup c'est mieux d'éviter au maximum les abréviations : nomme la fonction et les variables complètement. Faut pas oublier que rapidement, dès que tu programmes, tu passes plus de temps à lire du code (le tient ou celui des autres). Du coup avoir des noms lisibles facilite grandement.
Code:
def convertir(valeur, unite_de_depart, unite_d_arrive)
Me semble plus lisible

Dernier point, si tu es sur un python récent (3.6 ou plus, python --version pour savoir) tu peux utiliser les "f-string" pour faire ton formatage de string, c'est en général plus lisible que le ".format". Ta dernière ligne devient donc :
Code:
return f"{v0}{u0} = {v1}{u1}"
(les parenthèses autour du return ne sont pas obligatoire en Python sauf si tu veux renvoyer un tuple)
+1

Si ton but est de leur apprendre les bases de la programmation, évite de leur donner des mauvaises habitudes :

- limiter au maximum les dépendances globales pour des raisons de maintenance et testabilité (mockable notamment)

- éviter les abréviations. Le nommage est parlant pour faciliter la compréhension du code et le debuggage. En fonction des technologies, le code sera ensuite compilé / mis en cache / minifié / compacter ou je ne sais quoi encore.
Pour les abréviations, l'objectif est de déposer (et modifier) ces programmes sur une calculatrice dont l'écran fait euh ... ça de large :

2019-10-19 20_21_09-NumWorks Workshop.png


Après j'entends vos remarques, je prends en compte, c'est assez pertinent (notamment sur la partie variable != string) mais c'est encore une question de confort la raison profonde de ce choix : tapez "" sur la console avec la calculatrice pour utiliser le programme c'est un peu pénible

Concernant les "f-strings" j'apprend un truc que je ne connaissais pas, merci ! Par contre c'est un moteur en 3.4.5 au lycée :/
sur la calculatrice je sais même pas

edit :
Citation :
La version de Python disponible sur votre calculatrice NumWorks est MicroPython 1.9.4, compatible Python 3.4.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés