IGI-3008 – ESIEE Paris – 2016-2017 Figure 1 — Un extrait des tables Unicode Apprentissage de la Programmation avec Python TP4 Jean-Claude GEORGES Retour sur les chaînes de caractères Fonctions et méthodes Les chaînes de caractères sont des objets indexés (dont les composants sont numérotés) non modifiables. Outre les littéraux, on peut créer une chaîne en utilisant sa valeur Unicode ou son nom (hélas en anglais). Exercice 1 — Chaînes bizarres Que contiennent les chaînes suivantes ? >>> '\u2713' >>> "Utilisez '\N{MULTIPLICATION SIGN}' ou '\u00d7' pour \ afficher un signe de multiplication" >>> "\N{WHITE SMILING FACE}" >>> '\u0627\u0628\u0648\u062c\u0639\u0641\u0631\u0020\u0645\u062d\u0645\ \u062f\u0020\u0628\u0646\u0020\u0645\u0648\u0633\u06cc\u0020\u062e\u0648\ \u0627\u0631\u0632\u0645\u06cc' Les listes des caractères Unicode et de leurs noms associés est disponible à l’adresse I http://www.unicode.org/charts/ (attention, toutes les machines ne disposent pas de tous les caractères) Figure 2 — Les noms Unicode FONCTIONS ET MÉTHODES 2 L’indexation s[i] permet d’extraire un caractère unique de la chaîne. La découpe (slicing) s[d:f:p] permet de créer une nouvelle chaîne construite à partir de la chaîne de départ. Figure 3 — Indexation et slicing Les numérotations se font comme indiqué Fig. 3. Exercice 2 — Indexation et slicing Avec >>> s = "0123456789", que donneront les commandes suivantes ? >>> s[3] >>> s[-1] >>> s[0] >>> s[-3] >>> s[40] >>> s[-40] >>> s[3:8] >>> s[8:3] >>> s[:8] >>> s[3:] >>> s[:] >>> s[-8:-3] >>> s[:-3] >>> s[-8:] >>> s[3:8:2] >>> s[:8:3] >>> s[2::2] >>> s[::2] >>> s[-3:-8:-2] >>> s[-2::-3] >>> s[:2:-3] >>> s[::-1] Figure 4 — Pourquoi changement de casse On parle de casse en imprimerie, car avant les ordinateurs, les caractères (cassetins) en plomb étaient rangés dans des caisses, avec en bas les minuscules et en haut les majuscules. Exercice 3 — Changement de casse Avec >>> s = "Un EXEMPLE de Chaîne de Caractères", que donneront les commandes suivantes ? >>> s.lower() >>> s.upper() >>> s.capitalize() >>> s.title() >>> s.swapcase() TP4 IGI-3008 (2016-2017) FONCTIONS ET MÉTHODES 3 D’autres opérateurs, fonctions ou méthodes sont utilisables sur les chaînes. Exercice 4 — Tests Avec s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf", que donneront les commandes suivantes ? >>> "Jack" in s >>> "Jacky" in s def inferieur(s1, s2) : i = 0 while i < len(s1) and i < len(s2) : if ord(s1[i]) == ord(s2[i]) : # si c1 == c2 (en Unicode) i += 1 # on passe au suivant continue else : # si c1 != c2 ()en Unicode) return ord(s1[i]) < ord(s2[i]) # c1 < c2 else : # si s1 ou s2 est terminé return len(s1)<len(s2) # s1 doit être plus court que s2 Pour les règles de l’ordre lexicographique en français et leur programmation, voir I http://www-clips.imag.fr/geta/ >>> "" in s gilles.serasset/tri-du-francais.html >>> s.startswith("monsieur") >>> s.endswith("olf") >>> "Python" == "Python" >>> "Python" < "Python.3" >>> "Python.2" < "Python.3" >>> "Python" == "python" >>> "Python" <= "python" >>> "Zorro" < "cavalier" >>> "a" < "b" >>> "à" < "b" >>> "a123".isalnum() ;"a12 3".isalnum() >>> "Python".isalpha() ;"Pyth0n".isalpha() >>> "123".isdigit() ;"12.3".isdigit() ;"-12".isdigit() >>> "A2".isidentifier() ;"2A".isidentifier() ; >>> "arrière-grand-mère".islower() ;"Blanche-Neige et les 7 nains".islower() >>> "VOL 714 POUR SIDNEY".isupper() ;"VOL 714 POUR SlDNEY".isupper() >>> " ".isprintable() ;"tabulation \t".isprintable() >>> "\n\t ".isspace() TP4 Figure 5 — Comparaisons lexicographiques On remarque que les comparaisons sur les chaînes ne sont pas lexicographiques (ordre du dictionnaire). Elles suivent l’ordre Unicode. Le programme Python équivalent à la comparaison < est le suivant : IGI-3008 (2016-2017) FONCTIONS ET MÉTHODES 4 Exercice 5 — Suppression/ajout/remplacement Que donneront les commandes suivantes ? >>> "12".zfill(5) >>> " \t\n suppression des espaces à gauche >>> " suppression des espaces à droite \t\n ".rstrip() ".lstrip() >>> " suppression des espaces à droite et à gauche \t\n ".strip() >>> s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf" >>> t = s.replace('ami', 'copain') >>> print(s) >>> print(t) Exercice 6 — Comptage et recherche Avec s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf", que donneront les commandes suivantes ? len(s) ; s.count('e') ; s.count('ie') s.find('i') ; s.find('i',40) ; s.find('i',20,30) ; s.rfind('i') s.index('i') ; s.index('i',40) ; s.index('i',20,30) ;s.rindex('i') Écrivez un programme qui vérifie que toutes les lettres de l’alphabet sont contenues dans une chaîne s (qui vérifie que s est un pangramme, voir Fig. 6). On se limitera aux chaînes en minuscules et sans accent. TP4 IGI-3008 (2016-2017) Figure 6 — Pangrammes Un pangramme contient toutes les lettres de l’alphabet. Deux exemples classiques : Portez ce vieux whisky au juge blond qui fume The quick brown fox jumps over the lazy dog. Plus fort encore, ce pangramme de Gilles Esposito-Farèse, qui contient toutes les lettres accentuées et ligatures du français : Dès Noël où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr et cætera ! FONCTIONS ET MÉTHODES 5 Exercice 7 — Partitions Figure 7 — L’aide pour la méthode partition Que donneront les commandes suivantes ? >>> "Une chaîne à découper".partition('à') >>> help(str.partition) Help on method_descriptor : >>> "Une chaîne à découper".partition('et') partition(...) S.partition(sep) -> (head, sep, tail) >>> "Une chaîne à découper".partition(' ') Search for the separator sep in S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return S and two empty strings. >>> "Une chaîne à découper".split(' ') >>> "Une chaîne à découper".split(' ',2) >>> "Une chaîne à découper".split('e') >>> """Un texte Figure 8 — L’aide pour la méthode split sur >>> help(str.split) Help on method_descriptor : plusieurs lignes""".splitlines() >>> mots = " Une chaîne split(...) S.split(sep=None, maxsplit=-1) -> list of strings à découper en mots ".split() >>> mots Return a list of the words in S, using sep as the delimiter string. If maxsplit is given, at most maxsplit splits are done. If sep is not specified or is None, any whitespace string is a separator and empty strings are removed from the result. >>> ' '.join(mots) Figure 9 — L’aide pour la méthode join >>> help(str.join) Help on method_descriptor : join(...) S.join(iterable) -> str Return a string which is the concatenation of the strings in the iterable. The separator between elements is S. TP4 IGI-3008 (2016-2017) EXERCICES DE SYNTHÈSE 6 Exercices de synthèse Normalisation d’un mot français On a vu dans l’exercice 4 que les comparaisons sur les chaînes de caractères ne sont pas compatibles avec l’ordre alphabétique français. Exercice 8 — Normalisation d’un caractère Créez une fonction normalise_lettre qui retourne la (ou les) lettre(s) minuscule(s) correspondant au caractère de longueur 1 passé en paramètre, les caractères non lettres restant inchangés (’Z’ → ’z’, ’é’ → ’e’, ’œ’ → ’oe’, ’8’ → ’8’, ’ ?’ → ’ ?’ ). Figure 10 — Diacritiques et ligatures Il existe en français : - 16 lettres avec diacritiques : à â ä ç é è ê ë î ï ô ö ù û ü ÿ - 2 ligatures : æ, œ auxquelles on peut ajouter des lettres présentes dans certains dictionnaires pour des mots d’origine étrangère comme ñ (cañon), å (ångström) ou ō (Tōkyō) Exercice 9 — Normalisation d’un mot Créez une fonction normalise_texte qui retourne la chaîne minuscule du texte passé en paramètre, avec ses lettres accentuées ou cédillées converties en lettres normales et les ligatures séparées (’ZÈBRE’ → ’zebre’, ’bœuf’ → ’boeuf’). Testez cette fonction avec la chaîne suivante : Dès Noël où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr et cætera ! Figure 11 — Quelques palindromes à tester Engage le jeu que je le gagne. Tu l’as trop écrasé, César, ce Port-Salut ! Saippuakivikauppias (marchand de pierre de savon en finnois) et le plus vieux dialogue (trilogue ?) palindromique du monde : – Madam, I’m Adam ! – Eve. – Ssssssss... Exercice 10 — Palindrome Écrivez les fonctions nécessaires à vérifier qu’un texte est un palindrome. Une erreur de transcription fait que le texte trouvé sur ce site indiqué Fig. 12 n’est pas un palindrome : trouvez la correction à faire dans le texte pour qu’il devienne un vrai palindrome. Figure 12 — Un palindrome géant Le site I http://homepage.urbanet.ch/cruci.com/lexique/ palindrome.htm nous donne le palindrome record de Georges Perec. Trace l’inégal palindrome ...... e mord ni la plage ni l’écart. Georges Perec, La clôture et autre poèmes, Hachette, 1980 TP4 IGI-3008 (2016-2017)