Analyse d'un script python

Les scripts python sont des fichiers de texte ordinaires. Ils se distinguent simplement par le fait qu'ils respectent les règles de syntaxe du langage python et peuvent ainsi être lus et compris par l'interpréteur python.

L'objectif du TP est d'écrire des fonctions qui lisent des scripts python pour en extraire de l'information.

Ces fonctions seront testées sur le script tri-selection.py.

In [ ]:
!cat tri-selection.py
def tri(L):
    """Tri la liste L par ordre croissant."""
    n = len(L)
    for i in range(n - 1):
        j = selectMin(L, i)
        L[i], L[j] = L[j], L[i]

def selectMin (L, i):
    """Retourne l'indice k >= icontenant la plus petite valeur de L[i:]."""
    n = len(L)
    k = i
    for j in range(i + 1, n):
        k = indexMin(L, k, j)
    return k

def  indexMin(L, k, j):
    """Retourne l'indice k ou j contenant la plus petite valeur."""
    if L[j] < L[k]:
        return j
    else:
        return k


T = [5, 3, 8, 1, 44, 3, 57, 2, 91, 21]
tri(T)
print(T)

Remarque : Il n'est pas nécessaire de comprendre le code du script tri-selection pour faire le TP. Il est par contre nécessaire de connaitre les bases de la syntaxe du langage python. Pour les plus curieux, le script tri-selection permet de trier une liste d'entiers :

In [ ]:
!python3 tri-selection.py 5 3 8 1 44 3 57 2 91 21
[1, 2, 3, 3, 5, 8, 21, 44, 57, 91]

Préliminaires

Si S est une chaîne de caractères, la syntaxe python S[i:j] construit la sous-chaîne de S allant de l'indice i inclus à l'indice j exclus.

In [ ]:
S = "Bonjour tout le monde"
S[8:12]
Out[ ]:
'tout'

Cette syntaxe peut aussi être utilisée pour les listes.

Pour se faciliter la tâche on commence par écrire deux sous-fonctions.

Question 1

Écrire le code de la fonction is_def.

In [ ]:
def is_def(line):
    """ Retourne True si la ligne line est la ligne initiale
        d'une définition de fonction.
        Retourne False sinon.
    """
    ### À COMPLÉTER
    
print(is_def("def somme1(n):\n"))  # --> True
print(is_def("def somme2 (n):\n"))  # --> True
print(is_def("def somme3(n, p):\n"))  # --> True
print(is_def(" def somme4(n):\n"))  # --> False

Question 2

Écrire le code de la fonction get_name.

In [ ]:
def get_name(line):
    """ Sachant que line est la ligne initiale
        d'une définition de fonction,
        retourne le nom de cette fonction.
    """
    ### À COMPLÉTER
    
print(get_name("def somme1(n):\n"))  # --> "somme1"
print(get_name("def somme2 (n):\n"))  # --> "somme2"
print(get_name("def somme3(n, p):\n"))  # --> "somme3"

Analyse des scripts

Question 3

Écrire le code de la fonction nb_functions.

In [ ]:
def nb_functions(script):
    """ Retourne le nombre de fonctions définies dans
        le programme python script.
    """
    ### À COMPLÉTER

nb_functions("tri-selection.py")

Question 4

Écrire le code de la fonction fnames.

In [ ]:
def fnames(script):
    """ Retourne la liste des noms des fonctions définies dans
        le programme python script.
    """
    ### À COMPLÉTER

fnames("tri-selection.py")

Question 5

Écrire le code de la fonction doc.

In [ ]:
def doc(script, name):
    """ Retourne la docstring de la fonction name définie dans
        le programme python script.
    """
    ### À COMPLÉTER

doc("tri-selection.py", "selectMin")