Если это большой список, и вам нужно обработать идентификаторы только один раз, тогда есть также выражения генератора.
ids = (obj.id for obj in my_objects)
for id in ids:
do_something(id)
Выражение генератора не поддерживает произвольный доступ, но будет получать каждый идентификатор по требованию и, следовательно, избегает создания списка сразу. выражения генератора равны xrange
, а списочные выражения - range
.
Еще одно предостережение с выражениями генератора заключается в том, что к нему можно получить доступ только до тех пор, пока любой ресурс в нем все еще открыт. Например, следующий код завершится ошибкой.
with open(filename) as f:
lines = (line for line in f)
# f is now closed
for line in lines:
print line
В этом случае сработало бы эквивалентное понимание списка.