Mais je crois que le plus gros problème dans ton code, c’est qu’il ne gère pas tous les itérables : il ne gère que les itérables qui ont __len__. Donc il ne gère aucun stream (IOstream, ByteStream, File like objects) et il ne gère aucun objet dont la taille ne peut être définie à l’avance (expression génératrices, générateurs crées avec yield).
Dans le monde de Python, où tout est itérable, et où tout fonctionne par duck typing, ce sont de grosses lacunes.
]]>Sinon pour sortir le premier élément vrai
first=[x for x in a if fct(x)][0] if len(a) else "flammkuchen"
;)
Bon je chipote et j’en suis désolé. En plus s’il n’y a pas d’élément vrai ça renverra une exception mais sincèrement je ne vois pas l’utilité de ces fonctions. C’est vrai que être atomique c’est bien mais attention à la démesure (le “trop” est l’ennemi du bien). S’il commence à y avoir trop de fonctions de ce genre, le code “simple et élégant” rebascule dans un code “fouillis” (ah zut, à quoi sert déjà la fonction first_true” ? et “second_false” ? et “third_any_else” ? etc etc etc…)
Ton cas ne gère pas non plus les hashable (dicos, counter), puisqu’ils ont une taille, mais pas d’ordre, et donc pas d’élément 0. Même si le cas est plus rare car on récupère pas souvent le premier élément d’un non ordonné, on perd donc en prime le duck typing dans le cas de traitement de séquences hétérogènes.
Enfin ceci ne gère pas le cas de si on veut le premier élément vrai.
Ce genre de fonction n’est pas indispensable, mais l’utilisation de nombreuses fonctions de ce genre amène à un code simple et élégant.
]]>first=x[0] if len(x) else "autre chose"
marche aussi bien…
Mais c’est bien de faire ce genre d’article. Mieux vaut un article inutile de temps en temps que ne rien faire et laisser passer les trucs fabuleux que j’ai lu ici :)
]]>Bof, trop d’arguments tue la fonction :-P
]]>(désolé :x)
]]>