Paramètres et présentation des données

Paramètres d'un programme

L'intérêt d'un programme est d'utiliser différentes données pour effectuer un même traitement. Il faudra donc fournir des données variables.

Il est naturel d'envisager un échange avec un utilisateur, le programme pose une question et traite la donnée. C'est la manière dont vous utilisez les programmes avec des interfaces graphiques.

Python propose une fonction basique pour cela, input(). La fonction input attend une saisie de l'utilisateur et retourne cette saisie comme une donnée de type chaine de caractères. Pensez donc à la transtyper au besoin.

name = input('Quel est votre langage favori ? ')
print(name)
year = int(input('Quand a-t-il été créé ? ')
print(year)

Cette fonction permet donc de créer une interface dans un terminal (invite de commandes). Nous ne nous attarderons pas sur l'utilisation de cette fonction. Pour exécuter un programme avec différentes valeurs dans le cadre de Jupyter, il est plus simple de dédier une cellule à la déclaration des variables et modifier les valeurs avant chaque exécution.

Ainsi, cette première cellule déclare les données paramètres du programme


In [ ]:
name = "Python"
year = 1989

Et la ou les cellule(s) suivante(s) traitent ces données (les dates seront vues ultérieurement).


In [ ]:
import datetime as dt

print(f"{name} a été créé en {year}")
print(f"C'était il y a {dt.datetime.now().year - year} ans")

Notez qu'ainsi, vous pouvez écrire un programme dans un Notebook, le paramétrer au besoin et l'exécuter entièrement grâce à l'entrée du menu Cell/Run all.

Mise en forme de chaines de caractères

Jusqu'ici, nous n'avons affiché que la donnée générée mais il est souvent plus adapté de la mettre en forme dans une chaine de caractères. L'outil le plus efficace est la méthode format() des chaines de caractères :

pref_string = "Mon langage favori est {}"
print(pref_string.format(name))

Les accolades permettent de mettre en forme les données à afficher. Le microlangage étant assez complexe, je vous invite à consulter la documentation pour les fonctionnalités exhaustives.

On retiendra les plus courantes :

  • {1} permet d'afficher le second élément de la liste des données.
  • {:.2f} permet d'afficher la donnée sous forme de réel avec deux chiffres après la virgule
  • {:10} réserve 10 espaces pour afficher la donnée
  • {:10.2f} réserve 10 espaces pour afficher un réel avec deux chiffres après la virgule
  • {1:10.2f} réserve 10 espaces pour afficher sous forme de réel avec deux chiffres après la virgule le second élément de la liste des données ### Exercices Reprenons l'exercice sur la vitesse calculée précédemment et améliorons l'affichage en imposant deux chiffres après le point décimal.

In [ ]:
temps = 6.892
distance = 19.7

print("{:.2F}".format(distance / temps))

Affichez une phrase mettant en forme les noms et âge ( exemple : Yoda a 800 ans ) en utilisant les données saisies précédemment (n'oubliez pas que les variables affectées précédemment sont accessibles dans cette cellule).


In [ ]:
print("{} a {} ans".format(name, age))

Opérations sur les données

Nous allons maintenant combiner traitement de données et affichage.

Exercices

Il me reste 3 épisodes de 53 minutes de Jessica Jones à regarder.

  • Combien de temps (en heures et minutes) cela représente-t-il ?
  • Sachant qu'il est 20h42, quelle sera l'heure de fin si je les regarde à la suite ? Affichez ces deux résultats à l'aide des templates suivants.

In [ ]:
TIME_REMAINING = 'Il reste {}h{} à visionner.'
END_HOURE = 'Vous aurez fini de regarder vos émission à {}h{}'

EPISODE_DURATION = 53
total_time = 3 * EPISODE_DURATION

total_hours = total_time // 60
total_minutes = total_time % 60

print(TIME_REMAINING.format(total_hours, total_minutes))

end_hour = 20 * 60 + 42 + total_time

end_hour, end_minutes = divmod(end_hour, 60)
print(END_HOURE.format(end_hour, end_minutes))

Mais nous pouvons également utiliser les fonctions que nous avons créé jusqu'ici


In [ ]:
import wblib.helpers as h

total_time = h.duration_for(3, unit_duration=53)

total_hours, total_minutes = divmod(total_time, 60)

print(TIME_REMAINING.format(total_hours, total_minutes))

end_hour, end_minutes = divmod(h.to_minutes(20, 42) + total_time, 60)
print(END_HOURE.format(end_hour, end_minutes))

In [ ]: