Y a-t-il un meilleur moyen d'écrire ce qui suit:
for item in sequence: #process item *else*: #handle the empty sequence case
5 Réponses :
it = empty_adaptor(some_iter) if it is not None: for i in it: # handle items else: # handle empty case
J'ai besoin de traiter tous les éléments de la liste, pas seulement le premier. Pour traiter le reste des articles, je devrai configurer une autre boucle, ce qui rendra toute la solution encore moins concise que l'original.
On dirait que la consommation d'un article n'est pas une option pour le O.P. Étant donné que H E doit "faire des choses" avec chaque article.
@DMITRY BERANSKY: Si vous devez consommer tous les éléments, vous pouvez écrire un adaptateur qui accepte une iérente comme entrée et retourne Aucun code> s'il est vide ou donne la même séquence d'éléments que son entrée. Pour la mise en œuvre, vous pouvez utiliser la variante la plus lisible parmi fournie dans cette question jusqu'à présent.
if not iterable_sequence.__length_hint__(): empty() else: for item in iterable_sequence: dostuff()
Cela déclencherait-il pas un appel à Len ()?
Il déclencherait un appel à LEN () pour des séquences déjà évaluées, ce qui n'est pas un problème - il n'appellerait pas len code> sur d'autres itérables - car ils n'ont généralement pas de
len code> quand même. Cependant, ces itérables testeront toujours comme true, à moins d'avoir spécialement surchargé cette opération (comme
xrange code> fait).
C'est peut-être un travail pour itertools.tee
Vous "déclencher" la séquence sur la vérification, mais vous êtes laissé avec une copie intacte de la séquence par la suite: (il vaut la peine de nuler que Par conséquent, votre chemin est suffisamment simple -
Une autre façon serait de supprimer le nom "article" avant la déclaration "pour" et
Vérifiez si cela existe après la boucle: p> mais votre code doit être utilisé comme plus clair que celui-ci. P> P> TEE code> est-ce " droite "chose ici: il chargera simplement le premier élément de la séquence dans le moment
check.next () code> est exécuté - et ce premier élit restera disponible dans la séquence
code> . Les articles restants ne seront extraits que dans le cadre de la boucle code> pour code>
Ou juste le garder simple:
Si vous ne pouvez pas utiliser Len, vous ne pouvez pas vérifier si la séquence a une valeur de BOOL de TRUE, pour les mêmes raisons. P>
DEL Item CODE>
SUMPRESSE SUMPRESSEEELREROR CODE> Si le nom
L'élément code> n'a pas été défini.
Utilisation de TEE CODE> n'est probablement pas la voie à suivre - il va tamponner tous les éléments, attendre
vérifier code> pour être itéré. Pour une longueur finie, une liste code> code> peut être plus efficace, pour une longueur infinie itable, elle fuit silencieusement la mémoire. Vérification de
NameError code> est brillant, cependant.
Le deuxième exemple de JF Sebastian semble être le ticket avec une boucle tandis que. Pas le plus concis mais de manière objective la ... boue, non? P> < / p>
Cela ne devrait pas déclencher len () code>:
[10 ans plus tard :-)] C'est la meilleure réponse pour le python moderne.
Un meilleur moyen de l'écrire - dans quel but?
Pour le rendre plus concis et plus idiomatique. (Je vais ajouter ceci à ma question)
Un orèse pourrait répondre à cela pour vous; Quelque chose comme db-api's
.fetchone () code> ou
First () code> méthodes retour
Aucun code> Si le jeu de résultats est vide (pas de lignes).
Voir Stackoverflow.com/Questtions/1952464/...
Personnellement, je trouve le code d'origine plus lisible et idiomatique que les réponses données. (Une variable de drapeau booléenne
is_empty code> serait également approprié.) @Mtrw: iter ([]) renvoie un itérateur, mais est une séquence vide.