langages de script – Python

Cours 2 – précisions, fichiers et chaînes

M1 Ingénierie Multilingue – INaLCO

clement.plancq@ens.fr

Type bool et valeurs booléennes

  • Nous avons vu qu'il existe un type bool

    True et False sont les deux valeurs possibles de ce type.

  • Les comparaisons et les opérations booléennes renvoient des valeurs de type bool

In [1]:
"Hilary Clinton" == "Donald Trump"
Out[1]:
False
In [2]:
2.0 < 2.1 and 2.0 > 1.9
Out[2]:
True
  • Les valeurs ci-dessous sont toutes évaluées par l'interpréteur comme ayant la valeur booléenne false

    False None 0 "" () [] {}

  • Tout le reste1 sera évalué comme true

    Vous pouvez écrire :

    >>> if var: ou while list:
    

    plutôt que :
    (C'est même jugé plus pythonique (pythonien ?))

>>> if var != "": ou while list != []:

1 Sauf les objets dont vous avez construit les classes. Voir les diapos à venir sur Classes et objets.

Assertions

  • Les assertions (assert condition) permettent de vérifier qu'une condition est remplie avant de poursuivre le programme

  • assert est utilisé à des fins de débogage.

  • Les assertions ne sont pas prises en compte si l'interpréteur est appelé avec l'option -O (optimisation)
In [11]:
var = 2
assert 1 <= var <= 10

est équivalent à :

In [12]:
if not 1 <= var <= 10:
    raise AssertionError
# plus exactement               
if __debug__:
    if not 1 <= var <= 10: raise AssertionError

Précisions sur boucle for

  • for permet d'appliquer à chaque élément d'une liste les instructions du bloc qui suit
In [ ]:
words = ['tout', 'ici', 'chante', 'la', 'vie', 'de', 'naguère']
for word in words:
    up_word = word.upper()
    print(up_word)
  • Plus précisément for s'applique sur les séquences (list, str, tuple) et plus généralement sur les iterables voir doc

  • Les iterables sont des objets issus de classes qui implémentent la méthode __iter__() et/ou __getitem__()

    Essayer help(str) ou help(dict)

Boucles encore

  • L'instruction continue permet de passer à l'itération suivante
In [17]:
for word in words:
    if word == 'la':
        continue
    print(word, end=" ")
tout ici chante vie de naguère 
  • L'instruction break permet de quitter la boucle en cours
In [18]:
for word in words:
    if word == 'la':
        break
    print(word, end=" ")
tout ici chante 

Boucles enfin

  • zip permet de boucler sur plusieurs séquences
  • Si les séquences sont de tailles différentes zip s'arrête à la longueur la plus petite
In [19]:
noms = ['einstein', 'planck', 'turing', 'curie', 'bohr', 'shannon']
facs = ['inalco', 'p3', 'p10', 'inalco', 'p3', 'inalco']
parcours = ['pro', 'r&d', 'r&d', 'pro', 'pro', 'r&d']
for nom, fac, parcours in zip(noms, facs, parcours):
    print("{} est inscrit en {} à {}".format(nom, parcours, fac))
einstein est inscrit en pro à inalco
planck est inscrit en r&d à p3
turing est inscrit en r&d à p10
curie est inscrit en pro à inalco
bohr est inscrit en pro à p3
shannon est inscrit en r&d à inalco

Les fichiers

  • Pour travailler avec les fichiers on doit procéder à trois opérations :

    1. Ouverture avec la fonction open (renvoie IOError en cas d'échec)
    2. Lecture (read ou readline ou readlines) et/ou écriture (write)
    3. Fermeture du fichier avec la fonction close
  • Ouverture

    • open est une fonction qui accepte de nombreux arguments : RTFM
    • open renvoie un objet de type file
    • Le plus souvent elle s'emploie de la manière suivante:
      >>> #f = open(filename, mode)      
      >>> f = open('nom_fichier', 'w')
      

Les modes sont :

  • r : lecture (défaut)
  • w : écriture
  • x : création et écriture (échec si le fichier existe déjà)
  • a : concaténation (append)

  • b : mode binaire

  • t : mode texte (défaut)
  • + : read/write (ex: r+b)

Les fichiers : ouverture

La documentation de Python conseille cette façon de faire

>>> with open('mon_fichier', 'r') as f:
...     read_data = f.read()

L'utilisation du mot clé with garantit la fermeture du fichier même si une exception est soulevée

Les fichiers : lecture

Plusieurs options pour la lecture

  • la fonction read() sans argument retourne le contenu du fichier
  • elle peut recevoir en argument la taille des donnéees à retourner
# Les n premiers octets
3_chars = f.read(3) 
# Le reste du fichier
content = f.read()
  • fonction readline et readlines
for line in f.readline():
    process(line)

lines = f.readlines()
  • un objet file est un itérable ! (the pythonic way)
for line in f:
    process(line)

Les fichiers : écriture et fermeture

  • fonction write
    for item in list:
      f.write(item)
    
  • fonction close

    f.close()

    En règle générale veillez à toujours fermer les objets fichiers

    En mode écriture oublier de fermer un fichier peut réserver des mauvaises surprises

  • sys.stdin, sys.stdout et sys.stderr sont des objets de type file

Les chaînes

Comme les listes et les tuples, les chaînes sont des sequences, on peut leur appliquer les opérations suivantes propres à la catégorie d'objets sequence :

  • longueur, minimum, maximum
In [29]:
var = "bonjour"
len(var)
Out[29]:
7
In [25]:
max(var)
Out[25]:
'u'
  • indexing
In [33]:
var[2]
Out[33]:
'n'
In [28]:
var[-1]
Out[28]:
'r'
  • slicing
In [34]:
var[0:3] # 3 premiers éléments
Out[34]:
'bon'
In [35]:
var[-3:] # 3 derniers éléments
Out[35]:
'our'
  • membership
In [38]:
if 'u' in var:
    print("Il y a un u dans {}".format(var))
Il y a un u dans bonjour

Les chaînes ont aussi des fonctions qui leur sont propres

  • lower
In [39]:
var = "Le Grand Quotidien National"
var.lower()
Out[39]:
'le grand quotidien national'
  • replace
In [40]:
var = "Le Grand Quotidien National"
var = var.lower()
var.replace('na', 'bo')
Out[40]:
'le grand quotidien botiobol'
  • strip, rstrip

    strip appelé sans arguments supprimme le ou les espaces en tête et en fin de chaîne
    rstrip fait la même chose en fin de chaîne uniquement
    lstrip idem en début de chaîne

In [46]:
var = "Lover you should've come over "
var.rstrip()
Out[46]:
"Lover you should've come over"
  • split

    split découpe une chaîne en fonction du séparateur passé en argument et renvoie une liste

In [47]:
var = "The concept of global warming was created by and for the Chinese in order to make U.S. manufacturing non-competitive."
words = var.split(' ')
words[:5]
Out[47]:
['The', 'concept', 'of', 'global', 'warming']
  • join

    join est l'inverse de split, il permet de joindre les éléments d'une liste de chaînes pour former une seule chaîne de caractères

In [50]:
list = ['Quand', 'le', 'ciel', 'bas', 'et', 'lourd']
" ".join(list)
Out[50]:
'Quand le ciel bas et lourd'

Formatage de chaînes

« There should be one-- and preferably only one --obvious way to do it. » Zen of Python
Sauf que :

In [53]:
name = ""
coffee_price = 0.6

print("Tiens salut " + name + ". Tu aurais pas " + str(coffee_price*2) + " euros pour 2 cafés ?")
Tiens salut . T'aurais pas 1.2 euros pour 2 cafés ?
  • format() depuis python3 (et python2.7)
In [57]:
print("Tiens salut {}. T'aurais pas {} euros pour 2 cafés ?".format(name, coffee_price*2))
Tiens salut . T'aurais pas 1.2 euros pour 2 cafés ?
In [58]:
print(f"Tiens salut {name}. T'aurais pas {coffee_price*2} pour 2 cafés ?")
Tiens salut . T'aurais pas 1.2 pour 2 cafés ?

Exos

Vous rendrez des scripts Python3. Avec des commentaires c'est mieux.

  1. Finir dictionnaire de rimes
  2. Résoudre températures sur CodinGame