HackInScience.org : Lambda expressions

Bonjour tout le monde,

Pour l’exercice Python - Training - 25: Lambda Expressions.

Je pense avoir la bonne réponse et j’obtiens bien la réponse demandée lorsque je lance le programme. Mais le site me renvoie une erreur et il n’y a aucun indice qui puisse me guider…

Mon code est le suivant:

def filtered(lst, func):
    
    solution_iter = []

    
    for i in lst:
        if func(i):
            if i not in solution_iter:
                solution_iter.append(i)
    
  
    solution_string = ''
    for i in solution_iter:
        solution_string += str(i) + ', '
    print(solution_string.rstrip().rstrip(','))
    return solution_iter

if __name__ == '__main__':
    
    rang = []
    for i in range(0,101):
        rang.append(i)
        
    filtered(rang, lambda x: x%3 == 0)
    filtered(rang, lambda x: x%5 == 0)
    filtered(rang, lambda x: x%15 == 0)

et l’erreur reçue est:

Your code printed something (it should **not**):

```
1, 2, 3
```

Je ne vois pas ce que je pourrais faire pour deviner où se trouve le problème.

Une bonne âme aurait-elle une idée ?

Au cas ou ne faut t’il pas printé le résulat?
La tu ne fait que de le retourner.

petites améliorations possible:
- utilise ", ".join(solution_iter) au lieu de ta boucle
- utilise un set que tu pourras ordonné, cela évite ton if pour le append

Avant tout, merci pour ta réponse.

J’effectue bien un print() avant le return.

print(solution_string.rstrip().rstrip(','))

D’ailleurs, je n’ai sans doute pas besoin de faire deux rstrip().
Sinon vais essayer les améliorations que tu proposes.

D’après l’erreur, ton code imprime quelque chose alors qu’il ne devrait pas.

Ici, la fonction filtered ne doit que renvoyer un résultat (une liste) et non imprimer des trucs.

Ce qui est demandé c’est d’imprimer 3 strings bien précis:

** print all numbers from 0 to 100 included that are multiple of 3*
** print all numbers from 0 to 100 included that are multiple of 5*
** print all numbers from 0 to 100 included that are multiple of 15*

D’ailleurs si je ne le fais pas j’ai droit à:

On line 1 I'm expecting:

```
0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99
```

You gave nothing.

Voilà ce qui se passe si je ne fais pas de print.

A côté de ces 3 lignes, d’autres tests sont fait, mais je ne sais pas en quoi consiste ces tests.

Même si mon code renvoie bien la réponse au problème posé, il y a quand même quelque chose qui ne va pas.

essaie le code ci dessous, pour voir ce qu’il te dit:

", ".join(str(value) for value in range(101) if value % 3 == 0 or value % 5 == 0 or value % 15 == 0)

Comme spécifié dans l’énoncé :

After your filtered function, you’ll write three lines using your filtered function and lambdas

Il faut donc avoir ta fonction filtered, puis imprimer 3 lignes en fournissant donc 3 fonctions lambdas de tri différentes :

def filtered(ma_liste, ma_fonction_de_tri):
    je filtre la liste
    je renvoi la liste filtrée

j'appelle ma fonction filtered en filtrant pour les multiples de 3
j'affiche le résultat
j'appelle ma fonction filtered en filtrant pour les multiples de 5
j'affiche le résultat
j'appelle ma fonction filtered en filtrant pour les multiples de 15
j'affiche le résultat

Et voilà :wink:

1 « J'aime »

je n’avais pas l’énoncé, mais tu peux quand même te servir de join.

pour filtrer tes résultats regarde du côté de la fonction filter interne à python, cela te permettra de te servir d’une lambda

Alors, merci pour ta réponse, mais c’est bien ce que je fais et comme stipulé je les ‘wrap’ dans un:

if __name__ == '__main__':

et la oui c’est bien ce que je fais, j’appelle ma fonction avec le filtre sous forme de fonction lambda:

if __name__ == '__main__':
    
    rang = [value for value in range(101)]
        
    filtered(rang, lambda x: x%3 == 0)
    filtered(rang, lambda x: x%5 == 0)
    filtered(rang, lambda x: x%15 == 0)

Dans l’énoncé il est dit:

In this exercise, you’ll write a function named filtered , taking two parameters: an iterable , typically a list, and a filter , a lambda expression. Your function filtered should return an iterable (a list for example).

Donc, j’envoie bien deux arguments: un iterable (la liste) et la fonction lambda. Et j’obtiens bien ce qu’ils veulent. N’empêche que j’ai la même erreur…

Ou alors il y a un truc que je n’ai pas compris dans ce que tu me dis.

Merci pour ton code, maintenant le mien a clairement plus de gueule :slight_smile:
Sauf que même problème.

Pour le set je ne vois pas vraiment l’intérêt car ils veulent une liste et je l’ai fait très facilement avec le append, et elle est dans le bon ordre du premier coup :slight_smile: Alors qu’avec le set il faurait que je la réordonne. Ca éviterait les duplications mais en fait là ça ne doit pas poser de problème.

Sinon voilà ce que j’ai fait avec le join() et j’obtiens bien les 3 strings voulus sans mon cafouillis avec les rstrip() :

def filtered(lst, func):
    
    solution_iter = []
    
    for i in lst:
        if func(i):
            solution_iter.append(i)

    print(", ".join(str(value) for value in solution_iter))

    return solution_iter

if __name__ == '__main__':
    
    rang = [value for value in range(101)]
        
    filtered(rang, lambda x: x%3 == 0)
    filtered(rang, lambda x: x%5 == 0)
    filtered(rang, lambda x: x%15 == 0)

C’est plus joli, sinon je n’ai pas bien compris ce que tu me dis avec le filer interne Python mais je vais rechercher un peu de ce côté là.

Et donc l’erreur est la même, apparemment ils font un test qui retourne:

1, 2, 3

et ce résultat n’est pas bon.
Lorsque mes arguments sont le range(101) et les fonctions lambda x: x%3 == 0 , (ou 5 ou 15), ça fonctionne.
Quels arguments peuvent renvoyer 1,2,3 … tout en invalidant mon code ?

c’est la fonction filter

exemple :

", ".join(str(value) for value in filter(lambda x: x % 15 == 0, range(101)))

Ah je connaissais pas encore, ça me donne exactement le même résultat mais je trouve ça plus intéressant, car je reprend directement les arguments passées à la fonction, sans une variable intermédiaire.

Par contre euh… ben ça me renvoie la même erreur…

Doit y avoir un truc tellement gros que je le vois pas…

tu renvoie un itérable, mais je pencherai pour le fait que le print tu ne le fais pas dans le main, mais dans la fonction.
le lien pour la fonction filter de la doc python:
https://docs.python.org/fr/3/library/functions.html#filter

profites en pour regarder la fonction map:
https://docs.python.org/fr/3/library/functions.html#map

c’est deux fonctions s’utilisent surtout au début quand on est pas à l’aise avec des listes en intentions ou générateurs en intention, mais elles sont très utiles

regarde le message de Mindiell :

def filtered(ma_liste, ma_fonction_de_tri):
je filtre la liste
je renvoi la liste filtrée

j’appelle ma fonction filtered en filtrant pour les multiples de 3
j’affiche le résultat
j’appelle ma fonction filtered en filtrant pour les multiples de 5
j’affiche le résultat
j’appelle ma fonction filtered en filtrant pour les multiples de 15
j’affiche le résultat

Pfff… ben oui j’ai pas bien lu sa réponse, il m’a donné la solution en fait…

Pourtant j’ai lu l’énoncé, mais pas assez attentivement, c’est clair…

Un grand merci à toi en tout cas, le temps que tu as pris et l’éclairage que tu m’as donné !

Je vais lire la doc sur map et filter.

J’avais bien mal lu ta réponse… Oui c’est la solution !

Un grand merci à toi ! :slight_smile: :grinning: :grinning:

(Et encore une fois il suffisait de lire bien attentivement l’énoncé… et les réponses que les gens me donnent pour m’aider !)

C’est bien ça ;o)
Tant mieux si tu as réussi !

je suis autodidacte, et dans ma phase d’apprentissage j’aurais aimé, que des gens m’aident, alors si je peux aider, ça m’aide aussi.

les énoncés sont parfois d’une première lecture difficile, ou en tous cas, sur des choses dont ont à pas l’habitude.

surtout n’hésites pas …

Merci !

De mon côté, je suis la formation de Développeur d’Application Python sur Openclassrooms. Juste avant ça j’avais fait la formation développeur web, chez Openclassrooms aussi et bien qu’ayant bien réussi la formation, et en temps voulu, je ne me sentais pas vraiment très doué pour autant, alors j’ai enchainé avec cette formation Python, qui est un peu plus sérieuse. \

Mon ‘mentor’ m’a conseillé de m’entrainer sur HackInScience avec de continuer sur le prochain projet (j’aborde le 4ème sur 13). Voilà comment j’en arrive ici :slight_smile: Apprendre chez Openclassrooms c’est beaucoup de travail personnel, et il faut se débrouiller pour aller chercher la bonne info.

J’aime ce que je fais (je viens de lire un truc sur les descripteurs dans la doc Python, c’est vraiment intéressant) mais je me demande vraiment si je suis à la hauteur. Par exemple, là j’avais tout mon temps, j’ai commencé les exercices HackInScience mardi dernier ou mercredi dernier, on est dimanche et je n’ai toujours pas terminé alors que je n’ai bossé que là dessus… en même temps j’ai lu pas mal de choses à coté mais bon, je pense que je devrais clairement avancer plus vite que ça… bref, je m’y remet :slight_smile:

Et bravo pour ton attitude !

RafaRemote,
quand on à galérer comme moi, je t’assures qu’on a du coup envie d’aider les autres.
ne t’inquiètes pas, a un moment il va y avoir un déclic.
Les trois trucs les plus importants à savoir:

  1. si tu aides les autres tu t’aide toi moi même, car des fois tu vas aller chercher pour aider
  2. ne cherche pas des choses compliquées dans 95% des cas ça fait se que cela dis
  3. faire des pauses.