2013-05-01 3 views
3

Итак, я пытаюсь снять трюк, о котором я впервые услышал на этом сайте.Вызов печати в середине понимания списка python

[i for i in range(0, 10) if True or print(i)] 

Идея заключается в том, что вы можете вызвать произвольную функцию на каждом шагу в listcomp, воткнув его в «если» заявление, что всегда будет возвращать True. Но этот код дает синтаксическую ошибку.

Если я обернуть функцию я хочу назвать так, хотя:

def f(i): 
    print i 

[i for i in range(0, 10) if True or f(i)] 

производит желаемый результат. Поэтому мне было интересно, какая разница, в разуме Python, между ними, потому что я не могу сказать, что это может быть - обе функции возвращают «Нет», правильно?

+2

'от __future__ import print_function'; но зачем вам вообще иметь побочный эффект? –

+2

Не используйте исключения списков вместо цикла for, если вам действительно не нужен список, который он производит. – chepner

ответ

6

Вы не можете смешивать заявления (как print в Python 2) со списком пониманием.

Однако, вы можете сделать print() функцию, добавив:

from __future__ import print_function 

в верхней части файла. Это превращает print() в функцию для модуля всего.

Однако вы используете оператор True or something, и это никогда не будет оценивать «что-то», потому что булевы выражения Python короткие. Вы хотите повернуть, что вокруг:

if print(something) or True 

Там нет смысла в оценке стороны правой руки or выражения, если левые уже оцененных в True; ничего, что может придумать правая сторона, сделает все выражение False, когда-либо.

Вы действительно хотите, чтобы избегать таких побочных эффектов в понимании списка. Используйте правильный цикл и избегайте таких неожиданностей из своего кода, используя if something or True - это действительно хак, который смущает будущих сопровождающих вашего кода (включая вас).

+0

Ах, имеет смысл. Я не знал, что print() не является функцией. И вы правы в отношении короткого замыкания: код, который я предоставил, фактически не дает правильного вывода - то, о чем я думал, было «не f (i)». –

5

В Python 2.x печать не является функцией. Он стал функцией в Python 3.

1

print - это выражение в выражении py2x, поэтому оно не может использоваться там, где ожидается выражение.

Вам необходимо импортировать print_function из __future__, чтобы заставить его работать.

In [105]: from __future__ import print_function 

In [107]: [i for i in range(0, 10) if print(i) or True] 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Out[107]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Обратите внимание, что, как print() возвращается None так в вашем or состояния он должен быть помещен первым или использовать and условие: if True and not print(i)

+0

Это возвращаемое значение понимания списка; 'print()' is * not called *. –

+0

'Истина и печать (i)' не будут делать то, что вы хотите; он будет вычислять вместо «False», и ничего не будет добавлено в результирующий список. –

+0

@MartijnPieters ах! да, забыл добавить «не» перед этим. –

Смежные вопросы