Chaînes Python

Python dispose d'une classe de chaîne intégrée nommée "str" avec de nombreuses fonctions pratiques (il existe un module plus ancien nommé "string" que vous ne devriez pas utiliser). Les littéraux de chaîne peuvent être encadrés par des guillemets doubles ou simples, bien que des guillemets simples soient plus couramment utilisés. Les échappements à barre oblique inverse fonctionnent de la manière habituelle dans les littéraux simples et doubles (par exemple, \n \' \". Un littéral de chaîne entre guillemets simples peut contenir des guillemets simples sans difficulté (par exemple, "Je n'ai pas fait ça"), de même qu'une chaîne entre guillemets simples. Un littéral de chaîne peut s'étendre sur plusieurs lignes, mais il doit y avoir une barre oblique inverse \ à la fin de chaque ligne pour échapper la nouvelle ligne. Littéraux de chaîne entre guillemets triples, """ ou ''', peuvent s'étendre sur plusieurs lignes de texte.

Les chaînes Python sont "immuables" ce qui signifie qu'elles ne peuvent pas être modifiées après leur création (les chaînes Java utilisent également ce style immuable). Les chaînes ne pouvant pas être modifiées, nous construisons de *nouvelles* chaînes au fur et à mesure pour représenter les valeurs calculées. Ainsi, par exemple, l'expression ('hello' + 'there') prend les deux chaînes "hello" et "ça" et crée une nouvelle chaîne "hellothere".

Les caractères d'une chaîne sont accessibles à l'aide de la syntaxe standard [ ]. Comme Java et C++, Python utilise l'indexation basée sur zéro. Ainsi, si s correspond à "hello" s[1] correspond à "e". Si l'index est hors limites pour la chaîne, Python génère une erreur. Le style Python (contrairement à Perl) consiste à s'arrêter s'il ne peut pas dire quoi faire, au lieu de simplement créer une valeur par défaut. La "tranche" pratique (ci-dessous) fonctionne également pour extraire n'importe quelle sous-chaîne d'une chaîne. La fonction len(string) renvoie la longueur d'une chaîne. La syntaxe [ ] et la fonction len() fonctionnent en fait sur n'importe quel type de séquence (chaînes, listes, etc.). Python tente de faire fonctionner ses opérations de manière cohérente sur différents types. Piège de Python pour les débutants: n'utilisez pas "len" comme nom de variable pour éviter de bloquer la fonction len(). Le signe "+" peut concaténer deux chaînes. Notez dans le code ci-dessous que les variables ne sont pas pré-déclarées. Il vous suffit de les attribuer et le tour est joué.

  s = 'hi'
  print(s[1])          ## i
  print(len(s))        ## 2
  print(s + ' there')  ## hi there

Contrairement à Java, le signe "+" ne convertit pas automatiquement les nombres ou d'autres types en chaînes. La fonction str() convertit les valeurs en une forme de chaîne afin qu'elles puissent être combinées avec d'autres chaînes.

  pi = 3.14
  ##text = 'The value of pi is ' + pi      ## NO, does not work
  text = 'The value of pi is '  + str(pi)  ## yes

Pour les nombres, les opérateurs standards +, / et * fonctionnent comme d'habitude. Il n'y a pas d'opérateur ++, mais +=, -=, etc. fonctionnent. Si vous souhaitez utiliser la division des entiers, utilisez deux barres obliques (par exemple, 6 // 5 est égal à 1

L’« impression » affiche normalement un ou plusieurs éléments Python suivis d'un retour à la ligne. Une couche "brute" Le littéral de chaîne est précédé d'un "r" et transmet tous les caractères sans traitement spécial des barres obliques inverses, donc r'x\nx' prend la valeur de la chaîne longueur-4 'x\nx'. "imprimer" peut utiliser plusieurs arguments pour modifier la façon dont les éléments sont affichés (voir Définition de la fonction d'impression de python.org), comme définir "end" par "" de ne plus imprimer de nouvelle ligne une fois tous les éléments imprimés.

  raw = r'this\t\n and that'

  # this\t\n and that
  print(raw)

  multi = """It was the best of times.
  It was the worst of times."""

  # It was the best of times.
  #   It was the worst of times.
  print(multi)

Méthodes de chaîne

Voici quelques-unes des méthodes de chaîne les plus courantes. Une méthode est comme une fonction, mais elle s'exécute "sur" un objet. Si la variable s est une chaîne, le code s.lower() exécute la méthode down() sur cet objet de chaîne et renvoie le résultat (l'idée d'une méthode exécutée sur un objet est l'une des idées de base qui composent la programmation orientée objet). Voici quelques-unes des méthodes de chaîne les plus courantes:

  • s.lower(), s.upper() -- renvoie la version en minuscules ou en majuscules de la chaîne
  • s.strip() : renvoie une chaîne sans espace au début et à la fin
  • s.isalpha()/s.isdigit()/s.isspace()... -- teste si tous les caractères de chaîne se trouvent dans les différentes classes de caractères
  • s.startswith('other'), s.endswith('other') : vérifie si la chaîne commence ou se termine par l'autre chaîne donnée.
  • s.find('other') -- recherche l'autre chaîne donnée (et non une expression régulière) à l'intérieur de et renvoie le premier index où elle commence ou -1 si elle est introuvable.
  • s.Replace('old', 'new') : renvoie une chaîne dans laquelle toutes les occurrences de "ancien" ont été remplacés par "neuf"
  • s.split('delim') : renvoie une liste de sous-chaînes séparées par le délimiteur indiqué. Le délimiteur n'est pas une expression régulière, mais uniquement du texte. 'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc']. Comme cas pratique, la fonction s.split() (sans argument) divise tous les caractères d'espace blanc.
  • s.join(list) : à l'opposé de split(), joint les éléments de la liste donnée en utilisant la chaîne comme délimiteur. Ex. : '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---ccc

Une recherche Google sur "python str" vous devriez être redirigé vers les méthodes de chaîne python.org officielles qui répertorient toutes les méthodes str.

Python ne possède pas de type de caractère distinct. À la place, une expression comme s[8] renvoie une chaîne-length-1 contenant le caractère. Avec ce paramètre string-length-1, les opérateurs ==, <=, ... fonctionnent tous comme prévu. Il est donc inutile de savoir que Python n'a pas de "char" scalaire distinct de mots clés.

Tranches de chaîne

La "tranche" la syntaxe est un moyen pratique de faire référence à des sous-parties de séquences, généralement des chaînes et des listes. La tranche s[start:end] est les éléments qui commencent au début et s'étendent jusqu'à la fin (non incluse). Supposons que nous ayons s = "Hello"

la chaîne &quot;hello&quot; ; avec des index de lettres 0 1 2 3 4

  • s[1:4] est "ell" -- caractères commençant à l'index 1 et s'étendant jusqu'à l'index 4 (non inclus)
  • s[1:] correspond à "ello" -- le début ou la fin de la chaîne est omis par défaut
  • s[:] correspond à "Bonjour". -- en omettant les deux, vous obtenez toujours une copie de l'ensemble (il s'agit de la méthode Python pour copier une séquence telle qu'une chaîne ou une liste).
  • s[1:100] correspond à "ello" -- Un index trop grand est tronqué à la longueur de la chaîne.

Les index standards basés sur zéro permettent d'accéder facilement aux caractères situés près du début de la chaîne. À la place, Python utilise des nombres négatifs pour faciliter l'accès aux caractères à la fin de la chaîne: s[-1] est le dernier caractère "o", s[-2] est "l" l'avant-dernier caractère, etc. Les numéros d'index négatifs sont comptabilisés à partir de la fin de la chaîne:

  • s[-1] correspond à "o" -- dernier caractère (1er à partir de la fin)
  • s[-4] correspond à "e" -- 4e à partir de la fin
  • s[:-3] est "Il" -- allant jusqu'aux 3 derniers caractères (non inclus).
  • s[-3:] correspond à "llo" -- en commençant par le 3e caractère à partir de la fin et s'étendant jusqu'à la fin de la chaîne.

Il s'agit d'un truisme complètement rigide de tranches que pour tout index n, s[:n] + s[n:] == s. Cela fonctionne même pour n négatif ou hors limites. Sinon, s[:n] et s[n:] partitionnent toujours la chaîne en deux parties de chaîne, en conservant tous les caractères. Comme nous le verrons plus tard dans la section dédiée aux listes, les segments fonctionnent également avec les listes.

Mise en forme des chaînes

Python peut convertir automatiquement les objets une chaîne adaptée à l'impression. Deux méthodes intégrées permettent d'y parvenir : les chaînes formatées ou littéraux, également appelés "chaînes f", et en appelant str.format().

Littéraux de chaîne mis en forme

Des littéraux de chaîne formatés sont souvent utilisés dans les situations suivantes:

  value = 2.791514
  print(f'approximate value = {value:.2f}')  # approximate value = 2.79

  car = {'tires':4, 'doors':2}
  print(f'car = {car}') # car = {'tires': 4, 'doors': 2}

Une chaîne littérale mise en forme est précédée du préfixe "f" (comme le préfixe "r" utilisé pour les chaînes brutes). Tout texte en dehors des accolades "{}" est imprimé directement. Expressions contenues dans "{}" sont sont imprimées selon les spécifications de format décrites dans le document les spécifications de format. Il y a beaucoup de choses intéressantes que vous pouvez faire avec la mise en forme, y compris la troncation et conversion en notation scientifique et alignement gauche/droite/centre.

Les chaînes f sont très utiles lorsque vous souhaitez imprimer un tableau d'objets et les colonnes représentant les différents attributs d'objet à aligner,

  address_book = [{'name':'N.X.', 'addr':'15 Jones St', 'bonus': 70},
      {'name':'J.P.', 'addr':'1005 5th St', 'bonus': 400},
      {'name':'A.A.', 'addr':'200001 Bdwy', 'bonus': 5},]

  for person in address_book:
    print(f'{person["name"]:8} || {person["addr"]:20} || {person["bonus"]:>5}')

  # N.X.     || 15 Jones St          ||    70
  # J.P.     || 1005 5th St          ||   400
  # A.A.     || 200001 Bdwy          ||     5

% chaîne

Python dispose également d'une ancienne fonction de type printf() pour créer une chaîne. L'opérateur % prend une chaîne de format de type printf à gauche (%d int, chaîne %s, virgule flottante %f/%g), et les valeurs correspondantes dans un tuple à droite (un tuple est constitué de valeurs séparées par des virgules, généralement regroupées entre parenthèses):

  # % operator
  text = "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down." % (3, 'huff', 'puff', 'house')

La ligne ci-dessus est assez longue. Supposons que vous souhaitiez la diviser en lignes distinctes. Vous ne pouvez pas simplement scinder la ligne après le signe "%" comme vous le feriez dans d'autres langages, car Python traite par défaut chaque ligne comme une instruction distincte (côté plus, c'est pourquoi il n'est pas nécessaire de saisir des points-virgules sur chaque ligne). Pour résoudre ce problème, placez l'expression entière entre parenthèses. L'expression peut alors s'étendre sur plusieurs lignes. Cette technique de code interligne fonctionne avec les différentes constructions de regroupement détaillées ci-dessous: ( ), [ ], { }.

  # Add parentheses to make the long line work:
  text = (
    "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

C'est mieux, mais la file d'attente est encore un peu longue. Python vous permet de découper une ligne en fragments, qu'il concatène ensuite automatiquement. Donc, pour rendre cette ligne encore plus courte, nous pouvons faire ceci:

  # Split the line into chunks, which are concatenated automatically by Python
  text = (
    "%d little pigs come out, "
    "or I'll %s, and I'll %s, "
    "and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

Chaînes (Unicode ou octets)

Les chaînes Python standards sont Unicode.

Python accepte également les chaînes composées d'octets bruts (indiqués par le préfixe "b" devant un littéral de chaîne). par exemple:

> byte_string = b'A byte string'
> byte_string
  b'A byte string'

Une chaîne Unicode est un type d'objet différent d'une chaîne d'octets, mais différentes bibliothèques telles que Les expressions régulières fonctionnent correctement si elles sont transmises, quel que soit le type de chaîne.

Pour convertir une chaîne Python standard en octets, appelez la méthode encode() sur la chaîne. En allant dans l'autre sens, la méthode byte string decode() convertit les octets bruts encodés en chaîne Unicode:

> ustring = 'A unicode \u018e string \xf1'
> b = ustring.encode('utf-8')
> b
b'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding. Note the b-prefix.
> t = b.decode('utf-8')                ## Convert bytes back to a unicode string
> t == ustring                         ## It's the same as the original, yay!

True

La section de lecture des fichiers contient un exemple qui montre comment ouvrir un fichier texte avec un certain codage et lire des chaînes Unicode.

Instruction If

Python n'utilise pas { } pour délimiter des blocs de code pour if/loops/function, etc. À la place, Python utilise les deux-points (:) et les retraits/espaces blancs pour regrouper les instructions. Le test booléen d'un if n'a pas besoin d'être entre parenthèses (grande différence par rapport à C++/Java). Il peut comporter des clauses *elif* et *else* (mnémotechnique: le mot "elif" a la même longueur que le mot "else").

N'importe quelle valeur peut être utilisée comme if-test. Le "zéro" valeurs sont considérées comme fausses: None, 0, chaîne vide, liste vide, dictionnaire vide. Il existe également un type booléen avec deux valeurs: True et False (converti en int, il s'agit de 1 et 0). Python utilise les opérations de comparaison habituelles: ==, !=, <, <=, >, >=. Contrairement à Java et C, == est surchargé pour fonctionner correctement avec les chaînes. Les opérateurs booléens sont les mots épelés *and*, *or*, *not* (Python n'utilise pas le style C && || !). Voici à quoi pourrait ressembler le code pour une application de santé proposant des recommandations de boissons tout au long de la journée. Notez que chaque bloc d'instructions "alors/else" commence par un ":" et les instructions sont regroupées par retrait:

  if time_hour >= 0 and time_hour <= 24:
    print('Suggesting a drink option...')
    if mood == 'sleepy' and time_hour < 10:
      print('coffee')
    elif mood == 'thirsty' or time_hour < 2:
      print('lemonade')
    else:
      print('water')

Je trouve qu'omettre le ":" est mon erreur de syntaxe la plus courante lors de la saisie du type de code ci-dessus, probablement parce que c'est une chose supplémentaire à saisir par rapport à mes habitudes C++/Java. De plus, ne mettez pas le test booléen entre parenthèses, c'est une habitude en C/Java. Si le code est court, vous pouvez placer le code sur la même ligne après ":", comme ceci (cela s'applique également aux fonctions, aux boucles, etc.), bien que certaines personnes estiment qu'il est plus facile d'espacer les éléments sur des lignes distinctes.

  if time_hour < 10: print('coffee')
  else: print('water')

Exercice: string1.py

Pour vous entraîner à utiliser le contenu de cette section, essayez l'exercice string1.py dans les Exercices de base.