开发者

Evaluating for loops in python, containing an array with an embedded for loop

开发者 https://www.devze.com 2022-12-23 23:56 出处:网络
I was looking at the following code in python: for ob in [ob for ob in context.scene.objects if ob.is_visible()]:

I was looking at the following code in python:

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

Obviously, it's a for each loop, saying for each object in foo array. However, I'm having a bit of trouble reading the array. If it just had:

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

that would make some sense, granted the use of different objects with the same name ob seems odd to me, but it looks readable enough, saying that the array consist开发者_JAVA百科s of every element in that loop. However, the use of 'ob', before the for loop makes little sense, is there some syntax that isn't in what I've seen in the documentation?

Thank you


That is the syntax for list comprehension.


The first ob is an expression, take this simple example:

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

Which reads, create a list from range(10), if x is even then square it. Discard any odd value of x.


It's a list comprehension. You can read it as:

create a list with [some_new_value for the_current_value in source_list_of_values if matches_criteria]

Think of:

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

This means, for every item, n, create an entry in a new list with a value of n*2. So, this will yield:

[2,4,6,8]

In your case since the value ob is not modified, it's just filtering the list based on ob.is_visible(). So you're getting a new list of all ob's that are visible.


It might help you see what's going on to rewrite your example code into this equivalent code:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号