IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Le "any" est bien. Mais parfois.. [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut Le "any" est bien. Mais parfois..
    Bonjour à tous

    En effet, généralement le any() est bien. Mais là cette fois il m'a un peu enquiquiné...

    J'avais un traitement à faire sur n objets impérativement. Chaque traitement me renvoie True/False. Et je devais détecter si au-moins un traitement avait réussi.
    J'ai donc tapé sereinement flag=any(x.action() for x in tab). Et (pour moi bizarrement), le traitement ne s'est pas effectué pour tous les objets. J'ai galéré quelques minutes avant de réaliser que any() travaillait à l'économie et s'arrêtait au premier True. Un petit test rapide m'a effectivement confirmé ce fait.

    C'est certainement très utile dans la majorité des cas... mais là pour moi ben ça ne me va pas. Je dois réellement traiter tous mes objets.

    J'ai un peu cherché si je pouvais m'en sortir en jouant avec all() mais rapidement conclu que ça n'allait pas pouvoir le faire (pour les mêmes raisons => il s'arrêterait au premier False) et j'ai fini par remplacer mon instruction par celle-là: flag=bool(tuple(x for x in tab if x.action()).

    Ca fonctionne mais ça m'embête un peu. Si quelqu'un avait plus simple. Ou simplement un retour d'expérience analogue...

    Merci à tous.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux utiliser la somme des retours comme booléen.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> l = [True, True, False, True]
    >>> ll = [False, False, False, False]
    >>> if sum(l):
    ...     print("True")
    ... 
    True
    >>> if sum(ll):
    ...     print("True")
    ... 
    >>>

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    C'est certainement très utile dans la majorité des cas... mais là pour moi ben ça ne me va pas. Je dois réellement traiter tous mes objets.
    Pour quoi ne pas écrire: flag=any(list(x.action() for x in tab)) ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Tu peux utiliser la somme des retours comme booléen.
    Merci de ton retour et de ton implication.

    Ton idée utilise deux postulats:
    • un False/True peut être utilisé comme valeur mathématique qui vaut 0 (élément neutre de l'addition) / pas 0 (élément non neutre donc modifiant une somme)
    • une somme (une valeur) non nulle est vue comme True

    Même si je suis certain que ces postulats ne changeront jamais, je préfère ma première solution qui n'utilise qu'un seul postulat: une liste (ou un tuple) vide/non vide est vue comme False/True.
    Désolé de te décevoir

    Citation Envoyé par wiztricks Voir le message
    Pour quoi ne pas écrire: flag=any(list(x.action() for x in tab)) ?
    Euh... parce que je n'y avais pas pensé .

    Effectivement je suis parti avec l'"à priori" que le any() s'arrêterait au premier True et donc qu'il n'était pas utilisable... alors qu'effectivement c'est possible si on prend la précaution de créer d'abord la liste avant de l'évaluer.

    Pffou, je suis fatigué aujourd'hui !!!

    Merci à tous les deux
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Un grand merci pour cette question. J'étais justement sur ce problème, mais moi, je voulais que any s'arrête au 1er "True", et je ne pensais pas que c'était possible.

    En effet, la notice dit que any est équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False
    Mais quand j'essayais, je mettais toujours des crochets, et tous les éléments étaient calculés. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def test(y):
        print(y)
        return y==3
     
    x = any([test(i) for i in range(1, 6)])
    print(x)
    1
    2
    3
    4
    5
    True
    Alors qu'il suffit de retirer les crochets pour que la construction de la liste s'arrête au 1er "True":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    x = any(test(i) for i in range(1, 6))
    print(x)
    1
    2
    3
    True
    [edit]: c'est pareil pour all() qui peut s'arrêter au 1er "False" sans les crochets!

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Mais quand j'essayais, je mettais toujours des crochets
    Oui, je t'ai effectivement déjà vu mettre des crochets là où ce n'était pas forcément nécessaire (voir ici). A ce moment là, je ne voyais ça que comme une inutilité sans conséquence.
    Alors que maintenant, au vu des remarques de wiztricks, non seulement ça se recoupe mais en plus cela a des conséquences (conséquences que tu déplores )
    En mettant des crochets, tu génères une liste en intension, et la liste générée est alors complète. Puis ensuite tu appelles all(...) sur la liste générée. Exactement comme dans cet exemple adapté du tien mais écrit dans la syntaxe proposée par wiztricks x = any(list(test(i) for i in range(1, 6)).
    Toutefois je préfère alors de loin utiliser cette dernière syntaxe, bien plus explicite, que passer par une liste en intension au risque de n'être pas compris par un autre programmeur ensuite (ou bien par moi dans 6 mois)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Le cinéma en 3D, c'est bien mais..
    Par Louis Griffont dans le forum Films & TV
    Réponses: 22
    Dernier message: 25/09/2009, 15h09
  2. ClearType, c'est bien, mais euh, bon
    Par JolyLoic dans le forum Windows Vista
    Réponses: 5
    Dernier message: 19/04/2008, 01h37
  3. [PHP-JS] GET c'est bien mais je prèfèrerais POST
    Par Rniamo dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2008, 18h46
  4. [Surprise] Telnet c'est bien sympa parfois.
    Par davcha dans le forum La taverne du Club : Humour et divers
    Réponses: 25
    Dernier message: 19/07/2006, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo