Découverte du langage Python

Environnement de travail

Ouvrir un terminal et lancer la commande: python.

$ python
Python 3.9.18 (main, Sep  7 2023, 00:00:00) 
[GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

On quitte l’interpréteur avec quit() ou Ctrl+D.

Si vous travaillez sur votre propre ordinateur, installez une version 3.9 ou supérieure de Python.

Lien vers la documentation de référence de Python 3.

Les bases du langage Python

Les exercices ci-dessous sont réalisés dans l’interpréteur. Tapez les commandes et expliquez les résultats.

Nombres

x = 3
type(x)
y = 0.2
type(y)
3 / 2
3 // 2
5 % 3
5 ** 2

Quel le type de 3 / 2? Et celui de 3 // 2?

Chaînes de caractères

x = "Coucou le monde"
type(x)
y = 'Hello, world'
type(y)
'nde' in x
'nde' in y
len(x)
x[7]
x[-1]
x[-2]
x[7:9]
x[::-1]

Quel est le type de x[7]? Et celui de x[7:9]?

L’opérateur [] retourne un slice. Quels sont les trois paramètres de []?

x.upper()
'mangé'.upper()
x.count('ou')
'aaaa'.count('aa')
x.split(' ')
'   text '.strip()
'Foo'.rjust(10, ' ')
x.replace(' ', '-')

Comment obtenir la chaîne '.......Foo' à partir de la chaîne 'Foo'?

nom = 'Ben'
age = 5
f'Bonjour, {nom}, tu as {age} ans'

def make_filename(nom, age):
    return f'{nom}_{age}.jpg'

make_filename('Alice', '2')

dir(nom)

help(str)   # ou help(nom)

Listes

li = ['vélo', 1, 'fin']
li
len(li)
li[0]
li[-1]
li[::2]
li[1:]
li[::-1]
li[2][1]

Quel est le type de li[0]? Celui de li[1:]?

li[1] = 'volant'
li

Expliquer ce que fait l’instruction li[1] = 'volant'

li.append('test')
li
[1,2,3] + [4,5,6]
[0, 1] * 4
"fin" in li
", ".join(li)

Ensembles

s = {'Bordeaux', 'Marseille', 'Rennes'}
s
'Paris' in s
'Londres' in s
s[0]

Expliquez le résultat affiché par l’interpréteur.

s.add('Toulouse')
s
s.union({'Strasbourg', 'Nancy'})

Quel opérateur permet de calculer l’union de deux ensembles? Et l’intersection?

list(s)
set(li)

Que font les deux instructions ci-dessus?

Tuples

t = ('Bordeaux', 33)
t[0], len(t), t[-1]
t[0] = 'Libourne'

Quel est le type de t[0], len(t), t[-1]?

t.append(2)
t + ('Nouvelle Aquitaine',)

Pourquoi faut-il une virgule après 'Nouvelle Aquitaine'?

tuple(s)

Dictionnaires

bdx = {'ville': 'Bordeaux', 'département': 33}
bdx
'ville' in bdx
bdx['ville']
'Bordeaux' in bdx
bdx['région']
'région' in bdx
bdx.keys()
'Bordeaux' in bdx.keys()
bdx.values()
'Bordeaux' in bdx.values()
bdx_items = bdx.items()
bdx_items
('ville', 'Bordeaux') in bdx_items

Quel est le type de bdx_items? Quel est le type des éléments dans bdx_items?

bdx['région'] = 'Nouvelle Aquitaine'
bdx
bdx_items

Expliquer l’affichage produit par la dernière commande (cf. dict-views)

bdx['pays']
bdx.get('pays')
bdx.get('pays', 'France')

À l’aide de la commande help, expliquez le résultat affiché par dernière commande.

score = {}
score[s] = 100
score[li] = 100
score[bdx] = 100
score[t] = 100
score

Quel est le type de score? Quelle propriété doit avoir le type des clés?

if

li

if 'vélo' not in li:
    li.insert(0, 'vélo')
elif 'moto' not in li:
    li.append('moto')
else:
    li.remove('fin')
    
li

Exécutez le if ci-dessus trois fois en affichant la valeur de li à chaque fois, et expliquez le résultat affiché.

while

v = li[:2]
while len(v) < 4:
    v.append(v[0]+v[-1])
v

Quelle est la valeur de v avant la boucle? Que valent v[0] et v[-1] à chaque itération de la boucle?

for

for x in li:
    print(f'element de li: {x}')
for i, x in enumerate(li):
    print(f'li[{i}] = {x}')

Que fait enumerate? (cf. documentation de enumerate)

c = []
for i in range(10):
    c.append(li[i % len(li)])

c

Définitions en compréhension

li
[len(x) for x in li]
sum([len(x) for x in li])
[x for x in li if x[0] == "v"]
{(x,len(x)) for x in li}
{x: len(x) for x in li}
{x: len(x) for x in li if 'o' in x}

Traduire en français chacune des définitions ci-dessus. Donner le type de chaque objet créé par ces définitions, ainsi que le type des objets qu’il contient.

l = [[0] * 4] * 3

On a vu en cours que la déclaration de l ci-dessus créé une liste qui contient 3 références vers une même liste contenant elle-même 4 références vers une entier de valeur 0:

l->[x,x,x] avec x->[y,y,y,y] avec y->0

Alors, l’affectation l[0][0]=1 modifie la liste x en faisant pointer son premier élément vers un entier contenant 1:

l->[x,x,x] avec x->[z,y,y,y] avec y->0 et z->1

Comment faut-il déclarer l pour que l[0][0]=1 ne modifie que le premier élément de la première sous-liste de l? (en d’autres termes: on veut que chaque entrée de l référence un entier distinct).

Entrées / sorties

Fichiers

open('data.txt')

Expliquez l’erreur observée (cf. help(open)).

f = open('data.txt', mode='w') 
f
f.write('Hello world!')
f.close()
f.closed

À quoi correspond le nombre affiché après la commande write (cf. help(f.write))?

with open('data.txt') as f:
    content = f.readlines()
    print(content)

Quel est le type de content? Que fait l’instruction with ... as ...?

Flux du processus

print('un', 2, 3.0)

import sys
print('Erreur!', file=sys.stderr)

line = sys.stdin.readline()
line

Fonctions

def double(x):
    return x * 2

double(3)
double('a')
double([1,2,3])
double({1,2,3})

Modifier la fonction double afin qu’elle retourne le double de x lorsque x est de type int, et None sinon (cf. isinstance).

def hello(name, greeting='Hello'):
    return f'{greeting}, {name}!'

hello('John')
hello('John', greeting='Bonjour')
hello('John', 'Bonjour')   # à éviter

Donnez deux raisons pour lesquelles la dernière forme est à éviter.

def sum_power(x, y, power_x=2, power_y=2):
    return x**power_x + y**power_y
        
sum_power(3)
sum_power(3, 4)
sum_power(3, 4, power_y=3)