Fonctions et méthodes

Les fonctions et les méthodes sont des moyens d'effectuer des opérations sur les objets ou de créer de nouveaux objets. La puissance d'un langage de programmation vient aussi du fait des nombreuses fonctions et méthodes mises à la dispositions de ses utilisateurs.

Utilisez la console de https://console.basthon.fr/ pour exécuter les divers exemples et exercices

Fonctions

Une fonction est un type d'objet pouvant être exécuté. Par exemple la fonction print.

C'est un objet :

>>> type(print)
<class 'builtin_function_or_method'>

On exécute l'objet en faisant suivre son nom de parenthèses :

>>> print()

L'exécution de la fonction print à produit un retour à la ligne.

De nombreuses fonctions peuvent être exécutées avec des paramètres qui sont placées les un à la suite des autres entre les parenthèses et séparés par des virgules :

nom_de_la_fonction(paramètre1, paramètre2, ..., paramètre_n)

Prenons par exemple la fonction print de python :

>>> print("coucou", "les gens", "!")
coucou les gens !

L'exécution de la fonction print avec les trois paramètres "coucou", "les gens" et "!" affichera à l'écran les 3 paramètres espacé d'un caractère (séparé par un caractère espace " ") puis ira à la ligne.

Toutes les fonctions de python sont documentées. On peut y accéder :

Affichez l'aide de la fonction print dans la console.

solution

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

Si votre fenêtre est trop petite, l'affichage peut être différent.

Paramètres d'une fonction

Important

Savoir lire la documentation d'une fonction est très important. Cela fait gagner un temps fou de pouvoir utiliser à bon escient tous les paramètres d'une fonction.

En regardant la documentation de la fonction print, on remarque que les premiers paramètres sont sans noms (value, ...) puis les paramètres ont des noms (sep, end, file, flush) suivi d'une valeur. Ce sont des paramètres qui ont une valeur par défaut (par défaut sep vaut " ").

Les paramètres sans valeurs par défaut sont obligatoires lorsque l'on appelle une fonction, les paramètres ayant une valeur par défaut sont optionnels.

On cependant bien sur utiliser, en le nommant, un paramètre ayant une valeur par défaut :

>>> print("coucou", "les gens", "!", sep="***")
coucou***les gens***!

Ordre des paramètres

Les paramètres d'une fonctions doivent être mis dans cet ordre :

  1. tous les paramètres sans valeurs par défaut dans l'ordre de la définition
  2. puis les paramètres optionnels utilisés sans nom, dans l'ordre de leurs définitions
  3. puis les paramètres optionnels utilisés avec leur nom (nom=valeur) que l'on peut les mettre dans n'importe quel ordre.

La fonction print n'a pas de nombre déterminé de paramètres sans valeurs par défaut (il y a un ...), la règle 2 ne s'applique donc pas pour print.

Expérimentons ça sur un exercice.

La classe int a pour définition int(x, base=10) si x est une chaîne de caractère.

Peut-on écrire :

  1. int("12") ?
  2. int(base=2) ?
  3. int("12", base=8) ?
  4. int("12", 8) ?
  5. int(base=8, "12") ?

solution

  1. oui
  2. non, la règle 1 n'est pas satisfaite
  3. oui
  4. oui
  5. non, la règle 2 (et 1) n'est pas satisfaite

Paramètres entre crochets dans une définition

On pourra parfois voir des paramètres entre crochet dans la définition de fonction. Par exemple : complex([real[, imag]]) (documentation de la classe complex).

C'est un raccourci d'écriture, ce n'est pas une structure python. Cela signifie que l'on peut écrire la définition avec ou sans les crochets. Ceci permet d'écrire plusieurs définitions possible en une seule fois. Ainsi la définition complex([real[, imag]]) correspond à trois écritures possibles :

  1. crochets extérieurs absents : complex()

    >>> complex()
    0j

    On vient de créer le complexe nul.

  2. crochets extérieurs présents : complex(real[, imag]). On a à nouveau deux choix :

    1. crochets absents : complex(real)

      >>> complex(1)
      (1+0j)
    2. crochets présents : complex(real, imag)

      >>> complex(1, 2)
      (1+2j)

Fonctions usuelles

Certaines sont plus utiles que d'autres. Nous allons en citer certaines, parmi les plus utilisées.

Fonction print

Affiche à l'écran ses paramètres.

Fonction type

Donne le type d'un objet.

On l'a utilisée dans la partie objets types et types d'objets.

Fonction len

Rend le nombre d'éléments d'une chaîne de caractères (et plus généralement d'un conteneur que l'on verra plus tard).

Quel est le nombre de caractères du mot "anticonstitutionnellement" ?

solution

>>> len("anticonstitutionnellement")
25

Nom d'une classe comme fonction

int, float, complex, str et bool permettent de créer des objets du nom du type.

On a déjà vu cette possibilité dans la partie objets types et types d'objets, c'est très utile pour changer un objet de classe. Mais utilisons ce qu'on a vu maintenant pour aller plus loin :

En utilisant int() qui crée des entiers, trouvez la représentation décimale du nombre binaire : 1001100011

solution

On utilise le paramètre base de la classe int :

>>> int("1001100011", base=2)
611

Allez, un dernier pour la route :

En utilisant le fait que la fonction len(chaîne_de_caractères) donne le nombre de caractères de la chaîne (par exemple len("abc") rend 3), et que l'exposant eb python s'écrit ** (par exemple 2**8 rend 256) donnez le nombre de chiffre du 27ème nombre de Mersenne premier.

solution

>>> len(str(2 ** 44497 - 1))
13395

Fonction input

Permet de demander une chaîne de caractère à un utilisateur. Par exemple :

>>> x = input()
23
>>> x
'23'

On demande à l'utilisateur de taper quelque chose puis d'appuyer sur la touche entrée. Ce qu'à taper l'utilisateur est rendu sous la forme d'une chaîne de caractère.

Tout ce qui vient de l'utilisateur est une chaîne de caractère. Si l'on veut que ce soit un nombre par exemple, il faut le convertir. Comme par exemple : i = int(input()) qui converti en entier le résultat de la fonction input.

Méthodes

Les méthodes sont un autre moyen d'agir sur un objet. On les utilise de cette façon :

objet.méthode(paramètre 1, paramètre 2, ..., paramètre n)

On applique méthode à objet en utilisant les paramètres de la méthode.

Utilisation des méthodes d'une classe

Supposons que l'on ait un objet de nom objet et une méthode nommée méthode associée au type de l'objet de nom objet.

L'instruction objet.méthode() exécutera la méthode méthode pour l'objet objet. Si la méthode nécessite des paramètres, ils seront placés à l'intérieur de la parenthèse, séparés par des virgules. Par exemple objet.méthode(paramètre_1, paramètre_2).

Une méthode ne s'utilise jamais seule. Elle s'applique à ce qu'il y a à gauche d'elle.

Prenez le temps de regarder les différentes méthodes des classes de base de python. Souvent elle vous permettent de faire rapidement une opération compliquée. C'est en particulier vrai pour les chaînes de caractères et les listes.

Méthodes des chaînes de caractères

Chaque classe vient avec des méthodes. Si les nombre et booléens ont peu de méthodes, les chaines de caractères par exemple en ont tout un tas.

Essayons de les apprendre avec ces petits exercices :

Transformez le 27ème nombre de Mersenne en une chaîne de caractère

solution

>>> x = str(2 ** 44497 - 1)

En utilisant la méthode count, comptez le nombre de 0 du 27ème nombre de Mersenne premier.

solution

Dans un interpréteur :

>>> x.count("0")
1332

En utilisant la méthode replace, changez les 2 en 7 dans le 27ème nombre de Mersenne premier.

solution

Dans un interpréteur :

>>> y = int(x.replace("2", "7"))

Avec le mot "choucroute garnie" et les méthodes count, index et rindex :

  • combien y a-t-il de "ou" ?
  • quel est l'indice du premier "e" ?
  • quel est l'indice du dernier "e" ?

solution

>>> mot.count("ou")
2
>>> mot.index("e")
9
>>> mot.rindex("e")
16

On peut chaîner les méthodes, la sortie d'une méthode devenant l'entrée de la prochaine. Par exemple, avec 2 méthodes :

objet.méthode_1().méthode_2()

Signifie que méthode2() est appliquée à l'objet résultat de objet.méthode_1()

Et avec $n$ méthodes :

objet.méthode_1().méthode_2(). ... .méthode_n()

Signifie que méthode_n() est appliquée au résultat de objet.méthode_1(). ... .méthode_n-1()

Que fait :

str(2 ** 44497 - 1).replace("2","x").replace("7","2").replace("x","7")

solution

Il est aisé de comprendre ce que ça fait en procédant de droite à gauche :

  1. replace("x","7") est appliqué à ce qui est à sa gauche donc str(2 ** 44497 - 1).replace("2","x").replace("7","2")
  2. replace("7","2") est appliqué à ce qui est à sa gauche donc str(2 ** 44497 - 1).replace("2","x")
  3. replace("2","x") est appliqué à ce qui est à sa gauche donc str(2 ** 44497 - 1)

En remontant les opérations précédentes :

  1. le résultat de str(2 ** 44497 - 1) sera une chaîne de caractère représentant le 27ème nombre premier de Mersenne
  2. str(2 ** 44497 - 1).replace("2","x") on a remplacé les 2 par des "x" dans la chaîne précédente
  3. str(2 ** 44497 - 1).replace("2","x").replace("7","2") on a remplacé les 7 par des 2 de la chaîne précédente
  4. str(2 ** 44497 - 1).replace("2","x").replace("7","2").replace("x","7") on a remplacé les "x" par des 2 dans la chaîne précédente

On a donc au final échangé les 2 et les 7 du 27ème nombre premier de Mersenne

Fonctions vs. méthodes

Ne confondez pas fonctions et méthodes. Une fonction s'exécute toute seule alors qu'une méthode a besoin d'un objet sur lequel elle s'applique (celui avant le .). Vous pouvez voir ça comme un 1er paramètre indispensable à l'exécution d'une méthode. Considérez le programme suivant :

>>> ma_chaîne = "coucou !"
>>> en_majuscules = ma_chaîne.upper()
>>> print(en_majuscules)
COUCOU !

La première ligne crée une chaîne de caractères. La seconde instruction est une méthode (upper) qui s'applique à l'objet de nom ma_chaîne et qui n'a pas de paramètre.

On peut voir les méthodes comme des fonctions définies dans l'espace de nom de l'objet.

Attributs d'une classe

C'est plus rare, mais certaines classes possèdent des également des attributs en plus des méthodes. Ce sont des valeurs associées à l'objet.

Par exemple les objets de la classe complex qui possède les attributs real et imag pour rendre la partie réelle et imaginaire d'un complexe.

>>> (1+2j).real
1.0
>>> (1+2j).imag
2.0