Le code Python utilisé pour définir vos fonctions doit obligatoirement se limiter à ce que l'on trouve dans le cours. Il est parfaitement interdit d'aller chercher des fonctions "magiques" ici ou là qui feront une partie du travail. Un tel code serait évalué par la note minimale. Savoir se servir de la documentation d'un langage, savoir utiliser les bibliothèques du langage sont des capacités à acquérir sur le long terme lorsqu'on apprend à programmer, mais ce n'est pas du tout l'objectif de ce début d'année: vous devez d'abord apprendre à maîtriser les instructions de base, à maîtriser le contenu du cours (ce qui est déjà un travail conséquent !)
Bien entendu, les fonctions de tests ne doivent pas renvoyer d'erreur d'assertion.
Et évidemment, il ne doit y avoir aucune erreur de syntaxe dans votre code !
Rappelons également que le code déjà écrit dans l'énoncé ne doit en aucun cas être modifié.
Dans cet exercice, on supposera que le paramètre chaine
de la fonction est toujours écrit sans utiliser
de lettres accentuées.
Code à compléter:
def uniquement_minuscules(chaine):
"""
chaine: de type str
Renvoie True si tous les caractères, sauf éventuellement le premier, sont
des minuscules (où minuscule désigne l'une quelconque des lettres
de l'alphabet: a, b, c, ..., z écrite en minuscule).
Si le premier caractère n'est pas une minuscule, ce doit être une majuscule (c'est
à dire une lettre parmi A, B, C, ..., Z).
Renvoie False sinon.
>>> uniquement_minuscules("Python")
True
>>> uniquement_minuscules("Jean-Antoine")# False à cause du caractère - et du caractère A
False
>>> uniquement_minuscules("gasteropoDe")
False
>>> uniquement_minuscules("gasteropode")
True
>>> uniquement_minuscules("un essai") # une espace n'est pas une minuscule
False
>>> uniquement_minuscules("3essais") # un caractère-chiffre n'est ni une minuscule ni une majuscule
False
"""
def uniquement_minuscules(chaine):
"""
chaine: de type str
Renvoie True si tous les caractères, sauf éventuellement le premier, sont
des minuscules (où minuscule désigne l'une quelconque des lettres
de l'alphabet: a, b, c, ..., z écrite en minuscule).
Si le premier caractère n'est pas une minuscule, ce doit être une majuscule (c'est
à dire une lettre parmi A, B, C, ..., Z).
Renvoie False sinon.
>>> uniquement_minuscules("Python")
True
>>> uniquement_minuscules("Jean-Antoine")# False à cause du caractère - et du caractère A
False
>>> uniquement_minuscules("gasteropoDe")
False
>>> uniquement_minuscules("gasteropode")
True
>>> uniquement_minuscules("un essai") # une espace n'est pas une minuscule
False
>>> uniquement_minuscules("3essais") # un caractère-chiffre n'est ni une minuscule ni une majuscule
False
"""
alphabet = "abcdefghijklmnopqrstuvwxyz"
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# on commence par traiter le cas de la première lettre:
if chaine[0] not in ALPHABET+alphabet: return False
# on traite maintenant les autres lettres:
for i in range(1,len(chaine)):
if chaine[i] not in alphabet:
return False
# si aucun "mauvais" caractère n'a été rencontré:
return True
def test_uniquement_minuscules():
assert uniquement_minuscules("Python") # équivalent de assert uniquement_minuscules("Python")==True
assert not uniquement_minuscules("Jean-Antoine") # équivalent de assert uniquement_minuscules("Jean-Antoine")==False
assert not uniquement_minuscules("gasteropoDe")
assert uniquement_minuscules("gasteropode")
assert not uniquement_minuscules("un essai")
assert not uniquement_minuscules("3essais")
assert not uniquement_minuscules("32ssais")
assert not uniquement_minuscules("a&%sais")
test_uniquement_minuscules()
Code à compléter:
def k_premieres_lettres(mot, k):
"""
mot: de type str
k: entier compris entre 0 et len(mot)
renvoie un mot constitué des k premières lettres de mot
>>> k_premieres_lettres("informatique", 4)
'info'
>>> k_premieres_lettres("informatique", 0)
''
>>> k_premieres_lettres("zorglub", 7)
'zorglub'
"""
def k_premieres_lettres(mot, k):
"""
mot: de type str
k: entier compris entre 0 et len(mot)
renvoie un mot constitué des k premières lettres de mot
>>> k_premieres_lettres("informatique", 4)
'info'
>>> k_premieres_lettres("informatique", 0)
''
>>> k_premieres_lettres("zorglub", 7)
'zorglub'
"""
# un assert pour contrôler la cohérence de la valeur donnée pour k:
message = f"Attention, la valeur {k} est en dehors de la plage 0..{len(mot)} autorisée pour le mot '{mot}'."
assert 0 <= k <= len(mot), message
# construction de la chaîne demandée:
resultat = ''
for j in range(0,k):
resultat = resultat + mot[j]
return resultat
def test_k_premieres_lettres():
assert k_premieres_lettres("informatique", 4) == "info"
assert k_premieres_lettres("informatique", 0) == ''
assert k_premieres_lettres("zorglub", 7) == "zorglub"
test_k_premieres_lettres()
On teste ci-dessous que l'on a bien un message d'erreur d'assertion lorsqu'on ne donne pas une valeur de k en cohérence avec la longueur de chaîne donnée en paramètre:
k_premieres_lettres("essai", 6)
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) /tmp/ipykernel_10269/2073833182.py in <module> ----> 1 k_premieres_lettres("essai", 6) /tmp/ipykernel_10269/309687980.py in k_premieres_lettres(mot, k) 14 # un assert pour contrôler la cohérence de la valeur donnée pour k: 15 message = f"Attention, la valeur {k} est en dehors de la plage 0..{len(mot)} autorisée pour le mot '{mot}'." ---> 16 assert 0 <= k <= len(mot), message 17 18 # construction de la chaîne demandée: AssertionError: Attention, la valeur 6 est en dehors de la plage 0..5 autorisée pour le mot 'essai'.
Rappel: il est important de découper les fonctions en "petites tâches", votre code tout au long de l'année devra s'attacher à cela. En particulier, la fonction ci-dessous aura clairement un code plus simple si elle fait appel à la fonction de l'exercice 2...
Code à compléter:
def repetition_abrege(mot):
"""
mot: de type str
précondition: mot est une chaîne non vide.
renvoie le mot "répété" avec des répétitions tronquées:
la répétition 1 complète,
la répétition 2 avec la dernière lettre en moins,
la répétition 3 avec 2 lettres en moins...
jusqu'à la dernière répétition ne comportant que la première lettre.
>>> repetition_abrege("nsi")
'nsinsn'
>>> repetition_abrege("python")
'pythonpythopythpytpyp'
"""
def repetition_abrege(mot):
"""
mot: de type str
précondition: mot est une chaîne non vide.
renvoie le mot "répété" avec des répétitions tronquées:
la répétition 1 complète,
la répétition 2 avec la dernière lettre en moins,
la répétition 3 avec 2 lettres en moins...
jusqu'à la dernière répétition ne comportant que la première lettre.
>>> repetition_abrege("nsi")
'nsinsn'
>>> repetition_abrege("python")
'pythonpythopythpytpyp'
"""
# on traduit la précondition imposée dans la spécification par un assert:
assert mot != '', "Attention, la chaîne doit être non vide."
# concaténation des débuts de mot:
resultat = ''
k = len(mot)
while k >= 1:
resultat = resultat + k_premieres_lettres(mot, k)
k = k-1
return resultat
def test_repetition_abrege():
assert repetition_abrege("nsi") == 'nsinsn'
assert repetition_abrege("python") == 'pythonpythopythpytpyp'
test_repetition_abrege()
Une autre version (on a remplacé le while par un for):
def repetition_abrege(mot):
"""
mot: de type str
précondition: mot est une chaîne non vide.
renvoie le mot "répété" avec des répétitions tronquées:
la répétition 1 complète,
la répétition 2 avec la dernière lettre en moins,
la répétition 3 avec 2 lettres en moins...
jusqu'à la dernière répétition ne comportant que la première lettre.
>>> repetition_abrege("nsi")
'nsinsn'
>>> repetition_abrege("python")
'pythonpythopythpytpyp'
"""
# on traduit la précondition imposée dans la spécification par un assert:
assert mot != '', "Attention, la chaîne doit être non vide."
# concaténation des débuts de mot:
resultat = ''
for k in range(0, len(mot)):
resultat = resultat + k_premieres_lettres(mot, len(mot)-k)
return resultat
Code à compléter:
def lettres_repetees(mot, lettres, n):
"""
mot: chaîne de caractères
lettres: des lettres à répéter
n: entier > 1
renvoie le mot d'origine dans lequel les caractères de lettres sont répétées n fois.
>>> lettres_repetees("python", "yh", 3)
'pyyythhhon'
>>> lettres_repetees("Dijkstra", "ija", 2)
'Diijjkstraa'
>>> lettres_repetees("Dijkstra", "ija", 0)
'Dkstr'
>>> lettres_repetees("Boole", "o", 1)
'Boole'
>>> lettres_repetees("Boole", "o", 2)
'Boooole'
>>> lettres_repetees("Boole", "o", 0)
'Ble'
"""
En pseudo-code:
fonction lettres_repetees(mot, lettres, n):
resultat ← chaîne vide
Pour chaque caractère de mot:
si ce caractère n'est pas dans lettres:
on ajoute le caractère une fois à resultat
sinon:
on ajoute n fois ce caractère à resultat
renvoyer resultat
def n_fois_lettre(lettre, n):
"""
n: entier naturel
lettre: caractère
renvoie une chaîne constituée de n répétitions de lettre
"""
resultat = ''
for k in range(n):
resultat += lettre
return resultat
def nombre_de_repetitions(lettre, lettres, n):
"""
lettre: caractère
lettres: chaîne de caractères
n: entier naturel
renvoie n si lettre est un caractère de lettres,
renvoie 1 sinon
"""
if lettre in lettres:
return n
else:
return 1
def lettres_repetees(mot, lettres, n):
"""
mot: chaîne de caractères
lettres: des lettres à répéter
n: entier > 1
renvoie le mot d'origine dans lequel les caractères de lettres sont répétées n fois.
>>> lettres_repetees("python", "yh", 3)
'pyyythhhon'
>>> lettres_repetees("Dijkstra", "ija", 2)
'Diijjkstraa'
>>> lettres_repetees("Dijkstra", "ija", 0)
'Dkstr'
>>> lettres_repetees("Boole", "o", 1)
'Boole'
>>> lettres_repetees("Boole", "o", 2)
'Boooole'
>>> lettres_repetees("Boole", "o", 0)
'Ble'
"""
resultat = ''
for c in mot:
resultat += n_fois_lettre(c, nombre_de_repetitions(c, lettres, n))
return resultat
On a découpé en petites fonctions. De façon générale, pensez toujours à introduire des fonctions intermédiaires. On clarifie ainsi le code, on le simplifie. La lecture de chaque fonction est plus simple, on se concentre sur une seule tâche à la fois. Une conséquence importante est la simplification du débugage.
def test_lettres_repetees():
assert lettres_repetees("python", "yh", 3) == 'pyyythhhon'
assert lettres_repetees("Dijkstra", "ija", 2) == 'Diijjkstraa'
assert lettres_repetees("Dijkstra", "ija", 0) == 'Dkstr'
assert lettres_repetees("Boole", "o", 1) == 'Boole'
assert lettres_repetees("Boole", "o", 2) == 'Boooole'
assert lettres_repetees("Boole", "o", 0) == 'Ble'
test_lettres_repetees()
lettres_repetees("Boole", "o", 0)
'Ble'