Éléments Essentiels de La Programmation en Python: Module 4: Dans Ce Module, Vous Découvrirez
Éléments Essentiels de La Programmation en Python: Module 4: Dans Ce Module, Vous Découvrirez
Éléments Essentiels de La Programmation en Python: Module 4: Dans Ce Module, Vous Découvrirez
Lorsque vous souhaitez que certaines données soient imprimées sur la console, vous utilisez print () . Lorsque vous
souhaitez lire la valeur d'une variable, vous utilisez input () , couplé à int () ou float () .
Vous avez également utilisé certaines méthodes, qui sont en fait des fonctions, mais déclarées de manière très spécifique.
Vous allez maintenant apprendre à écrire vos propres fonctions et à les utiliser. Nous allons écrire plusieurs fonctions
ensemble, du très simple au plutôt complexe, ce qui nécessitera votre concentration et votre attention.
Il arrive souvent qu'un morceau de code particulier soit répété plusieurs fois dans votre programme. Il est répété soit
littéralement, soit avec seulement quelques modifications mineures, consistant en l'utilisation d'autres variables dans le
même algorithme. Il arrive également qu'un programmeur ne puisse pas résister à la simplification du travail et commence à
cloner de tels morceaux de code à l'aide des opérations de presse-papiers et de copier-coller.
Cela pourrait devenir très frustrant quand il s'avère soudainement qu'il y avait une erreur dans le code cloné. Le
programmeur aura beaucoup de corvée pour trouver tous les endroits qui nécessitent des corrections. Il existe également un
risque élevé que les corrections provoquent des erreurs.
Nous pouvons maintenant définir la première condition qui peut vous aider à décider quand commencer à écrire vos propres
fonctions : si un fragment particulier du code commence à apparaître à plusieurs endroits, envisagez la possibilité de
l'isoler sous la forme d'une fonction invoquée depuis les points où le code d'origine a été placé auparavant.
Il peut arriver que l'algorithme que vous allez implémenter soit si complexe que votre code commence à se développer de
manière incontrôlée, et soudain vous remarquez que vous n'êtes plus en mesure de le parcourir si facilement.
Vous pouvez essayer de résoudre le problème en commentant le code en détail, mais vous constaterez rapidement que cela
aggrave considérablement votre situation - trop de commentaires rendent le code plus volumineux et plus difficile à
lire. Certains disent qu'une fonction bien écrite doit être considérée d'un seul coup d'œil.
Un bon développeur attentif divise le code (ou plus précisément : le problème) en morceaux bien isolés et les code chacun
sous la forme d'une fonction.
Cela simplifie considérablement le travail du programme, car chaque morceau de code peut être codé séparément et testé
séparément. Le processus décrit ici est souvent appelé décomposition.
Nous pouvons maintenant énoncer la deuxième condition : si un morceau de code devient si volumineux que sa lecture
et sa sous-estimation peuvent causer un problème, envisagez de le diviser en problèmes distincts et plus petits et
implémentez chacun d'eux sous la forme d'une fonction distincte.
Cette décomposition se poursuit jusqu'à ce que vous obteniez un ensemble de fonctions courtes, faciles à comprendre et à
tester.
Décomposition
Il arrive souvent que le problème soit si important et complexe qu'il ne puisse pas être attribué à un seul développeur, et
qu'une équipe de développeurs doit y travailler. Le problème doit être réparti entre plusieurs développeurs de manière à
garantir leur coopération efficace et transparente.
Il semble inconcevable que plus d'un programmeur écrive le même morceau de code en même temps, donc le travail
doit être réparti entre tous les membres de l'équipe.
Ce type de décomposition a un objectif différent de celui décrit précédemment - il ne s'agit pas seulement de partager le
travail, mais aussi de partager la responsabilité entre de nombreux développeurs.
Chacun d'eux écrit un ensemble de fonctions clairement définies et décrites, qui une fois combinées dans le module
(nous vous en parlerons un peu plus tard) donnera le produit final.
Cela nous amène directement à la troisième condition : si vous allez diviser le travail entre plusieurs programmeurs,
décomposez le problème pour permettre au produit d'être implémenté sous la forme d'un ensemble de
fonctions écrites séparément regroupées dans différents modules.
a = int(input())
b = int(input())
c = int(input())
C'est assez simple, mais nous voulons seulement que ce soit un exemple de transformation d'une partie répétitive
d'un code en fonction.
Les messages envoyés à la console par la fonction print() sont toujours les mêmes. Bien sûr, il n'y a rien de vraiment
mauvais dans un tel code, mais essayez d'imaginer ce que vous auriez à faire si votre patron vous demandait de
changer le message pour le rendre plus poli, par exemple, pour le commencer par la phrase "Please," .
Il semble que vous deviez passer du temps à changer toutes les occurrences du message (vous utiliseriez un presse-
papiers, bien sûr, mais cela ne vous faciliterait pas la vie). Il est évident que vous commettriez probablement des erreurs
pendant le processus de modification, et vous (et votre patron) seriez un peu frustré.
Est-il possible de séparer une partie aussi reproductible du code, de la nommer et de la rendre réutilisable ? Cela
signifierait qu'un changement effectué une fois au même endroit serait propagé à tous les endroits où il est
utilisé.
Bien sûr, un tel code ne devrait fonctionner que lorsqu'il est explicitement lancé.
Oui c'est possible. C'est exactement à cela que servent les fonctions.
def functionName():
functionBody
Nous sommes prêts à définir notre fonction d’invite . Nous allons le nommer message - le voici :
def message():
print("Enter a value: ")
La fonction est extrêmement simple, mais entièrement utilisable. Nous l'avons nommé message , mais vous pouvez
l'étiqueter selon votre goût. Utilisons-le.
def message():
print("Enter a value: ")
Remarque : nous n'utilisons pas du tout la fonction - il n'y a aucune invocation à l'intérieur du code.
We start here.
We end here.
Cela signifie que Python lit les définitions de la fonction et s'en souvient, mais ne lancera aucune d'entre elles sans votre
permission.
Nous avons modifié le code maintenant - nous avons inséré l’invocation de la fonction entre les messages de début et
de fin :
def message():
print("Enter a value: ")
We start here.
Enter a value:
We end here.
• Lorsque vous appelez une fonction, Python se souvient de l'endroit où cela s'est produit et saute dans la fonction
invoquée ;
• Le corps de la fonction est alors exécuté ;
• Atteindre la fin de la fonction force Python à retourner à l'endroit directement après le point d'invocation.
N'oubliez pas - Python lit votre code de haut en bas. Il ne va pas regarder de l'avant pour trouver une fonction que vous avez
oublié de mettre au bon endroit ("droit" signifie "avant l'invocation".)
def message():
print("Enter a value: ")
Nous avons déplacé la fonction à la fin du code. Python est-il capable de le trouver lorsque l'exécution atteint l’invocation ?
N'essayez pas de forcer Python à rechercher des fonctions que vous n'avez pas fournies au bon moment.
Vous ne devez pas avoir une fonction et une variable du même nom.
def message():
print("Enter a value: ")
message = 1
L'attribution d'une valeur au message de nom fait que Python oublie son rôle précédent. La fonction nommée message
devient indisponible.
Heureusement, vous êtes libre de mélanger votre code avec des fonctions - vous n'êtes pas obligé de mettre toutes vos
fonctions en haut de votre fichier source.
def message():
print("Enter a value: ")
message()
Cela peut sembler étrange, mais c'est tout à fait correct et fonctionne comme prévu.
Revenons à notre exemple principal et utilisons la fonction pour le bon travail, comme ici:
def message():
print("Enter a value: ")
message()
a = int(input())
message()
b = int(input())
message()
c = int(input())
La modification du message d'invite est maintenant facile et claire - vous pouvez le faire en changeant le code en un seul
endroit - à l'intérieur du corps de la fonction.
• Fonctions intégrées qui font partie intégrante de Python (comme la fonction print() ). Vous pouvez voir une liste
complète des fonctions intégrées de Python sur https://docs.python.org/3/library/functions.html .
• Ceux qui proviennent de modules préinstallés (vous en apprendrez plus à leur sujet dans le module 5 de ce cours)
• Fonctions définies par l'utilisateur qui sont écrites par les utilisateurs pour les utilisateurs - vous pouvez écrire vos
propres fonctions et les utiliser librement dans votre code,
• Les fonctions lambda (vous les découvrirez dans le module 6 de ce cours.)
3. Vous pouvez définir votre propre fonction à l'aide du mot - clé def et de la syntaxe suivante:
Vous pouvez définir une fonction qui ne prend aucun argument, par exemple :
Vous pouvez également définir une fonction qui accepte des arguments, tout comme la fonction à un paramètre ci-dessous :
Nous vous en dirons plus sur les fonctions paramétrées dans la section suivante. Ne t'inquiète pas.
Exercice 1
Vérifier
Exercice 2
Que se passe-t-il lorsque vous essayez d'appeler une fonction avant de la définir ? Exemple :
hi ()
def hi():
print("hi!")
Vérifier
Exercice 3
def hi():
print("hi")
hi(5)
Vérifier
Fonctions paramètrées
La pleine puissance de la fonction se révèle lorsqu'elle peut être équipée d'une interface capable d'accepter les données
fournies par l'invocateur. Ces données peuvent modifier le comportement de la fonction, la rendant plus flexible et adaptable
aux conditions changeantes.
Un paramètre est en fait une variable, mais deux facteurs importants rendent les paramètres différents et spéciaux:
• les paramètres n'existent qu'à l'intérieur des fonctions dans lesquelles ils ont été définis, et le seul endroit où le
paramètre peut être défini est un espace entre une paire de parenthèses dans l'instruction def ;
• l'attribution d'une valeur au paramètre se fait au moment de l'appel de la fonction, en spécifiant l'argument
correspondant.
def function(parameter):
###
N'oubliez pas:
• les paramètres vivent à l'intérieur des fonctions (c'est leur environnement naturel)
• les arguments existent en dehors des fonctions et sont porteurs de valeurs passées aux paramètres
correspondants.
Il existe une frontière claire et sans ambiguïté entre ces deux mondes.
Enrichissons la fonction ci-dessus avec un seul paramètre - nous allons l'utiliser pour montrer à l'utilisateur le numéro d'une
valeur demandée par la fonction.
Nous devons reconstruire la déclaration def - voici à quoi cela ressemble maintenant:
def message(number):
###
La définition spécifie que notre fonction fonctionne sur un seul paramètre nommé number. Vous pouvez l'utiliser comme
variable ordinaire, mais uniquement à l'intérieur de la fonction - elle n'est visible nulle part ailleurs.
Améliorons maintenant le corps de la fonction:
def message(number):
print("Enter a number:", number)
Nous avons utilisé le paramètre. Remarque: nous n'avons attribué aucune valeur au paramètre. Est-ce correct?
Oui, ça l'est.
N'oubliez pas: la spécification d'un ou plusieurs paramètres dans la définition d'une fonction est également une
exigence, et vous devez la remplir lors de l'appel. Vous devez fournir autant d'arguments qu'il y a de paramètres définis.
message(1)
Pouvez-vous voir comment cela fonctionne? La valeur de l'argument utilisé lors de l'appel (1) a été transmise à la
fonction, définissant la valeur initiale du paramètre nommé number .
Il est légal et possible d'avoir une variable nommée de la même manière qu'un paramètre de fonction.
def message(number):
print("Enter a number:", number)
number = 1234
message(1)
print(number)
Le paramètre nommé number est une entité complètement différente de la variable nommée number .
1234
Une fonction peut avoir autant de paramètres que vous le souhaitez, mais plus vous en avez, plus il est difficile de
mémoriser leurs rôles et leurs objectifs.
C'est ici:
message("telephone", 11)
message("price", 5)
message("number", "number")
Exécutez le code, modifiez-le, ajoutez plus de paramètres et voyez comment cela affecte la sortie.
Vous l'avez déjà utilisé, mais Python peut offrir beaucoup plus. Nous allons vous en parler maintenant.
print(a, b, c)
myFunction(1, 2, 3)
Remarque: le passage de paramètres positionnels est intuitivement utilisé par les gens dans de nombreuses occasions
sociales. Par exemple, il peut être généralement admis que lorsque nous nous présentons, nous mentionnons nos
prénoms avant notre nom de famille, par exemple, "Mon nom est John Doe".
Implémentons cette coutume sociale en Python. La fonction suivante sera chargée de présenter quelqu'un:
introduction("Luke", "Skywalker")
introduction("Jesse", "Quick")
introduction("Clark", "Kent")
Imaginez maintenant que la même fonction soit utilisée en Hongrie. Dans ce cas, le code ressemblerait à ceci:
def introduction(firstName, lastName):
introduction("Skywalker", "Luke")
introduction("Quick", "Jesse")
introduction("Kent", "Clark")
Exécutez le code pour voir si vous étiez ici aussi. Êtes-vous surpris?
Le concept est clair - les valeurs transmises aux paramètres sont précédées du nom des paramètres cibles, suivi du
signe =.
La position n'a pas d'importance ici - la valeur de chaque argument connaît sa destination sur la base du nom utilisé.
Vous devriez pouvoir prédire la sortie. Exécutez le code pour vérifier si vous aviez raison.
introduction(surname="Skywalker", firstName="Luke")
Essayez-le vous-même.
adding(1, 2, 3)
affichera :
1 + 2 + 3 = 6
C'était - comme vous pouvez le soupçonner - un pur exemple de passage d'arguments positionnels.
Bien sûr, vous pouvez remplacer une telle invocation par une variante purement mot-clé, comme celle-ci :
adding(c = 1, a = 2, b = 3)
2 + 3 + 1 = 6
adding(3, c = 1, b = 2)
Analysons-le:
• l'argument (3) pour le paramètre a est passé en utilisant la manière positionnelle ;
• les arguments pour c et b sont spécifiés comme mots-clés.
Voici ce que vous verrez dans la console :
3 + 2 + 1 = 6
Soyez prudent et méfiez-vous des erreurs. Si vous essayez de passer plusieurs valeurs à un seul argument, vous
n'obtiendrez qu'une erreur d'exécution.
Regardez l'invocation ci-dessous - il semble que nous ayons essayé de définir a deux fois :
adding(3, a = 1, b = 2)
Réponse de Python :
Regardez le snipet ci-dessous. Un code comme celui-ci est tout à fait correct, mais cela n'a pas beaucoup de sens :
adding(4, 3, c = 2)
Tout va bien, mais laisser dans un seul mot-clé semble un peu bizarre - qu'en pensez-vous?
Ils disent que le nom de famille anglais le plus populaire est Smith. Essayons de prendre cela en compte.
La valeur du paramètre par défaut est définie à l'aide d'une syntaxe claire et illustrée :
Vous n'avez qu'à étendre le nom du paramètre avec le signe =, suivi de la valeur par défaut.
introduction("James", "Doe")
Et ? Tout se ressemble, mais lorsque vous invoquez la fonction d'une manière qui semble un peu suspecte à première
vue, comme ceci :
introduction("Henry")
ou ceci:
introduction(firstName="William")
il n'y aura pas d'erreur et les deux appels réussiront, tandis que la console affichera la sortie suivante :
Vous pouvez aller plus loin si c'est utile. Les deux paramètres ont maintenant leurs valeurs par défaut, regardez le code
ci-dessous:
introduction()
Et c'est la sortie attendue :
introduction(lastName="Hopkins")
La sortie est :
Testez le.
Félicitations - vous venez d'apprendre les moyens de base de communiquer avec les fonctions.
def hi(name):
print("Hi,", name)
hi("Greg")
hiAll("Sebastian", "Konrad")
s = input("Street: ")
pC = input("Postal Code: ")
c = input("City: ")
address(s, c, pC)
2. Vous pouvez passer des arguments à une fonction en utilisant les techniques suivantes:
• passage de l'argument positionnel dans lequel l'ordre des arguments a réussi (Ex. 1),
• passage d'un mot clé (nommé) dans lequel l'ordre des arguments transmis n'a pas d'importance (Ex.2),
• un mélange d'arguments positionnels et de mots-clés passant (Ex. 3).
Ex. 1
def subtra(a, b):
print(a - b)
subtra(5, 2) # outputs: 3
subtra(2, 5) # outputs: -3
Ex. 2
def subtra(a, b):
print(a - b)
Ex. 3
def subtra(a, b):
print(a - b)
3. Vous pouvez utiliser la technique de passage d'argument par mot clé pour prédéfinir une valeur pour un argument donné:
Exercice 1
intro()
Exercice 2
intro(b="Sean Connery")
Exercice 3
intro("Susan")
Exercice 4
sum(a=1, c=3)
Bien sûr, les fonctions - comme leurs frères et sœurs mathématiques - peuvent avoir des résultats.
Pour que les fonctions renvoient une valeur (mais pas uniquement à cette fin), vous utilisez l' return instruction.
Ce mot vous donne une image complète de ses capacités. Remarque: c'est un mot-clé Python .
Lorsqu'il est utilisé à l'intérieur d'une fonction, il provoque l' arrêt immédiat de l'exécution de la fonction et un retour
instantané (d'où le nom) au point d'invocation .
Remarque: si une fonction n'est pas destinée à produire un résultat, l' utilisation de l' return instruction n'est pas
obligatoire - elle sera exécutée implicitement à la fin de la fonction.
Quoi qu'il en soit, vous pouvez l'utiliser pour terminer les activités d'une fonction à la demande , avant que le contrôle
n'atteigne la dernière ligne de la fonction.
print("Three...")
print("Two...")
print("One...")
if not wishes:
return
Two...
One...
happy_new_year(False)
modifiera le comportement de la fonction - l' return instruction provoquera sa fin juste avant les souhaits - c'est la sortie
mise à jour:
Three...
Two...
One...
def function():
return expression
• il provoque l' arrêt immédiat de l'exécution de la fonction (rien de nouveau par rapport à la première variante)
• de plus, la fonction évaluera la valeur de l'expression et la renverra (d'où le nom une fois de plus) comme
résultat de la fonction .
Oui, nous le savons déjà - cet exemple n'est pas vraiment sophistiqué:
def boring_function():
return 123
x = boring_function()
dessous:
L'instruction return , enrichie de l'expression (l'expression est très simple ici), "transporte" la valeur de l'expression à
l'endroit où la fonction a été invoquée.
Le résultat peut être librement utilisé ici, par exemple, pour être affecté à une variable.
Remarque, nous ne sommes pas trop polis ici - la fonction renvoie une valeur, et nous l'ignorons (nous ne l'utilisons en
aucune façon):
def boring_function():
return 123
boring_function()
N'oubliez pas:
• vous êtes toujours autorisé à ignorer le résultat de la fonction et à être satisfait de l'effet de la fonction (si la
fonction en a)
• si une fonction est destinée à renvoyer un résultat utile, elle doit contenir la deuxième variante de
l' return instruction.
Attendez une minute - cela signifie-t-il qu'il y a aussi des résultats inutiles? Oui - dans un certain sens.
Quelques mots sur None
Laissez-nous vous présenter une valeur très curieuse (pour être honnête, une valeur nulle) nommée None .
Ses données ne représentent aucune valeur raisonnable - en fait, ce n'est pas du tout une valeur; par conséquent, il ne
doit participer à aucune expression .
print(None + 2)
Il n'y a que deux types de circonstances qui None peuvent être utilisées en toute sécurité:
• lorsque vous l' affectez à une variable (ou le retournez comme résultat d'une fonction )
• lorsque vous le comparez à une variable pour diagnostiquer son état interne.
Comme ici:
value = None
if value is None:
print("Sorry, you don't carry any value")
N'oubliez pas ceci: si une fonction ne retourne pas une certaine valeur en utilisant une return clause d'expression, on
suppose qu'elle renvoie implicitement None .
Testons-le.
def strangeFunction(n):
if(n % 2 == 0):
return True
Il est évident que la strangeFunction fonction retourne True lorsque son argument est pair.
print(strangeFunction(2))
print(strangeFunction(1))
None
Ne soyez pas surpris la prochaine fois que vous voyez None un résultat de fonction - cela peut être le symptôme d'une
erreur subtile à l'intérieur de la fonction.
La première est: une liste peut-elle être envoyée à une fonction comme argument?
Bien sûr que oui! Toute entité reconnaissable par Python peut jouer le rôle d'un argument de fonction, bien qu'il doive
être assuré que la fonction est capable d'y faire face.
Donc, si vous passez une liste à une fonction, la fonction doit la gérer comme une liste.
def list_sum(lst):
s = 0
s += elem
return s
print(list_sum([5, 4, 3]))
reviendra 12 en conséquence, mais vous devriez vous attendre à des problèmes si vous l'invoquez de cette manière
risquée:
print(list_sum(5))
Cela est dû au fait qu'une seule valeur entière ne doit pas être itérée par la for boucle .
def strangeListFunction(n):
strangeList = []
strangeList.insert(0, i)
return strangeList
print(strangeListFunction(5))
[4, 3, 2, 1, 0]
Plongeons un peu plus profondément dans les problèmes liés aux variables dans les fonctions. Ceci est essentiel pour
créer des fonctions efficaces et sûres.
LABORATOIR
Temps éstimé
10-15 minutes
Niveau de difficulté
Facile
Objectifs
Familiariser l’apprenant avec:
def isYearLeap(year):
for i in range(len(testData)):
yr = testData[i]
print(yr,"->",end="")
result = isYearLeap(yr)
if result == testResults[i]:
print("OK")
else:
print("Failed")
Remarque : nous avons également préparé un court code de test, que vous pouvez utiliser pour tester votre fonction.
Le code utilise deux listes - l'une avec les données de test et l'autre contenant les résultats attendus. Le code vous
indiquera si l'un de vos résultats n'est pas valide.
LABORATOIRE
Temps estimé
15-20 minutes
Niveau de difficulté
Moyen
Conditions préalables
LAB 4.1.3.6
Objectifs
Familiarisez l'étudiant avec:
La première partie de la fonction est prête. Maintenant, convainquez la fonction de revenir None si ses arguments n'ont
pas de sens.
Bien sûr, vous pouvez (et devez) utiliser la fonction précédemment écrite et testée (LAB 4.1.3.6). Cela peut être très
utile. Nous vous encourageons à utiliser une liste remplie des durées des mois. Vous pouvez le créer à l'intérieur de la
fonction - cette astuce raccourcira considérablement le code.
Nous avons préparé un code de test. Développez-le pour inclure plus de cas de test.
def isYearLeap(year):
for i in range(len(testYears)):
yr = testYears[i]
mo = testMonths[i]
if result == testResults[i]:
print("OK")
else:
print("Failed")
LABORATOIRE
Temps estimé
20-30 minutes
Niveau de difficulté
Moyen
Conditions préalables
LAB 4.1.3.6
LAB 4.1.3.7
Objectifs
Familiarisez l'étudiant avec:
Utilisez les fonctions précédemment écrites et testées. Ajoutez des cas de test au code. Ce test n'est qu'un début.
def isYearLeap(year):
LABORATOIRE
Temps estimé
15-20 minutes
Niveau de difficulté
Moyen
Objectifs
• familiariser l'étudiant avec les notions et algorithmes classiques;
• améliorer les compétences de l'étudiant dans la définition et l'utilisation des fonctions.
Scénario
Un nombre naturel est premier s'il est supérieur à 1 et n'a pas de diviseurs autres que 1 et lui-même.
Compliqué? Pas du tout. Par exemple, 8 n'est pas un nombre premier, car vous pouvez le diviser par 2 et 4 (nous ne
pouvons pas utiliser des diviseurs égaux à 1 et 8, car la définition l'interdit).
En revanche, 7 est un nombre premier, car nous ne pouvons pas trouver de diviseurs légaux pour lui.
Votre tâche consiste à écrire une fonction vérifiant si un nombre est premier ou non.
La fonction:
Astuce: essayez de diviser l'argument par toutes les valeurs suivantes (à partir de 2) et vérifiez le reste - s'il est nul,
votre nombre ne peut pas être un nombre premier; réfléchissez bien au moment où vous devez arrêter le processus.
Si vous avez besoin de connaître la racine carrée d'une valeur, vous pouvez utiliser l' ** opérateur. Rappelez-vous: la
racine carrée de x est la même que x 0,5
def isPrime(num):
if isPrime(i + 1):
print()
Exécutez votre code et vérifiez si votre sortie est la même que la nôtre.
Données de test
Production attendue:
2 3 5 7 11 13 17 19
LABORATOIRE
Temps estimé
10-15 minutes
Niveau de difficulté
Facile
Objectifs
• améliorer les compétences de l'étudiant dans la définition, l'utilisation et le test des fonctions.
Scénario
La consommation de carburant d'une voiture peut s'exprimer de différentes manières. Par exemple, en Europe, il est
indiqué comme la quantité de carburant consommée pour 100 kilomètres.
Aux États-Unis, il est indiqué comme le nombre de kilomètres parcourus par une voiture utilisant un gallon de carburant.
Votre tâche consiste à écrire une paire de fonctions convertissant l / 100 km en mpg, et vice versa.
Les fonctions:
def l100kmtompg(liters):
def mpgtol100km(miles):
print(l100kmtompg(3.9))
print(l100kmtompg(7.5))
print(l100kmtompg(10.))
print(mpgtol100km(60.3))
print(mpgtol100km(31.4))
print(mpgtol100km(23.5))
Exécutez votre code et vérifiez si votre sortie est la même que la nôtre.
60.31143162393162
31.36194444444444
23.52145833333333
3.9007393587617467
7.490910297239916
10.009131205673757
1. Vous pouvez utiliser le return mot - clé pour indiquer à une fonction de renvoyer une valeur. L' return instruction quitte
la fonction, par exemple:
return a * b
return
2. Le résultat d'une fonction peut être facilement affecté à une variable, par exemple:
def wishes():
w = wishes()
# Example 1
def wishes():
print("My Wishes")
# Example 2
def wishes():
print("My Wishes")
# Happy Birthday
3. Vous pouvez utiliser une liste comme argument d'une fonction, par exemple:
def hiEverybody(myList):
print("Hi,", name)
def createList(n):
myList = []
for i in range(n):
myList.append(i)
return myList
print(createList(5))
Exercice 1
def hi():
return
print("Hi!")
hi()
Exercice 2
if type(data) == int:
return True
return False
print(isInt(5))
print(isInt(5.0))
print(isInt("5"))
Exercice 3
def evenNumLst(ran):
lst = []
if num % 2 == 0:
lst.append(num)
return lst
print(evenNumLst(11))
Exercice 4
def listUpdater(lst):
updList = []
elem **= 2
updList.append(elem)
return updList
l = [1, 2, 3, 4, 5]
print(listUpdater(l))
La portée d'un nom (par exemple, un nom de variable) est la partie d'un code où le nom est correctement
reconnaissable.
Par exemple, la portée du paramètre d'une fonction est la fonction elle-même. Le paramètre est inaccessible en dehors
de la fonction.
def scopeTest():
x = 123
scopeTest()
print(x)
C'est à prévoir.
Nous allons mener quelques expériences avec vous pour vous montrer comment Python construit des étendues et
comment vous pouvez utiliser ses habitudes à votre avantage.
def myFunction():
var = 1
myFunction()
print(var)
La réponse est: une variable existant en dehors d'une fonction a une portée à l'intérieur des corps des
fonctions .
def myFunction():
var = 2
print("Do I know that variable?", var)
var = 1
myFunction()
print(var)
Le résultat a également changé - le code produit maintenant une sortie légèrement différente:
• la var variable créée à l'intérieur de la fonction n'est pas la même que lorsqu'elle est définie à l'extérieur - il
semble qu'il y ait deux variables différentes du même nom;
• de plus, la variable de la fonction masque la variable provenant du monde extérieur.
Une variable existant en dehors d'une fonction a une portée à l'intérieur des corps des fonctions, à l'exclusion
de celles d'entre elles qui définissent une variable du même nom.
Cela signifie également que la portée d'une variable existante en dehors d'une fonction n'est prise en charge que
lors de l'obtention de sa valeur (lecture). L'attribution d'une valeur force la création de la propre variable de la fonction.
Il existe une méthode Python spéciale qui peut étendre la portée d'une variable d'une manière qui inclut les corps
des fonctions (même si vous voulez non seulement lire les valeurs, mais aussi les modifier).
global name
L'utilisation de ce mot-clé dans une fonction avec le nom (ou les noms séparés par des virgules) d'une ou de plusieurs
variables, force Python à s'abstenir de créer une nouvelle variable à l'intérieur de la fonction - celle accessible de
l'extérieur sera utilisée à la place.
En d'autres termes, ce nom devient global (il a une portée globale et peu importe qu'il fasse l'objet d'une lecture ou
d'une affectation).
def myFunction():
global var
var = 2
var = 1
myFunction()
print(var)
Cela devrait être une preuve suffisante pour montrer que le mot clé global fait ce qu'il promet.
Le code dans l'éditeur devrait vous apprendre quelque chose. Comme vous pouvez le voir, la fonction modifie la valeur
de son paramètre. Le changement affecte-t-il l'argument?
def myFunction(n):
print("I got", n)
n += 1
print("I have", n)
var = 1
myFunction(var)
print(var)
I got 1
I have 2
1
Cela signifie également qu'une fonction reçoit la valeur de l'argument, pas l'argument lui-même. Cela est vrai pour les
scalaires.
Vaut-il la peine de vérifier comment cela fonctionne avec les listes (vous souvenez-vous des particularités de l'attribution
de tranches de liste par rapport à l'attribution de listes dans leur ensemble?).
def myFunction(myList1):
print(myList1)
myList1 = [0, 1]
myList2 = [2, 3]
myFunction(myList2)
print(myList2)
[2, 3]
[2, 3]
def myFunction(myList1):
print(myList1)
del myList1[0]
myList2 = [2, 3]
myFunction(myList2)
print(myList2)
Nous ne changeons pas la valeur du paramètre myList1 (nous savons déjà que cela n'affectera pas l'argument), mais
modifions plutôt la liste identifiée par lui.
[2, 3]
[3]
Pouvez-vous l'expliquer?
Essayons:
• si l'argument est une liste, la modification de la valeur du paramètre correspondant n'affecte pas la liste
(rappelez-vous: les variables contenant des listes sont stockées différemment des scalaires)
• mais si vous modifiez une liste identifiée par le paramètre (remarque: la liste, pas le paramètre!), la liste reflétera
le changement.
Il est temps d'écrire quelques exemples de fonctions. Vous le ferez dans la section suivante.
1. Une variable qui existe en dehors d'une fonction a une portée à l'intérieur du corps de la fonction (exemple 1) sauf si la
fonction définit une variable du même nom (exemple 2 et exemple 3), par exemple:
Exemple 1:
var = 2
def multByVar(x):
return x * var
print(multByVar(7)) # outputs: 14
Exemple 2:
def mult(x):
var = 5
return x * var
print(mult(7)) # outputs: 35
Exemple 3:
def multip(x):
var = 7
return x * var
var = 3
print(multip(7)) # outputs: 49
2. Une variable qui existe à l'intérieur d'une fonction a une portée à l'intérieur du corps de la fonction (exemple 4), par
exemple:
Exemple 4:
def adding(x):
var = 7
return x + var
print(adding(4)) # outputs: 11
print(var) # NameError
3. Vous pouvez utiliser le global mot - clé suivi d'un nom de variable pour rendre la portée de la variable globale, par
exemple:
var = 2
print(var) # outputs: 2
def retVar():
global var
var = 5
return var
print(retVar()) # outputs: 5
print(var) # outputs: 5
Exercice 1
def message():
alt = 1
print("Hello, World!")
print(alt)
Exercice 2
a = 1
def fun():
a = 2
print(a)
fun()
print(a)
Exercice 3
a = 1
def fun():
global a
a = 2
print(a)
fun()
a = 3
print(a)
Exercice 4
a = 1
def fun():
global a
a = 2
print(a)
a = 3
fun()
print(a)
Il semble que cette nouvelle fonction aura deux paramètres. Son nom sera bmi, mais si vous préférez un autre nom,
utilisez-le à la place.
Codons la fonction.
print(bmi(52.5, 1.65))
Le résultat produit par l'exemple d'invocation se présente comme suit :
19.283746556473833
La fonction répond à nos attentes, mais c'est un peu simple - elle suppose que les valeurs des deux paramètres sont
toujours significatives. Cela vaut vraiment la peine de vérifier s'ils sont dignes de confiance.
Vérifions-les tous les deux et renvoyons None si l'un d'eux semble suspect.
Tout d'abord, l'invocation du test garantit que la protection fonctionne correctement - la sortie est :
None
Deuxièmement, jetez un œil à la façon dont le symbole backslash ( \ ) est utilisé. Si vous l'utilisez dans du code Python
et terminez une ligne avec lui, il indiquera à Python de continuer la ligne de code dans la ligne de code suivante.
Cela peut être particulièrement utile lorsque vous devez gérer de longues lignes de code et que vous souhaitez
améliorer la lisibilité du code.
D'accord, mais il y a quelque chose que nous avons omis trop facilement - les mesures impériales. Cette fonction n'est
pas trop utile pour les personnes habituées aux livres, pieds et pouces.
Nous pouvons écrire deux fonctions simples pour convertir des unités impériales en unités métriques. Commençons
par les livres.
C'est un fait bien connu que 1 lb = 0.45359237 kg . Nous allons utiliser cela dans notre nouvelle fonction.
def lbtokg(lb):
return lb * 0.45359237
print(lbtokg(1))
Le résultat de l'invocation du test semble bon :
0.45359237
Et maintenant il est temps pour les pieds et les pouces : 1 ft = 0.3048 m , and 1 in = 2.54 cm = 0.0254 m .
print(ftintom(1, 1))
Le résultat d'un test rapide est:
0.3302
Il semble comme prévu.
Remarque: nous voulions nommer le deuxième paramètre uniquement in et pas inch, mais nous ne pouvions pas.
Est-ce que tu sais pourquoi?
print(ftintom(6, 0))
Et c'est la sortie :
1.8288000000000002
Il est tout à fait possible que vous souhaitiez parfois utiliser uniquement des pieds sans pouces. Python vous aidera-t-il?
Bien sur.
print(ftintom(6))
1.8288000000000002
Enfin, le code est capable de répondre à la question : quel est l'IMC d'une personne de 5'7 "de haut et pesant 176 lbs ?
def lbstokg(lb):
return lb * 0.45359237
return None
Nous savons depuis l'école que la somme de deux côtés arbitraires doit être plus longue que le troisième côté.
Ce ne sera pas un défi difficile. La fonction aura trois paramètres - un pour chaque côté.
Il renverra True si les côtés peuvent construire un triangle et False sinon. Dans ce cas, isItATriangle est un bon
nom pour une telle fonction.
Regardez le code dans l'éditeur.
if a + b <= c:
return False
if b + c <= a:
return False
if c + a <= b:
return False
return True
print(isItATriangle(1, 1, 1))
print(isItATriangle(1, 1, 3))
False
if a + b <= c or b + c <= a or \
c + a <= b:
return False
return True
print(isItATriangle(1, 1, 1))
print(isItATriangle(1, 1, 3))
Pouvons-nous le compacter encore plus?
print(isItATriangle(1, 1, 1))
print(isItATriangle(1, 1, 3))
Nous avons annulé la condition (inversé les opérateurs relationnels et remplacé les or par des et , recevant une
expression universelle pour tester les triangles).
Installons la fonction dans un programme plus grand. Il demandera à l'utilisateur trois valeurs et utilisera la fonction.
if isItATriangle(a, b, c):
else:
Dans la deuxième étape, nous essaierons de nous assurer qu'un certain triangle est un triangle à angle droit .
Nous devrons utiliser le théorème de Pythagore :
c2=a2+b2
Voici le code:
return False
return c ** 2 == a ** 2 + b ** 2
return a ** 2 == b ** 2 + c ** 2
print(isItRightTriangle(5, 3, 4))
print(isItRightTriangle(1, 3, 4))
Regardez comment nous testons la relation entre l'hypoténuse et les côtés restants - nous choisissons le côté le plus
long et appliquons le théorème de Pythagore pour vérifier si tout va bien. Cela nécessite trois contrôles au total.
Nous allons utiliser l'opérateur d'exponentiation pour trouver la racine carrée - cela peut sembler étrange, mais cela
fonctionne:
p = (a + b + c) / 2
return None
return heron(a, b, c)
if isItATriangle(a, b, c):
print("Congratulations - it can be a triangle.")
else:
print("Sorry, it won't be a triangle.")
Nous l'essayons avec un triangle à angle droit comme un demi-carré avec un côté égal à 1. Cela signifie que son champ
doit être égal à 0,5.
0.49999999999999983
C'est très proche de 0,5, mais ce n'est pas exactement 0,5. Qu'est-ce que ça veut dire ? Est-ce une erreur ?
Non, ça ne l'est pas. Ce sont les spécificités des calculs à virgule flottante. Nous vous en dirons bientôt plus.
1! = 1
2! = 1 * 2
3! = 1 * 2 * 3
4! = 1 * 2 * 3 * 4
:
:
n! = 1 * 2 ** 3 * 4 * ... * n-1 * n
Il est marqué d'un point d' exclamation et est égal au produit de tous les nombres naturels de un à son argument.
Écrivons notre code. Nous allons créer une fonction et l'appeler factorialFun . Voici le code:
def factorialFun(n):
if n < 0:
return None
if n < 2:
return 1
product = 1
product *= i
return product
print(n, factorialFun(n))
Remarquez comment nous reflétons pas à pas la définition mathématique et comment nous utilisons la for boucle
pour trouver le produit .
Nous ajoutons un code de test simple, et voici les résultats que nous obtenons:
1 1
2 2
3 6
4 24
5 120
Il s'agit d'une séquence de nombres entiers construite à l'aide d'une règle très simple:
fib1 = 1
fib2 = 1
fib3 = 1 + 1 = 2
fib4 = 1 + 2 = 3
fib5 = 2 + 3 = 5
fib6 = 3 + 5 = 8
fib7 = 5 + 8 = 13
def fib(n):
if n < 1:
return None
if n < 3:
return 1
elem1 = elem2 = 1
sum = 0
for i in range(3, n + 1):
sum = elem1 + elem2
elem1, elem2 = elem2, sum
return sum
1 -> 1
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 8
7 -> 13
8 -> 21
9 -> 34
Ce terme peut décrire de nombreux concepts différents, mais l'un d'eux est particulièrement intéressant - celui se
référant à la programmation informatique.
Ces deux cas semblent être les meilleurs pour illustrer le phénomène - factoriels et nombres de Fibonacci. Surtout ce
dernier.
La définition des nombres de Fibonacci est un exemple clair de récursivité . Nous vous avons déjà dit que:
La définition du i ème nombre fait référence au numéro i-1, et ainsi de suite, jusqu'à ce que vous atteigniez les deux
premiers.
Peut-il être utilisé dans le code? Oui il peut. Cela peut également rendre le code plus court et plus clair.
La deuxième version de notre fib() fonction utilise directement cette définition:
def fib(n):
if n < 1:
return None
if n < 3:
return 1
Oui, il y a effectivement un petit risque. Si vous oubliez de considérer les conditions qui peuvent arrêter la chaîne
des invocations récursives, le programme peut entrer dans une boucle infinie . Tu dois être prudent.
n! = 1 × 2 × 3 × ... × n-1 × n
n! = (n-1)! × n
C'est ici:
def factorialFun(n):
if n < 0:
return None
if n < 2:
return 1
return n * factorialFun(n - 1)
def fib(n):
if n < 1:
return None
if n < 3:
return 1
elem1 = elem2 = 1
sum = 0
for i in range(3, n + 1):
sum = elem1 + elem2
elem1, elem2 = elem2, sum
return sum
for n in range(1, 10):
print(n, "->", fib(n))
Notre court voyage fonctionnel est presque terminé. La section suivante traitera de deux types de données Python
curieux: les tuples et les dictionnaires.
2. Vous pouvez utiliser des fonctions récursives en Python pour écrire du code propre et élégant et le diviser en
morceaux plus petits et organisés . D'un autre côté, vous devez être très prudent car il pourrait être facile de faire une
erreur et de créer une fonction qui ne se termine jamais . Vous devez également vous rappeler que les appels récursifs
consomment beaucoup de mémoire et peuvent donc parfois être inefficaces.
Lorsque vous utilisez la récursivité, vous devez prendre en compte tous ses avantages et inconvénients.
def factorial(n):
return 1
else:
return n * factorial(n - 1)
print(factorial(4)) # 4 * 3 * 2 * 1 = 24
Exercice 1
Que se passera-t-il lorsque vous tenterez d'exécuter l'extrait de code suivant et pourquoi?
def factorial(n):
return n * factorial(n - 1)
print(factorial(4))
Exercice 2
def fun(a):
if a > 30:
return 3
else:
return a + fun(a + 3)
print(fun(25))
Un type de séquence est un type de données en Python qui est capable de stocker plus d'une valeur (ou moins d'une,
car une séquence peut être vide), et ces valeurs peuvent être parcourues séquentiellement (d'où le nom) , élément
par élément.
La for boucle étant un outil spécialement conçu pour parcourir les séquences, nous pouvons exprimer la définition comme
suit: une séquence est une donnée qui peut être scannée par la for boucle .
Vous avez rencontré jusqu'à présent une séquence Python - la liste. La liste est un exemple classique d'une séquence Python,
bien qu'il existe d'autres séquences qui méritent d'être mentionnées, et nous allons vous les présenter maintenant.
La deuxième notion - la mutabilité - est une propriété de n'importe quelle donnée de Python qui décrit sa disponibilité à
être librement modifiée pendant l'exécution du programme. Il existe deux types de données
Python: mutables et immuables .
Les données mutables peuvent être mises à jour librement à tout moment - nous appelons une telle opération in situ.
In situ est une phrase latine qui se traduit littéralement par sa position . Par exemple, l'instruction suivante modifie les
données in situ:
list.append(1)
Imaginez qu'une liste ne peut être attribuée et relue. Vous ne pourrez ni lui ajouter un élément, ni en supprimer aucun
élément. Cela signifie que l'ajout d'un élément à la fin de la liste nécessiterait la recréation de la liste à partir de zéro.
Vous devrez créer une liste complètement nouvelle, composée de tous les éléments de la liste déjà existante, plus le nouvel
élément.
Le type de données dont nous voulons vous parler maintenant est un tuple . Un tuple est un type de séquence
immuable . Il peut se comporter comme une liste, mais il ne doit pas être modifié in situ.
Regardez l'exemple:
tuple1 = (1, 2, 4, 8)
Imprimons-les:
print(tuple1)
print(tuple2)
Remarque: chaque élément de tuple peut être d'un type différent (virgule flottante, entier ou tout autre type de données
non encore introduit).
emptyTuple = ()
Si vous souhaitez créer un tuple à un élément , vous devez prendre en considération le fait que, pour des raisons de syntaxe
(un tuple doit être distingué d'une valeur simple ordinaire), vous devez terminer la valeur par une virgule:
oneElementTuple1 = (1, )
oneElementTuple2 = 1.,
La suppression des virgules ne gâchera pas le programme dans un sens syntaxique, mais vous obtiendrez à la place deux
variables simples, pas des tuples.
print(myTuple[0])
print(myTuple[-1])
print(myTuple[1:])
print(myTuple[:-2])
1000
(1, 10)
10
100
1000
Les similitudes peuvent être trompeuses - n'essayez pas de modifier le contenu d'un tuple ! Ce n'est pas une liste!
Toutes ces instructions (sauf la plus haute) provoqueront une erreur d'exécution:
myTuple.append(10000)
del myTuple[0]
myTuple[1] = -10
• la len() fonction accepte les tuples et retourne le nombre d'éléments contenus à l'intérieur;
• l' + opérateur peut joindre des tuples ensemble (nous vous l'avons déjà montré)
• l' * opérateur peut multiplier les tuples, tout comme les listes;
• les opérateurs in et not in fonctionnent de la même manière que dans les listes.
t2 = myTuple * 3
print(len(t2))
print(t1)
print(t2)
print(10 in myTuple)
9
(1, 10, 100, 1000, 10000)
(1, 10, 100, 1, 10, 100, 1, 10, 100)
True
True
L'une des propriétés de tuple les plus utiles est leur capacité à apparaître sur le côté gauche de l'opérateur
d'affectation . Vous avez vu ce phénomène il y a quelque temps, quand il fallait trouver un outil élégant pour échanger
les valeurs de deux variables.
var = 123
t1 = (1, )
t2 = (2, )
t3 = (3, var)
Il montre trois tuples en interaction - en effet, les valeurs qui y sont stockées "circulent"
- t1 devient t2 , t2 devient t3 et t3 devient t1 .
Remarque: l'exemple présente un fait plus important: les éléments d' un tuple peuvent être des variables , pas
seulement des littéraux. De plus, elles peuvent être des expressions si elles se trouvent du côté droit de l'opérateur
d'affectation.
Pour expliquer ce qu'est réellement le dictionnaire Python, il est important de comprendre qu'il s'agit littéralement d'un
dictionnaire.
Le dictionnaire Python fonctionne de la même manière qu'un dictionnaire bilingue . Par exemple, vous avez un mot anglais
(par exemple, chat) et avez besoin de son équivalent français. Vous parcourez le dictionnaire afin de trouver le mot (vous
pouvez utiliser différentes techniques pour le faire - cela n'a pas d'importance) et finalement vous l'obtenez. Ensuite, vous
vérifiez l'homologue français et c'est (très probablement) le mot "chat".
Dans le monde de Python, le mot que vous recherchez est nommé a key . Le mot que vous obtenez du dictionnaire est appelé
a value .
• chaque clé doit être unique - il n'est pas possible d'avoir plus d'une clé de la même valeur;
• une clé peut être des données de tout type (sauf liste): elle peut être un nombre (entier ou flottant), voire une
chaîne;
• un dictionnaire n'est pas une liste - une liste contient un ensemble de valeurs numérotées, tandis qu'un dictionnaire
contient des paires de valeurs ;
• la len() fonction fonctionne également pour les dictionnaires - elle renvoie le nombre d'éléments de valeur-clé dans
le dictionnaire;
• un dictionnaire est un outil à sens unique - si vous avez un dictionnaire anglais-français, vous pouvez rechercher
des équivalents français de termes anglais, mais pas l'inverse.
empty_dictionary = {}
print(dictionary)
print(phone_numbers)
print(empty_dictionary)
Dans le premier exemple, le dictionnaire utilise des clés et des valeurs qui sont toutes deux des chaînes. Dans le second, les
clés sont des chaînes, mais les valeurs sont des entiers. La disposition inverse (touches → nombres, valeurs → chaînes) est
également possible, ainsi que la combinaison nombre-nombre.
La liste des paires est entourée d'accolades , tandis que les paires elles-mêmes sont séparées par des virgules et les clés
et valeurs par des deux-points .
Le premier de nos dictionnaires est un dictionnaire anglais-français très simple. Le second - un très petit annuaire
téléphonique.
Les dictionnaires vides sont construits par une paire d'appareils orthopédiques vides - rien d'inhabituel.
Le dictionnaire dans son ensemble peut être imprimé avec une seule print() invocation. L'extrait peut produire la sortie
suivante:
{}
Avez-vous remarqué quelque chose de surprenant? L'ordre des paires imprimées est différent de celui de l'affectation
initiale. Qu'est-ce que ça veut dire?
Tout d'abord, c'est une confirmation que les dictionnaires ne sont pas des listes - ils ne préservent pas l'ordre de leurs
données, car l'ordre n'a aucun sens (contrairement aux vrais dictionnaires papier). L'ordre dans lequel un
dictionnaire stocke ses données est complètement hors de votre contrôle et de vos attentes. C'est normal. (*)
REMARQUE
(*) En Python 3.6x, les dictionnaires sont devenus des collections ordonnées par défaut. Vos résultats peuvent varier en
fonction de la version de Python que vous utilisez.
print(dictionary['cat'])
print(phone_numbers['Suzy'])
Obtenir la valeur d'un dictionnaire ressemble à l'indexation, en particulier grâce aux crochets entourant la valeur de la
clé.
Remarque:
• si la clé est une chaîne, vous devez la spécifier comme une chaîne;
• les touches sont sensibles à la casse : 'Suzy' est quelque chose de différent de 'suzy' .
chat
5557654321
Et maintenant, la nouvelle la plus importante: vous ne devez pas utiliser de clé inexistante . Essayer quelque chose
comme ça:
print(phone_numbers['president'])
Heureusement, il existe un moyen simple d'éviter une telle situation. L' in opérateur, avec son compagnon not in ,
peut sauver cette situation.
Non, car un dictionnaire n'est pas un type de séquence - la for boucle est inutile avec lui.
Oui, car il existe des outils simples et très efficaces qui peuvent adapter n'importe quel dictionnaire
aux for exigences de la boucle (en d'autres termes, créer un lien intermédiaire entre le dictionnaire et une entité de
séquence temporaire).
Le premier d'entre eux est une méthode nommée keys() , possédée par chaque dictionnaire. La méthode renvoie un
objet itérable composé de toutes les clés rassemblées dans le dictionnaire . Avoir un groupe de clés vous permet
d'accéder à l'ensemble du dictionnaire de manière simple et pratique.
Comme ici:
Le trié () fonction
Voulez-vous que ce soit trié ? Il suffit d'enrichir la boucle for pour obtenir une telle forme:
Notez la manière dont le tuple a été utilisé comme for variable de boucle.
L'exemple imprime:
Il existe également une méthode nommée values() , qui fonctionne de manière similaire à keys() , mais renvoie des
valeurs .
print(french)
Le dictionnaire n'étant pas en mesure de trouver automatiquement une clé pour une valeur donnée, le rôle de cette
méthode est plutôt limité.
cheval
chien
chat
Nous allons remplacer la valeur "chat" par "minou" , qui n'est pas très précise, mais cela fonctionnera bien avec notre
exemple.
Regardez:
dictionary['cat'] = 'minou'
print(dictionary)
La sortie est:
Remarque: il s'agit d'un comportement très différent des listes, qui ne vous permettent pas d'attribuer des valeurs à des
indices non existants.
Ajoutons une nouvelle paire de mots au dictionnaire - un peu bizarre, mais toujours valide:
dictionary['swan'] = 'cygne'
print(dictionary)
L'exemple affiche:
SUPPLÉMENTAIRE
Vous pouvez également insérer un élément dans un dictionnaire en utilisant la méthode update() , par exemple:
dictionary.update({"duck" : "canard"})
print(dictionary)
Remarque: la suppression d'une clé entraînera toujours la suppression de la valeur associée . Les valeurs ne
peuvent exister sans leurs clés .
Voici l'exemple:
del dictionary['dog']
print(dictionary)
Remarque: la suppression d'une clé non existante provoque une erreur .
L'exemple affiche:
Pour supprimer le dernier élément d'un dictionnaire, vous pouvez utiliser la popitem() méthode:
dictionary.popitem()
• vous avez besoin d'un programme pour évaluer les notes moyennes des élèves;
• le programme doit demander le nom de l'élève, suivi de son score unique;
• les noms peuvent être entrés dans n'importe quel ordre;
• la saisie d'un nom vide termine la saisie des données;
• une liste de tous les noms, ainsi que le score moyen évalué, doivent ensuite être émis.
school_class = {}
while True:
name = input("Enter the student's name (or type exit to stop): ")
if name == 'exit':
break
if name in school_class:
school_class[name] += (score,)
else:
school_class[name] = (score,)
• ligne 1 : créez un dictionnaire vide pour les données d'entrée; le nom de l'élève est utilisé comme clé, tandis
que tous les scores associés sont stockés dans un tuple (le tuple peut être une valeur de dictionnaire - ce n'est
pas un problème du tout)
• ligne 3 : entrez dans une boucle "infinie" (ne vous inquiétez pas, elle se cassera au bon moment)
• ligne 4 : lisez le nom de l'élève ici;
• ligne 5-6 : si le nom est exit , quittez la boucle;
• ligne 8 : demandez l'un des scores de l'élève (un entier compris entre 1 et 10)
• ligne 10-11 : si le nom de l'élève est déjà dans le dictionnaire, allongez le tuple associé avec le nouveau score
(notez l'opérateur + =)
• ligne 12-13 : s'il s'agit d'un nouvel élève (inconnu du dictionnaire), créez une nouvelle entrée - sa valeur est un
tuple à un élément contenant le score entré;
• ligne 15 : parcourir les noms des élèves triés;
• ligne 16-17 : initialiser les données nécessaires pour évaluer la moyenne (somme et compteur)
• ligne 18-20 : nous parcourons le tuple, en prenant tous les scores suivants et en mettant à jour la somme, avec
le compteur;
• ligne 21 : évaluer et imprimer le nom et la note moyenne de l'élève.
Voici un enregistrement d'une conversation que nous avons eue avec notre programme:
myTuple = (1, 2, True, "a string", (3, 4), [5, 6], None)
print(myTuple)
myList = [1, 2, True, "a string", (3, 4), [5, 6], None]
print(myList)
Chaque élément de tuple peut être d'un type différent (c'est-à-dire des entiers, des chaînes, des booléens, etc.). De plus, les
tuples peuvent contenir d'autres tuples ou listes (et inversement).
emptyTuple = ()
myTup2 = 1
myTuple = 1, 2, 3,
del myTuple
6. Vous pouvez parcourir un élément d'un tuple (exemple 1), vérifier si un élément spécifique est (pas) présent dans un tuple
(exemple 2), utiliser la len() fonction pour vérifier combien d'éléments il y a dans un tuple (exemple 3), ou même joindre /
multiplier des tuples (exemple 4):
# Example 1
t1 = (1, 2, 3)
print(elem)
# Example 2
t2 = (1, 2, 3, 4)
print(5 in t2)
# Example 3
t3 = (1, 2, 3, 5)
print(len(t3))
# Example 4
t4 = t1 + t2
t5 = t3 * 2
print(t4)
print(t5)
SUPPLÉMENTAIRE
Vous pouvez également créer un tuple à l'aide d'une fonction intégrée Python appelée tuple() . Ceci est particulièrement
utile lorsque vous souhaitez convertir un certain itérable (par exemple, une liste, une plage, une chaîne, etc.) en un tuple:
print(myTup)
lst = [2, 4, 6]
tup = tuple(lst)
print(tup) # outputs: (2, 4, 6)
tup = 1, 2, 3,
lst = list(tup)
Chaque dictionnaire est un ensemble de paires clé: valeur . Vous pouvez le créer en utilisant la syntaxe suivante:
myDictionary = {
key1 : value1,
key2 : value2,
key3 : value3,
}
2. Si vous souhaitez accéder à un élément du dictionnaire, vous pouvez le faire en faisant référence à sa clé à l'intérieur d'une
paire de crochets (ex. 1) ou en utilisant la get() méthode (ex. 2):
polEngDict = {
"kwiat" : "flower",
"woda" : "water",
"gleba" : "soil"
item2 = polEngDict.get("woda")
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
polEngDict["zamek"] = "lock"
del myPhonebook["Adam"]
print(myPhonebook) # outputs: {}
Vous pouvez également insérer un élément dans un dictionnaire à l'aide de la update() méthode et supprimer le dernier
élément à l'aide de la popitem() méthode, par exemple:
polEngDict.popitem()
5. Vous pouvez utiliser la for boucle pour parcourir un dictionnaire, par exemple:
polEngDict = {
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
# woda
# gleba
6. Si vous souhaitez parcourir les clés et les valeurs d'un dictionnaire, vous pouvez utiliser la méthode items() , par
exemple:
polEngDict = {
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
polEngDict = {
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
}
if "zamek" in polEngDict:
print("Yes")
else:
print("No")
8. Vous pouvez utiliser le del mot - clé pour supprimer un élément spécifique ou supprimer un dictionnaire. Pour supprimer
tous les éléments du dictionnaire, vous devez utiliser la clear() méthode:
polEngDict = {
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
print(len(polEngDict)) # outputs: 3
print(len(polEngDict)) # outputs: 2
print(len(polEngDict)) # outputs: 0
polEngDict = {
"zamek" : "castle",
"woda" : "water",
"gleba" : "soil"
copyDict = polEngDict.copy()
myTup = (1, 2, 3)
print(myTup[2])
Exercice 2
tup = 1, 2, 3
a, b, c = tup
print(a * b * c)
Exercice 3
Complétez le code pour utiliser correctement la count() méthode pour trouver le nombre de doublons 2 dans le tuple
suivant.
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
print(duplicates) # outputs: 4
Exercice 4
Écrivez un programme qui "collera" les deux dictionnaires ( d1 et d2 ) ensemble et en créera un nouveau ( d3 ).
d3 = {}
# your code
print(d3)
Exercice 5
t = # your code
print(t)
Exercice 6
# your code
print(colDict)
Exercice 7
copyMyDict = myDict.copy()
myDict.clear()
print(copyMyDict)
Exercice 8
colors = {
"white" : (255, 255, 255),
PROJET
Temps estimé
30-60 minutes
Niveau de difficulté
Moyen / dur
Objectifs
• Perfectionner les compétences de l'élève dans l'utilisation de Python pour résoudre des problèmes complexes,
• Intégration de techniques de programmation dans un programme composé de nombreuses parties différentes.
Scénario
Votre tâche consiste à écrire un programme simple qui prétend jouer au tic-tac-toe avec l’utilisateur. Pour vous
faciliter la tâche, nous avons décidé de simplifier le jeu. Voici nos hypothèses :
• L’ordinateur (c'est-à-dire votre programme) devrait jouer au jeu en utilisant des 'X’ ;
• L’utilisateur (par exemple, vous) devrait jouer au jeu en utilisant des 'O’ ;
• Le premier mouvement appartient à l'ordinateur - il place toujours son premier 'X' au milieu du plateau ;
• Tous les carrés sont numérotés ligne par ligne en commençant par 1 (voir l'exemple de session ci-dessous pour
référence)
• L’utilisateur entre son mouvement en entrant le numéro du carré qu'il choisit - le nombre doit être valide, c'est-à-
dire qu'il doit être un entier, il doit être supérieur 0 et inférieur à 10 , et il ne peut pas pointer vers un champ qui
est déjà occupé ;
• Le programme vérifie si le jeu est terminé - il y a quatre verdicts possibles : le jeu doit continuer, ou le jeu se
termine par une égalité, votre victoire ou la victoire de l’ordinateur ;
• L’ordinateur répond avec son mouvement et le contrôle est répété ;
• N’implémentez aucune forme d'intelligence artificielle - un choix de champ aléatoire fait par l'ordinateur est
assez bon pour le jeu.
+-------+-------+-------+
| | | |
| 1 | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | 2 | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | 8 | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | 6 |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| 4 | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | 3 |
| | | |
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| 7 | O | 9 |
| | | |
+-------+-------+-------+
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| O | X | X |
| | | |
+-------+-------+-------+
| | | |
| O | O | 9 |
| | | |
+-------+-------+-------+
You won !
Exigences
Implémentez les fonctionnalités suivantes :
• Le tableau doit être stocké sous forme de liste à trois éléments, tandis que chaque élément est une autre liste à
trois éléments (les listes internes représentent des lignes) afin que tous les carrés soient accessibles en utilisant
la syntaxe suivante:
board[row][column]
• Chacun des éléments de la liste des internes peut contenir 'O' , 'X' ou un chiffre qui représente le numéro de
la place (place un tel est considéré comme libre)
• L’apparence du tableau doit être exactement la même que celle présentée dans l'exemple.
• Implémentez les fonctions définies pour vous dans l'éditeur.
def DisplayBoard(board):
#
# the function accepts one parameter containing the board's current status
# and prints it out to the console
#
def EnterMove(board):
#
# the function accepts the board current status, asks the user about their move,
# checks the input and updates the board according to the user's decision
#
def MakeListOfFreeFields(board):
#
# the function browses the board and builds a list of all the free squares;
# the list consists of tuples, while each tuple is a pair of row and column numbers
#
def DrawMove(board):
#
# the function draws the computer's move and updates the board
#
Le dessin d'un nombre entier aléatoire peut être fait en utilisant une fonction Python appelée randrange() . L'exemple
de programme ci-dessous montre comment l'utiliser (le programme imprime dix nombres aléatoires de 0 à 8).
Remarque: l'instruction from-import fournit un accès à la fonction randrange définie dans un module Python externe
appelé random .
for i in range(10):
print(randrange(8))
• La définition et l'utilisation des fonctions - leur raison d'être, leur objectif, leurs conventions et leurs pièges ;
• Le concept de passer des arguments de différentes manières et de définir leurs valeurs par défaut, ainsi que les
mécanismes de retour des résultats de la fonction ;
• Problèmes de portée de nom ;
• Nouveaux agrégats de données : tuples et dictionnaires, et leur rôle dans le traitement des données.
Vous êtes maintenant prêt à répondre au questionnaire du module et à tenter le dernier défi: le module 4 Test, qui vous
aidera à évaluer ce que vous avez appris jusqu'à présent.