Оценка для циклов в Python, содержащих массив со встроенным циклом for - PullRequest
1 голос
/ 22 марта 2010

Я искал следующий код в Python:

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

Очевидно, что это для каждого цикла, говоря для каждого объекта в массиве foo. Тем не менее, у меня возникли проблемы с чтением массива. Если бы это было просто:

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

это имело бы какой-то смысл, учитывая, что использование разных объектов с одним и тем же именем ob кажется мне странным, но это выглядит достаточно читабельным, говоря, что массив состоит из каждого элемента в этом цикле. Тем не менее, использование 'ob' перед циклом for не имеет большого смысла, есть ли какой-то синтаксис, которого нет в том, что я видел в документации?

Спасибо

Ответы [ 4 ]

1 голос
/ 22 марта 2010

Это синтаксис для понимания списка .

0 голосов
/ 22 марта 2010

Это может помочь вам увидеть, что происходит, переписать ваш пример кода в этот эквивалентный код:

temp_list = [ob for ob in context.scene.objects if ob.is_visible()]
for ob in temp_list:
    pass
0 голосов
/ 22 марта 2010

Это понимание списка. Вы можете прочитать это как:

создать список с помощью [some_new_value for the_current_value in source_list_of_values if matches_criteria]

Подумайте о:

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

Это означает, что для каждого элемента, n, создайте запись в новом списке со значением n*2. Итак, это даст:

[2,4,6,8]

В вашем случае, поскольку значение ob не изменено, оно просто фильтрует список на основе ob.is_visible(). Итак, вы получаете новый список всех видимых ob.

0 голосов
/ 22 марта 2010

Первое ob является выражением, возьмем этот простой пример:

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

Что читает, создайте список из range(10), если x даже затем возвести в квадратОткажитесь от любого нечетного значения x.

...