2012-02-15 5 views
9

Я хочу, чтобы определить, если список содержит определенную строку, поэтому я использую выражение генератора, например, так:выражения генератора Python круглых скобок странности

g = (s for s in myList if s == myString) 
any(g) 

Конечно, я хочу, чтобы встраивать это, так что я:

any((s for s in myList if s == myString)) 

Тогда я думаю, что это будет выглядеть лучше с одиночными круглыми скобками, поэтому я стараюсь:

any(s for s in myList if s == myString) 

не действительно EXPE он работает. Сюрприз! оно делает!

Так что это легальный Python или что-то, что позволяет моя реализация? Если это законно, каково общее правило здесь?

ответ

11

Это законно, и общее правило заключается в том, что вам нужны скобки вокруг выражения генератора. В качестве особого исключения круглые скобки из вызова функции также подсчитываются (для функций только с одним параметром). (Documentation)

Обратите внимание, что тестирование, если my_string появляется в my_list не так легко, как

my_string in my_list 

Нет экспрессии генератора или позвонить в any() необходимо!

+0

Спасибо за ответ. 'my_string in my_list' был первым, что я пробовал, но он не смог найти строку, которая присутствовала. Я пришел к выводу, что это сравнение объектов, а не сравнение стоимости, и это то, что мне нужно. Я еще раз проверю. – Ari

+0

@Ari: Нет, это сравнение значений. Я не знаю, что пошло не так в вашем случае. –

+0

Yup, это работает. Наверное, у меня там была другая ошибка. – Ari

3

Это «законный» и явно поддерживается. Общее правило: «((x)) всегда такое же, как (x)» (хотя (x) не всегда совпадает с x, конечно), и он применяется к выражениям генератора просто для удобства.

+2

Просто, чтобы уточнить, 'x' не является местом для всего, что угодно. 'f ((a, b))', конечно, отличается от 'f (a, b)'. –

+1

Да, действительно, это заполнитель для одного выражения. –

+0

Можете ли вы предоставить ссылку для этого правила (что ((x)) всегда совпадает с (x))? – Ari