Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TP] Notions de programmation fonctionnelle

map, reduce, compose… open your mind!

Sujet résolu
    28 juin 2011 à 23:00:18

    OK, donc je me retrouve avec quelque chose à peu prés comme ça :

    def my_reduce_rec_it_(fn,iterable,acc):
        try:
            acc = fn(acc, next(iterable))
            return my_reduce_rec_it_(fn,iterable,acc)
        except StopIteration:
            return acc
    
    def my_reduce_rec_it(fn, iterable, acc):
            return my_reduce_rec_it_(fn, iter(iterable), acc)
    


    C'est tout sauf joli, je trouve (surtout à cause du try: except:) :-° .
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2011 à 23:10:27

      C'est normal : cette façon de faire, bien que fonctionnellement intéressante, n'entre pas du tout dans le cadre de la philosophie python. En python, ce genre d'objet est fait pour qu'on itère dessus plus que pour contenir des données auxquelles on accède individuellement.
      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2013 à 10:42:53

        j'ai du mal a comprendre ce que l'on doit faire avec compose_2

        ca doit faire ca ?

        >>> list(compose_2(func_1(1),func_2(45),func_5(5,4,7)))
        [2,4,5] #je dis n'importe quoi...



        -
        Edité par Smich74 5 juillet 2013 à 10:43:38

        • Partager sur Facebook
        • Partager sur Twitter
        Si c'était facile, tout le monde le ferait.
          5 juillet 2013 à 14:01:34

          Smich74 a écrit:

          j'ai du mal a comprendre ce que l'on doit faire avec compose_2

          La fonction compose1 retourne la fonction composée de 2 fonctions.

          La fonction compose2 doit faire la même chose mais avec un nombre arbitraire de fonctions.

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            5 juillet 2013 à 15:10:23

            ok donc en fait c'est compose_1 mais avec comme parametre *arg

            mais pourquoi une fonction ? on peut pas directement renvoyer le resultat ? :o

            et si l'on fait ça on suppose donc que toutes les fonctions renvoyent des entiers ?

            -
            Edité par Smich74 5 juillet 2013 à 15:12:41

            • Partager sur Facebook
            • Partager sur Twitter
            Si c'était facile, tout le monde le ferait.
              5 juillet 2013 à 16:14:23

              Smich74 a écrit:

              ok donc en fait c'est compose_1 mais avec comme parametre *arg

              C'est ça.

              mais pourquoi une fonction ? on peut pas directement renvoyer le resultat ? :o

              Parce que tu peux vouloir précalculer ta fonction. Pour la réutiliser plusieurs fois, la repasser en paramètre d'autres fonctions, etc.

              et si l'on fait ça on suppose donc que toutes les fonctions renvoyent des entiers ?

              Non pas forcément, tant que la fonction N prend en entrée le même type que ce que retourne la fonction N-1. ;)

              -
              Edité par nohar 5 juillet 2013 à 16:14:55

              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                5 juillet 2013 à 21:11:40

                j'ai pas mal cherché mais j'ai enfin trouvé le one-line (on dit one line ou one-liner ?) 

                compose =lambda a_arg, *arg :lambda a_arg,arg:reduce(lambda j,k :k(j),arg, a_arg)



                -
                Edité par Smich74 6 juillet 2013 à 10:41:33

                • Partager sur Facebook
                • Partager sur Twitter
                Si c'était facile, tout le monde le ferait.
                  6 juillet 2013 à 10:53:38

                  j'ai encore une petite question (oui je sais je suis chiant :p):

                  pour mymap2 c'est marqué que on doit faire en sorte que reduce se comporte comme map.ok mais pour quelle fonction

                  car si j'ai bien compris

                  for i in map(lambda e:e*2,[0,1,2,3,4,5]:
                      print(i)
                  

                  doit faire pareil que :

                  for i in mymap2(lambda e:e*2,[0,1,2,3,4,5]:
                      print(i)

                  sinon voici mes autres codes:

                  compose_2 = lambda a_arg, *func :lambda a_arg,*func:reduce(lambda j,k :k(j),func, a_arg)
                  
                  mymap = lambda func,liste : [func(i) for i in liste]
                  
                  mymap_gen = lambda func, liste :map(func,liste)
                  
                  compose = lambda func_1,func_2,arg:func_1(func_2(arg))






                  -
                  Edité par Smich74 6 juillet 2013 à 10:57:06

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Si c'était facile, tout le monde le ferait.

                  [TP] Notions de programmation fonctionnelle

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown