Programme python

Bonjour, je galère depuis 1 semaine sur cet exercice que je comprends toujours pas. pourriez-vous s'il vous plait me rendre service en me guidant.

On supposera ici que les éléments des listes utilisées sont tous de même type.
Soit le code suivant :
def so(liste) :
s=0
for e in liste :
for i in e :
if i%2==0 :
s=s+i
li=eval(input()) #eval permet de transformer la chaîne de caractères saisie par sa valeur (une liste par exemple), voir avant-propos de la séance 6 sur PIXAL
print(so(li))

Répondez aux questions suivantes :
Pour que le programme fonctionne :
a) Quel devrait être le type de la variable i ? Expliquez comment on peut le déduire.
b) Quel devrait être le type de la variable e ? Expliquez comment on peut le déduire.
c) Quel devrait être le type de la variable liste ? Expliquez comment on peut le déduire.
d) Quel devrait être le type de la variable li ? Expliquez comment on peut le déduire.
e) Quel devrait être le type de la variable s ? Expliquez comment on peut le déduire.
f) Expliquez en une ou deux phrases ce que la fonction devrait faire en expliquant le rôle de la variable s . Que doit-on
ajouter pour obtenir le résultat souhaité ?
g) Donnez un exemple représentatif de valeurs pour li et indiquez quelles seraient les valeurs successives prises par les
variables e, i et s.
h) En l'état actuel, qu'affiche le programme complet ? Après modification et sur votre exemple, qu'affiche t'il ?

je connais les variables i, e, liste, et li sont de quel type mais je ne sais pas si ça va changer pour que le programme fonctionne.
pour la question f je crois que la fonction faut qu'elle insère une liste mais je suis pas sûre.
veuillez s'il vous plait me donner juste un coup de main parce que je suis complètement perdue.
merci d'avance :)

23 réponses

Résumé de la discussion

Problème central: le code Python défini une fonction so(liste) censée additionner les entiers pairs contenus dans des listes imbriquées, mais le comportement attendu réclame des retours et des ajustements. Des réponses convergent: ajouter un return; i et s sont entiers, e est une liste de listes, liste est une liste de listes et li est une liste imbriquée. Par exemple, li pourrait être une liste de listes d’entiers comme [[1,2,3],[4,5]]; la fonction devrait additionner les nombres pairs (2 et 4) et retourner 6, le programme affichant 6 après correction. En l’état actuel, le programme affiche None car la fonction ne retourne rien; après ajout du return et, si nécessaire, le remplacement de eval par ast.literal_eval, l’exemple donné afficherait 6.

Bobot (l’IA à votre service)
  1. Contributeur
    Je pense que tu aurais intérêt à faire d'abord des exercices plus simples avec un for et une liste.
    1. je sais j'en ai fais pas mal, mais là je n'ai vraiment pas le choix c'est pour un devoir. ça fait 8 jours que je suis dessus
    2. Contributeur
      @chuxxxfluje pense que ce devoir dépasse tes connaissances, et que, afin de le réussir, tu dois d'abord apprendre les bases.
      tu arriveras peut-être au bout de ce devoir avec de l'aide, mais je pense que tu ne pourras pas faire seul un autre travail du même niveau.
  2. et il faut que je change le programme pour repondre aux autres questions du coup non?
    1. Ok, je ne l’aurais pas formulé comme cela, mais c’est l’idée.

      Maintenant sais tu répondre aux autres questions?
      1. le programme doit définir une fonction so(liste), on initialise s à 0. il doit rajouter i (un entier) à s si i est divisible par 2 et si e est dans la liste des listes des entiers. il doit afficher le résultat s ( il faut ajouter le return) et apres eval va permettre de transformer la chaine de caractère par la valeur et enfin le print va permettre d’afficher le résultat.
        1. Une liste de listes d’entiers.

          Sachant cela, peux tu me donner la réponse à la question f?
          1. Non si liste était une liste d’entiers alors e serait un entier.

            Qu’est ce qui pourrait avoir comme élément unitaire une liste d’entiers ?
            1. Je ne pense pas que ce soit pertinent pour cet exercice de savoir si c’est immuable ou mutable car le code n’essaye pas de modifier liste

              Concentre toi sur cette ligne
               for e in liste : 

              Tu sais que e est une liste (une liste d’entiers précisément) que peut donc être le le type de liste ?
              1. li est passé en paramètre à la fonction so. Donc li et liste sont « la même chose »
                A partir de e tu peux déduire liste et donc li
                1. pour li j’en ai aucune idée, tout ce que je sais c’est que eval c’est une evaluation dynamique de la fonction
                  1. Oui, une liste ça marche.
                    Donc si e est une liste, quel est le type de li?
                    1. Ha ça peut-être.
                      Cependant je n'ai pas trouvé une façon de représenter un intervalle de façon à ce que eval() l'accepte. Cela dit, je ne code pas en Python et avant ta question je ne connaissais pas eval().
                      Il est donc possible qu'un intervalle puisse lui être donné en entrée. Mais pas "1 to 4".

                      Si dans le cours cité, on t'explique comment passer un intervalle dans eval(), alors oui e peut être un intervalle.
                      Si tu n'as pas cette information, alors un faut trouver une autre structure de donnée qui sera acceptée par eval.
                      1. Contributeur
                        (bonjour)
                        on peut entrer ce genre de choses:
                        [[w*w for w in range(1,z)] for z in range(2,6)]

                        ou
                        ((w*w for w in range(1,z)) for z in range(2,6))


                        si [1,2,3,4] est un intervalle, on peut entrer
                        [x for x in range(1,5)]
                    2. Oui i est un entier, mais non, il ne faut pas ajouter un int().

                      Puisque i est un entier qu’est ce que peut être e?
                      1. du coup i est un entier ?
                        donc faut rajouter le i=int(input()) si c’est le cas
                        1. Il faut bien ajouter un return.

                          Mais ni e ni i est un booléen.

                          Ça fait quoi ça
                          i%2==0
                          ?

                          • 1
                          • 2