QCM : Définition et appel de fonctions en Python

[enonce]
Ce QCM porte sur la définition et l'appel de fonctions en Python : mot-clé def, paramètres, instruction return et différence avec print. Choisissez la bonne réponse parmi les quatre propositions.
[/enonce]

[etape]
Quel mot-clé Python permet de définir une nouvelle fonction ?
[qcm]
[option]function[/option]
[option]fun[/option]
[option correct="true"]def[/option]
[option]return[/option]
[reponse statut="correct"]Exact !
En Python, on utilise le mot-clé def (abréviation de define) pour définir une nouvelle fonction, suivi du nom de la fonction et de ses paramètres.[/reponse]
[reponse motif="function"]Non.
function est utilisé dans d'autres langages (JavaScript par exemple), mais pas en Python. Python utilise un mot-clé plus court.[/reponse]
[reponse motif="fun"]Non.
fun n'existe pas en Python. Le mot-clé est def (abréviation de define).[/reponse]
[reponse motif="return"]Non.
return sert à renvoyer une valeur à l'intérieur d'une fonction, mais pas à la définir. C'est un autre mot-clé qui crée la fonction.[/reponse]
[reponse statut="incorrect"]Non.
Syntaxe : def nom_fonction(paramètres) : suivi du corps indenté.[/reponse]
[/qcm]
[/etape]

[etape]
Quelle est la différence principale entre return et print dans une fonction Python ?
[qcm]
[option]Il n'y a aucune différence[/option]
[option correct="true"]return renvoie une valeur au programme appelant ; print l'affiche à l'écran[/option]
[option]return affiche ; print renvoie[/option]
[option]return est utilisé uniquement avec des entiers ; print avec des chaînes[/option]
[reponse statut="correct"]Bonne réponse !
return met fin à la fonction et transmet une valeur au programme qui l'a appelée (valeur réutilisable). print se contente d'afficher à l'écran, sans rien renvoyer.[/reponse]
[reponse motif="Il n'y a aucune différence"]Non.
La différence est fondamentale : return renvoie une valeur utilisable, print se contente d'afficher. Un print ne peut pas être stocké dans une variable pour être réutilisé.[/reponse]
[reponse motif="return affiche ; print renvoie"]Non.
C'est l'inverse. print affiche à l'écran ; return renvoie une valeur.[/reponse]
[reponse motif="return est utilisé uniquement avec des entiers ; print avec des chaînes"]Non.
Les deux fonctionnent avec tous les types (int, float, str, bool, listes, etc.). Le type n'est pas le critère de distinction.[/reponse]
[reponse statut="incorrect"]Non.
Retenir : print affiche, return renvoie. Seule la valeur renvoyée par return peut être stockée et réutilisée.[/reponse]
[/qcm]
[/etape]

[etape]
On définit la fonction Python ci-dessous :

def f(x) :
    return x + 1

Que vaut f(5) ?
[qcm]
[option]$5$[/option]
[option]$1$[/option]
[option correct="true"]$6$[/option]
[option]Rien (la fonction n'affiche rien)[/option]
[reponse statut="correct"]Bravo !
Lors de l'appel f(5), le paramètre x reçoit la valeur $5$. La fonction renvoie alors $x + 1 = 5 + 1 = 6$.[/reponse]
[reponse motif="$5$"]Non.
$5$ est la valeur passée en paramètre, pas la valeur renvoyée. La fonction effectue une opération : elle ajoute $1$.[/reponse]
[reponse motif="$1$"]Non.
$1$ est la constante ajoutée, pas le résultat. Il faut faire la somme $x + 1$ avec $x = 5$.[/reponse]
[reponse motif="Rien (la fonction n'affiche rien)"]Non.
La fonction ne fait pas de print, mais elle renvoie une valeur grâce à return. f(5) produit donc bien une valeur utilisable.[/reponse]
[reponse statut="incorrect"]Non.
Remplacer x par la valeur passée en paramètre, puis appliquer la formule du return.[/reponse]
[/qcm]
[/etape]

[etape]
On considère la fonction Python ci-dessous :

def saluer() :
    print("Bonjour")

Laquelle des instructions suivantes appelle correctement cette fonction ?
[qcm]
[option]saluer[/option]
[option]def saluer()[/option]
[option correct="true"]saluer()[/option]
[option]call saluer()[/option]
[reponse statut="correct"]Exactement !
Pour appeler une fonction sans argument, on écrit son nom suivi de parenthèses vides. Les parenthèses sont obligatoires, même s'il n'y a pas de paramètre.[/reponse]
[reponse motif="saluer"]Non.
Sans les parenthèses, on ne lance pas la fonction : on y fait simplement référence. Les parenthèses sont nécessaires pour exécuter la fonction.[/reponse]
[reponse motif="def saluer()"]Non.
def sert à définir la fonction, pas à l'appeler. Une fois définie, on l'appelle en écrivant simplement son nom suivi de parenthèses.[/reponse]
[reponse motif="call saluer()"]Non.
Le mot-clé call n'existe pas en Python. Pour appeler une fonction, il suffit d'écrire son nom suivi de parenthèses.[/reponse]
[reponse statut="incorrect"]Non.
Appel d'une fonction : nom_fonction(arguments). Les parenthèses sont obligatoires, même vides.[/reponse]
[/qcm]
[/etape]

[etape]
On exécute le programme Python ci-dessous :

def f(x) :
    print(x * x)

a = f(3)
print(a)

Que s'affiche-t-il à l'écran (en deux lignes) ?
[qcm]
[option]9 puis 9[/option]
[option]9 puis 3[/option]
[option correct="true"]9 puis None[/option]
[option]Une erreur est provoquée[/option]
[reponse statut="correct"]Parfait !
La fonction f affiche $9$ (avec print) mais ne renvoie rien avec return. Elle renvoie donc la valeur spéciale None. La variable a contient None, et print(a) l'affiche.[/reponse]
[reponse motif="9 puis 9"]Non.
print affiche à l'écran mais ne renvoie pas la valeur : la fonction f ne renvoie rien. Par conséquent, a ne contient pas $9$.[/reponse]
[reponse motif="9 puis 3"]Non.
$3$ est la valeur du paramètre, pas celle renvoyée par la fonction. La fonction ne renvoie d'ailleurs rien explicitement.[/reponse]
[reponse motif="Une erreur est provoquée"]Non.
On peut parfaitement affecter à une variable le résultat d'une fonction sans return : elle contiendra simplement None.[/reponse]
[reponse statut="incorrect"]Non.
Distinction importante : une fonction sans return renvoie None, même si elle utilise print.[/reponse]
[/qcm]
[/etape]

[etape]
On définit la fonction Python ci-dessous :

def moyenne(a, b, c) :
    return (a + b + c) / 3

Que vaut moyenne(4, 6, 8) ?
[qcm]
[option]$18$[/option]
[option correct="true"]$6.0$[/option]
[option]$6$[/option]
[option]$4.0$[/option]
[reponse statut="correct"]C'est bien ça !
$(4 + 6 + 8) / 3 = 18 / 3 = 6.0$. L'opérateur / renvoie toujours un float en Python, même si la division tombe juste.[/reponse]
[reponse motif="$18$"]Non.
$18$ est le total des trois nombres, pas la moyenne. Il faut diviser par $3$ (le nombre de valeurs).[/reponse]
[reponse motif="$6$"]Non.
La valeur est juste, mais pas exactement le type attendu : Python affiche 6.0 (avec un point décimal) car / renvoie toujours un float.[/reponse]
[reponse motif="$4.0$"]Non.
$4$ est le plus petit des trois nombres, pas leur moyenne. La moyenne est plus grande, elle tombe « au milieu » des valeurs.[/reponse]
[reponse statut="incorrect"]Non.
Moyenne = somme divisée par le nombre de valeurs. Attention : / en Python renvoie un float.[/reponse]
[/qcm]
[/etape]

Vrai/Faux : return, print et fonctions par morceaux (niveau 2)

[enonce]
Pour chaque affirmation suivante sur return, print et les fonctions mathématiques Python, indiquez si elle est Vraie ou Fausse.
[/enonce]

[etape]
On considère le programme Python ci-dessous :

def carre(x) :
    print(x*x)

a = carre(5)
print(a)

Affirmation : Ce programme affiche $25$ puis $25$.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Bonne réponse !
La fonction carre affiche $x \times x$ mais ne renvoie rien (pas de return).
a reçoit donc la valeur spéciale None. Le programme affiche $25$ puis None.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Il ne faut pas confondre print (qui affiche) et return (qui renvoie).
La fonction n'ayant pas de return, elle renvoie None. Le programme affiche $25$ (par le print interne) puis None (pour print(a)).[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. Sans return, la fonction renvoie None. Le programme affiche $25$ puis None.
[/solution]
[/etape]

[etape]
On considère le programme Python ci-dessous :

def carre(x) :
    return x*x

a = carre(5)
print(a + 1)

Affirmation : Ce programme affiche $26$.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Exactement !
carre(5) renvoie $25$. Cette valeur est stockée dans a, puis on affiche $a + 1 = 26$.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : avec return, la valeur renvoyée peut être utilisée dans un calcul.
a reçoit $5 \times 5 = 25$ ; on affiche ensuite $25 + 1 = 26$.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. carre(5) renvoie $25$, donc a vaut $25$ et a + 1 vaut $26$.
[/solution]
[/etape]

[etape]
On considère la fonction moyenne ci-dessous :

def moyenne(a, b, c) :
    m = (a + b + c) / 3
    return m

Affirmation : L'appel moyenne(10, 12, 14) renvoie $12{,}0$.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Bravo !
$(10 + 12 + 14) / 3 = 36 / 3 = 12$.
L'opérateur / renvoie toujours un float, donc le résultat est $12{,}0$ (avec un point décimal).[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : / produit un float même quand le résultat est un entier.
$(10 + 12 + 14) / 3 = 12{,}0$ — la forme est décimale (float), pas entière.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. La somme vaut $36$ ; divisée par $3$, elle donne $12{,}0$ (car / renvoie un float).
[/solution]
[/etape]

[etape]
On considère la fonction Python ci-dessous :

def f(x) :
    if x <= 0 :
        return -x + 1
    else :
        return 3*x + 1

Affirmation : L'appel f(5) renvoie $16$.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Tu as raison !
$5 > 0$, donc la fonction utilise la branche else et renvoie $3 \times 5 + 1 = 16$.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Il faut bien identifier la branche choisie.
Comme $x = 5 > 0$, on prend la branche else et on calcule $3 \times 5 + 1 = 16$.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. $5 > 0$, donc f(5) renvoie $3 \times 5 + 1 = 16$.
[/solution]
[/etape]

[etape]
On considère la fonction Python ci-dessous :

def f(x) :
    if x <= 0 :
        return -x + 1
    else :
        return 3*x + 1

Affirmation : L'appel f(-3) renvoie $-8$.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Correct !
$-3 \leqslant 0$, donc la fonction utilise la branche if et renvoie $-(-3) + 1 = 3 + 1 = 4$.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Attention au signe : $-x$ avec $x = -3$ donne $-(-3) = 3$ (et non $-3$).
Comme $-3 \leqslant 0$, on prend la première branche : $-x + 1 = -(-3) + 1 = 4$.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. $-3 \leqslant 0$, donc f(-3) renvoie $-(-3) + 1 = 4$, et non $-8$.
[/solution]
[/etape]

[etape]
On considère la fonction Python ci-dessous :

def test(x) :
    return x > 10

print(test(7))

Affirmation : Ce programme affiche True.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]C'est bien ça !
Une fonction peut renvoyer un booléen. L'expression x > 10 vaut False car $7 < 10$, et c'est cette valeur qui est affichée.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Attention à la valeur du booléen : return renvoie le résultat de la comparaison x > 10.
Comparer $7$ et $10$ pour déterminer ce qui est affiché.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. x > 10 est un booléen ; test(7) renvoie False (car $7 < 10$), donc le programme affiche False et non True.
[/solution]
[/etape]

Vrai/Faux : Définir une fonction Python (niveau 1)

[enonce]
Pour chaque affirmation suivante sur la définition et l'appel d'une fonction Python, indiquez si elle est Vraie ou Fausse.
[/enonce]

[etape]
Affirmation : En Python, on définit une fonction à l'aide du mot-clé def.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Bonne réponse !
Le mot-clé def introduit la définition d'une fonction, suivi du nom, des paramètres entre parenthèses et de deux-points.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : toute définition de fonction Python commence par def suivi du nom, des paramètres entre parenthèses et de deux-points.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. La syntaxe est def nom(paramètres) : suivie d'un bloc indenté.
[/solution]
[/etape]

[etape]
Affirmation : Une fonction Python doit obligatoirement comporter une instruction return.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Bravo !
L'instruction return est facultative. Une fonction peut simplement exécuter des actions (par exemple afficher un message avec print) sans rien renvoyer.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Il ne faut pas confondre retourner une valeur (avec return) et exécuter des actions.
Une fonction sans return est autorisée : elle renvoie alors la valeur spéciale None.[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. return est facultatif. Une fonction sans return renvoie None par défaut.
[/solution]
[/etape]

[etape]
Affirmation : Une fonction Python peut recevoir plusieurs paramètres, séparés par des virgules.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]Exactement !
Par exemple, def moyenne(a, b, c) : définit une fonction à trois paramètres.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : une fonction peut avoir $0$, $1$ ou plusieurs paramètres.
Les paramètres sont placés entre parenthèses et séparés par des virgules, par exemple def f(x, y) :.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. On peut définir autant de paramètres que nécessaire, séparés par des virgules.
[/solution]
[/etape]

[etape]
On considère le programme Python ci-dessous :

def double(x) :
    return 2*x

print(double(7))

Affirmation : Ce programme affiche $14$.

[qcm]
[option correct="true"]Vrai[/option]
[option]Faux[/option]
[reponse statut="correct"]C'est bien ça !
L'appel double(7) exécute la fonction avec x = 7 et renvoie $2 \times 7 = 14$, qui est ensuite affiché.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est vraie.
Rappel : un appel de fonction remplace x par la valeur passée en argument.
double(7) calcule $2 \times 7 = 14$ et renvoie $14$, que print affiche.[/reponse]
[/qcm]

[solution]
Cette affirmation est vraie. double(7) renvoie $2 \times 7 = 14$, qui est affiché.
[/solution]
[/etape]

[etape]
Affirmation : Pour appeler une fonction sans paramètre, on peut omettre les parenthèses.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Tu as raison !
Les parenthèses sont obligatoires lors de l'appel d'une fonction, même sans argument (parenthèses vides).
Par exemple, pour appeler afficher, on écrit afficher() et non afficher.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Le piège est d'oublier les parenthèses pour les fonctions sans paramètre.
Sans parenthèses, Python ne déclenche pas l'exécution : il se contente de référencer la fonction. L'appel nécessite toujours ().[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. Les parenthèses sont obligatoires pour appeler une fonction, même sans argument : ma_fonction().
[/solution]
[/etape]

[etape]
On considère le programme Python ci-dessous :

def ajoute(x, y) :
    return x + y

a = ajoute(4, 3)
print(a)

Affirmation : Ce programme affiche $43$.

[qcm]
[option]Vrai[/option]
[option correct="true"]Faux[/option]
[reponse statut="correct"]Correct !
Les arguments 4 et 3 sont affectés aux paramètres x et y, puis la fonction renvoie leur somme. Le programme affiche donc $7$, et non $43$.[/reponse]
[reponse statut="incorrect"]Non, cette affirmation est fausse.
Attention : la fonction calcule x + y, une addition, pas une mise côte à côte des chiffres.
Reprendre le calcul de ajoute(4, 3).[/reponse]
[/qcm]

[solution]
Cette affirmation est fausse. ajoute(4, 3) renvoie $4 + 3 = 7$ ; la variable a vaut $7$, donc le programme affiche $7$ et non $43$.
[/solution]
[/etape]