2016-03-31 3 views
3

Ниже приведен полный фиктивный код. Но предположим, что вам нужно сделать некоторые дополнительные побочные действия для вызовов функций (для отладки журналов)? Как бы вы это выразили?Python добавляет дополнительный код для встроенных циклов?

[ i for i in range(10) ] 

Или всегда нужно переписывать как нормальный цикл?

list=[] 
for i in range(10): 
    otherStuff() 
    list.append(i) 

В C, есть запятая оператор для таких вещей ...

+2

'[some_function (i) для i в диапазоне (10)]'? – jDo

+5

IMHO Если функция вызвана для ее побочных эффектов, следует использовать явный цикл. Если функция вызывается для ее возвращаемого значения, следует использовать понимание списка. –

+0

Оператор запятой в C? О чем ты говоришь? – freakish

ответ

3

Вам нужно включить вызов вашего кода с побочным эффектом, где-то в вашем выражении значения, но вам нужно проигнорировать это значение.

or - один из возможных вариантов для этого. Просто убедитесь, что функция побочного эффекта возвращает значение «Falsey» (False, None, 0 и т. Д.) И поместит ваш отладочный вызов в левую сторону or.

def debug_func(i): 
    print i, i**3 
    return None 
whole_numbers = [ debug_func(i) or i for i in range(10) ] 
print whole_numbers 

В качестве альтернативы, ваша функция может быть тождественной функцией, всегда возвращая свой единственный аргумент:

def debug_func(i): 
    print i, i**3 
    return i 

# Production code: 
whole_numbers = [i for i in range(10)] 

# Debug code 
whole_numbers = [debug_func(i) for i in range(10)] 
+2

Пс. Я согласен с другими. Не делай этого. Но вы не спрашивали **, если ** вы должны это сделать, вы спросили **, как вы могли бы это сделать. –

+4

Важно, чтобы функция побочного эффекта возвращала значение Falsey здесь! Это очевидно, если вы уже видели эту конструкцию раньше, но в меньшей степени иначе :) –

+0

Это чисто для отладки кучи списков. Я обещаю использовать экономно. ;) – Chris

6

Толком, не используют побочные эффекты в списковых. Это делает ваш код невероятно непонятным для следующего человека, который должен его поддерживать, даже если вы его прекрасно понимаете. Список понятий - это лаконичный способ создания списка, а не способ вызова функции n раз.

Для дальнейшего чтения Смотрите вопросу Is it Pythonic to use list comprehensions for just side effects?

Других слова, вы должны использовать явную for петли для этого.

+0

В этом случае это временный код отладки. – Chris

+1

@ Крист программист-время и простота использования - это общий компромисс. Лучшей практикой является использование явного цикла 'for'. YMMV –

+0

@Chris Вы хотите отладить список? Не имеет большого смысла. Просто напечатайте его потом. – freakish

1

Вот один вариант, который не требует ничего о том, что ваша функция возвращает:

[(myfunc(), i)[1] for i in range(10)] 

Вы также можете сделать больше, чем одну функцию в то время:

[(myfunc(), myfunc2(), i)[-1] for i in range(10)] 
Смежные вопросы