Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 Re : Programmation » [Python] Appartenance d'un element à une liste [Résolu] » 06-02-2013 16:32:22

Barbichu a écrit :

Salut Garulfo,

je suis plutôt d'accord sur le fond, tes programmes sont en effet plus concis, plus abstrait (et plus lisibles pour moi, mais je ne sais pas si ce sera le cas de Bibi ou de totomm, je ne connais pas leur formation) et répondent à la question initiale, mais je dois m'indigner sur la forme.

Déjà, python n'est pas un langage fonctionnel (même si certaines composantes du langages permettent de faire de la programmation fonctionnelle) et les listes n'y sont pas des objets persistants. Je ne vois pas en quoi la structure de la liste python est "récursive" [...]

(Au passage tu avais fait une erreur : l'élément initial pour le reduce doit être False)

Oupss ^^ tu as raison pour le False. Au temps pour moi.

Oui ce n'est pas un langage fonctionnel et il est vrai aussi que les listes ne sont pas (à l'interne) récursive.
Mais de l'externe une liste a une spécification récursive. Son comportement et sa conception est récursive.
Avant d'apprendre à optimiser localement (« la racine du mal » comme disait Dijkstra), il faut "élever" sa vue.
Et c'est pourquoi je pense que c'est une meilleure solution.

Pour ta version « impérative », je n'aime pas les fonctions qui retournent des valeurs booléennes. Ce sont souvent des manques de temps dans l'écriture de la formule sous jacentes. Dans ce cas précis, il est clair que le for rend l'écriture de la formule plus complexe (il faut un forall et je ne sais pas si c'est disponible dans les biblios Python), mais ça se fait quand même bien... — je le ferais après mon cours, je n'ai pas le temps là et j'aimerais éviter un autre True qui devrait être un False

Le fait que tu les trouves plus lisibles "montrent" — je met ça entre guillemets car c'est loin d'être une démonstration — qu'il y a une forme de posture à acquérir pour les plus développeurs expérimentés. Or en général on ne l'acquiert pas si on ne commence pas par l'apprendre et on s'enfarge dans du code détaillé. Ça se retrouve avec des développeurs qui ont quelques années d'expérience et qui ne comprennent toujours pas qu'un itérateur est préférable à une implémentation de cet itérateur.

Maintenant c'est fort possible que ça ne répondait pas exactement à l'exercice de Bibi. Mais je n'ai pas l'habitude de donner des solutions exactes sur les forums.

Sinon personnellement je n'aime pas beaucoup Python... trop de liberté nuit à la propreté du code, à l'abstraction et à la lisibilité... et que dire de la maintenance ><  Mais c'est un avis personnel.

Bonne journée à tous

#2 Re : Programmation » [Python] Appartenance d'un element à une liste [Résolu] » 04-02-2013 20:59:23

totomm a écrit :
def inL(e,L,r=None):
    if r==None:
        r=[]
    for i in range(len(L)):
        if e in L[i]:
            r.append(i)
    return r
   
#Utilisation exemple
a =[[1,5],[3,6],[5,4],[5,6]]
b=inL(6,a)
print(b) #imprime [1, 3]

Salut,

je ne vois pas l'intérêt de ton paramètre r. Est-ce dans l'éventualité qu'on désire commencer avec une liste des indices non vides ? Ça me semble moyennement intéressant. Sinon tu ne réponds pas à la question posée par Bibi; ce qui est possiblement volontaire et certainement salutaire. Personnellement, je n'aime pas cette solution qui déconstruit la liste sans se préoccuper qu'il existe déjà des fonctions de haut niveau qui sont abstraites et bien pensées. Utiliser une structure de liste impose de penser en liste. Et une liste est récursive. Donc a priori, la solution la plus « naturelle » est la solution récursive. On peut la détailler, mais il s'avère qu'on peut aussi se rendre compte vide que ce n'est qu'un cumule d'une application (map) et d'un pliage (fold, appelé reduce en python).

Une première solution serait de décomposer en deux étapes le traitement

import operator
#Fonction inL
def inL(e,L):
    def e_in(L) : return (e in L)
    L1 = map (e_in, L)
    return reduce (operator.or_, L1)
#Utilisation exemple
a =[[1,5],[3,6],[5,4],[5,6]]
b=inL(6,a)
print(b) #imprime True

Une deuxième solution serait d'utiliser une fonction qui encapsule le travail du map dans le reduce pour ne faire qu'un passage dans la liste.

import operator
#Fonction inL
def inL(e,L):
    def e_in(b,L1) : return b or (e in L1)
    return reduce (e_in, L, True)
 

Bon ce n'était que mon point de vue à 2 sesterces, mais il me semble qu'un mathématicien devrait penser à une solution récursive de haut niveau avant une solution itérative détaillée. ;)

Pied de page des forums