Répéter une fonction

Fermé
salu - Modifié le 10 mai 2022 à 15:02
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 - 10 mai 2022 à 15:09
Bonjour,

J'aimerais savoir, comment on peut répéter une fonction prenant deux arguments, qui eux-mêmes se trouvent dans une liste (mais pour lequel il faut changer l'indice de la liste a chaque fois).

Exemple :

liste = ["Azie", "Bob", "Brow", "15", "84", "37"]
def personne(nom, age): 
       print(f"Bonjour {nom} ! Tu as {age} !")

personne(liste[0], liste[3]) # Il faudrait répéter cette ligne autant de fs qu'il y a de personnes.


Merci pour vos réponses !

3 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
9 mai 2022 à 22:32
La question est : quand tu écris
personne(list[0], list[3])
d'où vient le nombre 3? Tu ne l'as pas choisi au hasard! Une piste, dans ton exemple la liste contient 6 choses dont la 1ère moitié sont des noms.

Ce qu'il faut faire (toujours pour ton exemple) c'est :
    personne(list[0], list[3])
    personne(list[0+1], list[3+1])
    personne(list[0+2], list[3+2])

Le moyen de retranscrire cela pour une liste quelconque, c'est une boucle.
0
Merci, mais j'aimerais ne pas me répéter et donc faire une boucle ?
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
10 mai 2022 à 11:24
Bonjour,

Et même, pour éviter de décaler les indices de liste de 3 cases, tu pourrais faire un dictionnaire:

dico = {"Bob":34, "Esther":56, "François":78}
0
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
Modifié le 10 mai 2022 à 15:13
Bonjour,

Si on répond à ta question sans réfléchir, on te dirait :

liste = ["Azie", "Bob", "Brow", "15", "84", "37"]
def personne(nom, age): 
       print(f"Bonjour {nom} ! Tu as {age} !")

for i in range(3):
  personne(liste[i], liste[i + 3])


Le problème, c'est que si
list
ne contient pas 6 éléments (3 noms, 3 âges), ça ne marchera plus. Alors on pourrait adapter le code en se disant que par convention la première moitié correspond aux noms et la seconde aux âges et ça donnerait quelque chose du genre :

liste = ["Azie", "Bob", "Brow", "15", "84", "37"]
def personne(nom, age): 
       print(f"Bonjour {nom} ! Tu as {age} !")

n = len(liste) // 2
for i in range(n):
    personne(liste[i], liste[n + i])


L'idéal serait :
  • soit d'avoir deux listes


noms = ["Azie", "Bob", "Brow"]
ages = ["15", "84", "37"]

def personne(nom, age): 
       print(f"Bonjour {nom} ! Tu as {age} !")

for (nom, age) in zip(noms, ages):
    personne(nom, age)
  • soit (comme Phil_1857 le propose) d'avoir un dictionnaire :


map_nom_age = {
    "Azie" : 15,
    "Bob" : 84,
    "Brow" : 37,
}

def personne(nom, age): 
       print(f"Bonjour {nom} ! Tu as {age} !")

for (nom, age) in map_nom_age.items():
    personne(nom, age)
  • soit de raisonner avec des listes d'arguments et d'utiliser l'opérateur de splice (c'est un peu plus général, car en python une fonction peut avoir un nombre variable d'argument si certains ont des valeurs par défaut, et cette technique permet également de traiter naturellement les fonctions avec plus de deux arguments) :


argss = [
    ("Azie", 15),
    ("Bob", 84),
    ("Brow", 37)
]

def personne(nom, age):
       print(f"Bonjour {nom} ! Tu as {age} !")

for args in argss:
    personne(*args)


Bonne chance
0