Mini-cours de Python

Bouts de code

input2()

On doit parfois réduire le choix de l'utilisateur aux seuls caractères autorisés. En effet, par exemple, tous les caractères ne sont pas autorisés dans le nom d'un fichier. La fonction suivante, non native, input2() limite le choix de l'utilisateur.


ALPHA="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
DIGIT="0123456789"
FILENAME=ALPHA+DIGIT+"-_" # nom de fichier sans extension

CARAC_66=FILENAME+".~"# 66 caractères sont autorisés dans un nom de fichier
# (Son nom n'est alors pas modifié dans son URL s'il est sur un serveur)

WORD_FR=ALPHA+" 'éèêëàâîïôùûüÿæœçÀÂÇÉÈÊËÎÏÔÙÛÜŸÆŒ" # pour NOM, prénom, mot

ALL_CARAC=WORD_FR+"<>/\()[]{}|`£¤%§?;,@&=+$#:!¤°^.~"
# (") est exclu dans ce programme

def input2(msg, str_carac=FILENAME, isCaracOK=True, isVideOK=False):
  """ Cette fonction retourne une string composée de caractères autorisés.

NB : input2() est une version "améliorée" de la fonction native input()

:param str msg: message affiché avant le curseur
:param str str_carac: liste des caractères. Par défaut, vaut FILENAME

:param bool isCaracOK: True (par défaut)
  Si True,  second argument = la liste des caractères autorisés
  Si False, second argument = liste des caractères interdits
NB : Le contrôle est sûr en n'autorisant que des caractères autorisés,
mais plus lent si quasi tous les caractères sont autorisés

:param bool isVideOK: False (par défaut)
  Si True,  la valeur de retour peut être vide
  Si False, la valeur de retour ne peut pas être vide

:return: Une string tapée (ou collée) par l'utilisateur
:rtype: str
"""
  while(True):
    re=input(msg); OK=True
    for i in range(len(re)):
      if(isCaracOK):
        if (re[i] not in str_carac):
          print(re[i]+" est un caractère interdit."); OK=False; break
      else:
        if (re[i] in str_carac):
          print(re[i]+" est un caractère interdit."); OK=False; break
    if(not OK): continue
    if(not isVideOK and len(re)==0): continue
    return re

re=input2("Nom du fichier (sans extension): ")
print("Votre réponse = "+re)
re=input2("Année de votre naissance : ", DIGIT)
print("Votre réponse = "+re)
re=input2("Votre nom : ", ".~<>/\()[]{}|`£¤%§?0123456789;,@&=+$#_", False)
print("Votre réponse = "+re)

Lorsque quasi tous les caractères sont autorisés, le programme est plus rapide si on définit ceux qui ne sont pas. Toutefois, il est plus sûr de donner la liste (même longue) des caractères autorisés, pour éviter que des caractères exotiques (tel que : ♫ א 异) puissent être pris en compte par le programme. Ces caractères exotiques n'existent pas sur un clavier belge (ou français), mais ils peuvent être copiés/collés ...

Il est préférable de demander le nom d'un fichier sans son extension, car sinon, il faudra autoriser l'utilisateur à taper un point(.). S'il reçoit une telle autorisation, il pourra alors en taper un ou deux points sans taper l'extension. Or, certains noms de fichiers ont une signification particulière. Les fichiers "." et ".." ont une signification particulière sur les systèmes d'exploitation.

Obtenir une date valide au format AAAA-MM-JJ

import datetime

def isDateValid(date_string): # retourne True si la date est valide

  date_format = '%Y-%m-%d' # accepte 2000-2-2 ! => les 4 lignes suivantes
  if (len(date_string)!=10):              return False
  if (not date_string[:4].isdecimal()  ): return False
  if (not date_string[5:7].isdecimal() ): return False
  if (not date_string[8:].isdecimal()  ): return False

  try:
    date_obj = datetime.datetime.strptime(date_string, date_format)
    return True
  except:
    return False

def getAAAAMMJJ(msg): # retourne une date valide au format AAAA-MM-JJ
  while (True):
    re=input(msg)
    if(isDateValid(re)):break
  return re

x=getAAAAMMJJ("Introduisez une date au format AAAA-MM-JJ : ")
print("Vous avez fourni la date valide : "+x)

Obtenir un nombre entier positif (0 admis)

def getIntPositif(msg): # 0 est autorisé
  while(True):
    n=input(msg)
    if (n.isdecimal()): break
  return int(n)

Choix dangereux => imposer la majuscule

=> Le choix par défaut est la lettre en minuscule.

def ma_fonction():

  # début de la fonction
  re=input("Souhaitez-vous supprimer vos données ? Y/n : ")
  # Pour que les données ne soient pas supprimées accidentellement,
  # il faut que l'utilisateur marque son choix en appuyant sur 2 touches (MAJ + y)
  if(re!="Y"):
    print("Vos données ont été conservées.")
  else:
    # (code lié à la suppression des données)
    print("Données supprimées. C'était votre choix !")
  # Fin de la fonction


  # On peut coder plus court avec l'ajout du mot-cle 'return' :

  # début de la fonction
  re=input("Souhaitez-vous supprimer vos données ? Y/n : ")
  if(re!="Y"): print("Vos données ont été conservées."); return
  # (code lié à la suppression des données)
  print("Données supprimées. C'était votre choix !")
  # Fin de la fonction

  # Et, encore plus court ... si on ne prévient l'utilisateur qu'en cas de changement

  re=input("Souhaitez-vous supprimer vos données ? Y/n : ")
  if(re!="Y"): return
  # ...
  print("Données supprimées. C'était votre choix !")

  re=input("Souhaitez-vous devenir riche ? y/N : ")
  if(re!="N"): return
  print("Ce choix n'est pas normal.")
  

Effacer l'écran d'un terminal

  import platform

  def effacEcran(): #-------------------------------------------------------------
    """ Cette procédure (sub) efface l'écran (du terminal).
  Elle requiert "import platform".
  NB : L'effacement de l'écran n'a pas lieu lorsque le programme est lancé via
  l'éditeur IDLE. Ni sous Mac.
  """
    if platform.system() == "Windows":
      os.system("cls")
    elif platform.system() == "Linux":
      os.system("clear")
  

Sous Mac = ?