2010-03-22 15 views
1

je regardais le code suivant en python:évaluation des boucles en python, contenant un tableau avec un intégré pour boucle

for ob in [ob for ob in context.scene.objects if ob.is_visible()]: 
    pass 

De toute évidence, il est un pour chaque boucle, dire pour chaque objet dans le tableau foo. Cependant, j'ai un peu de mal à lire le tableau. Si elle avait juste:

[for ob in context.scene.objects if ob.is_visible()] 

qui rendrait un certain sens, accordé l'utilisation d'objets différents avec le même nom ob me semble étrange, mais il semble assez facile à lire, en disant que le tableau se compose de chaque élément de ce boucle. Cependant, l'utilisation de 'ob', avant que la boucle for ait peu de sens, existe-t-il une syntaxe qui ne soit pas dans ce que j'ai vu dans la documentation?

Merci

Répondre

1

C'est la syntaxe pour list comprehension.

+0

Donc, vous disiez que le premier mot est l'opération, il préformes sur chaque objet qu'il obtient? Et parce qu'il n'y a rien d'autre que l'ob, il ne fera rien? –

+0

C'est une expression pour l'objet qui va dans la liste en cours de construction. L'expression est juste 'ob', donc il n'y a pas de changement. –

0

La première ob est une expression, prenez cet exemple simple:

>>>> [ x**2 for x in range(10) if x%2 == 0 ] 
[0, 4, 16, 36, 64] 

qui se lit, créez une liste de range(10), si x est même carré il. Ignorer toute valeur impaire de x.

0

C'est une compréhension de liste. Vous pouvez le lire comme:

créer une liste avec[some_new_value for the_current_value in source_list_of_values if matches_criteria]

Pensez:

[n*2 for n in [1,2,3,4]] 

Cela signifie, pour chaque article, n, créez une entrée dans une nouvelle liste avec une valeur de n*2. Donc, cela donnera:

[2,4,6,8] 

Dans votre cas puisque la valeur ob n'est pas modifiée, il est juste un filtrage basé sur la liste ob.is_visible(). Vous obtenez ainsi une nouvelle liste de tous les ob visibles.

0

Il peut vous aider à voir ce qui se passe à réécrire votre code d'exemple dans ce code équivalent:

temp_list = [ob for ob in context.scene.objects if ob.is_visible()] 
for ob in temp_list: 
    pass 
Questions connexes