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. 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))


    je crois que le code est écrit correctement maintenant !
    (merci pour le tuto)
    0
    1. 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.


      Savoir quels sont les types de ces variables est nécessaire pour répondre à
      Expliquez en une ou deux phrases ce que la fonction devrait faire en expliquant le rôle de la variable s

      Parce que c’est grâce à cela que tu peux savoir ce qu’il faut mettre en entrée.
      Si ce qui est en entrée n’est pas ce qui est attendu ton programme ne fonctionnera pas.
      Ce n’est pas suffisant pour répondre à
      Que doit-on
      ajouter pour obtenir le résultat souhaité ?

      Mais si tu rentres n’importe quoi, même si tu as trouvé ce qu’il faut ajouter tu n’auras pas le résultat attendu
      0
      1. J’ai validé sans finir…
        Donc pour voir si tu es sur la bonne voie, peux tu donner le type des variables et ce que tu penses devoir donner en entrée de ton programme
        0
      2. @Utilisateur anonymepour les variables e et i je crois c’est des booléens
        pour ce qu’il faut rajouter je crois c’est  liste=[] et me return parce que une fonction sans return ne marche pas vraiment.
        0
      3. @Utilisateur anonymepourrais-tu s’il te plait me montrer ton programme si tu l’as deja fait parce que moi malgré que j’ai tout rajouté ça ne marche toujours pas?
        0
      4. @chuxxxfluNon,
        par contre si tu me montres ce que tu as essayé, je te dirais ce qui ne va pas.
        0
      5. @Utilisateur anonyme
        def so(liste) :
            s=0
            lst=[]
            for e in liste :
                for i in e :
                       if i%2==0 :
                           lst.append()
                           s=s+i
            return s
        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))
        0
    2. Il faut bien ajouter un return.

      Mais ni e ni i est un booléen.

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

      0
      1. du coup i est un entier ?
        donc faut rajouter le i=int(input()) si c’est le cas
        0
        1. 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?
          0
          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.
            0
            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)]
              0
            2. @yg_beSuper merci
              0
          2. Oui, une liste ça marche.
            Donc si e est une liste, quel est le type de li?
            0
            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
              0
              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
                0
                1. d’accord
                  donc est ce que s est une variable de type immuable?
                  0
                  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 ?
                    0
                    1. une liste d’entiers aussi je suppose?
                      0
                      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 ?
                        0
                        1. Une liste de listes d’entiers.

                          Sachant cela, peux tu me donner la réponse à la question f?
                          0
                          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.
                            0
                            1. Ok, je ne l’aurais pas formulé comme cela, mais c’est l’idée.

                              Maintenant sais tu répondre aux autres questions?
                              0
                              • 1
                              • 2