Вариант использования для вложенных/нескольких пониманий списка или выражений генератора. Когда это более изящно?

Из того, что я могу почерпнуть из того, что я нашел в Интернете, в большинстве случаев удается избежать какого-то странного соглашения об именах, которое из того, что я прочитал, вероятно, не очень хорошая идея для начала.

.\31\/2, .\32\/4, .\36\/12 { /* this */
.1/2, .2/4, .6/12 { /* translates to this */
  width: 50%;
}

.\31\/3, .\34\/12 { /* this */
.1/3, .4/12 { /* translates to this */
  width: 33.33333%;
}

Я не знаю, видели ли вы эту статью, но принятый ответ разбивает ее довольно хорошо. после \3 похоже на начало. тогда \/ избегает слэша.

Что означает .container. \ 31 25 \ 25 в CSS?

12
задан Ali Afshar 15 March 2009 в 23:51
поделиться

5 ответов

Проверьте PEP 202, который был, где синтаксис пониманий списка был представлен языку.

Для понимания Вашего примера от самого Guido существует простое правило:

  • Форма [... для x.. для y...] вложенные множества, с последним индексом, варьирующимся самый быстрый, точно так же, как вложено для циклов.

Также от PEP 202, который служит для ответа на вопрос:

Rationale
    List comprehensions provide a more concise way to create lists in
    situations where map() and filter() and/or nested loops would
    currently be used.

Если бы у Вас была ситуация как этот, то Вы могли бы найти, что это было более изящным. По моему скромному мнению, тем не менее, несколько вложенных пониманий списка могут быть менее ясными в Вашем коде, чем вложенный для циклов с тех пор for циклы легко анализируются визуально.

19
ответ дан 2 December 2019 в 03:29
поделиться

Если Вы волнуетесь по поводу слишком большой сложности на одной строке, Вы могли бы разделить ее:

(k for k in 
    (j for j in 
        (i for i in xrange(10))))

Я всегда находил, что продолжения строки выглядят немного странными в Python, но это действительно помогает видеть то, что каждый - законченное цикличное выполнение. Так как дополнительное присвоение/поиск не собирается решать судьбу чего-либо, Вы могли также записать это как это:

gen1 = (i for i in xrange(10))
gen2 = (j for j in gen1)
gen3 = (k for k in gen2)

На практике я не думаю, что когда-либо вкладывал более, чем глубокое из 2 понимание, и в той точке было все еще довольно легко понять.

14
ответ дан 2 December 2019 в 03:29
поделиться

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

irange = (i for i in xrange(10))
jrange = (j for j in irange)
krange = (k for k in jrange)

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

4
ответ дан 2 December 2019 в 03:29
поделиться

В случае Вашего примера я, вероятно, записал бы это как:

foos = (i for i in xrange(10))
bars = (j for j in foos)
bazs = (k for k in bars)

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

Возможно, Вы думаете больше выражений как:

(x for x in xs for xs in ys for ys in lst)

- на самом деле это даже не допустимо. Необходимо поместить вещи в другой порядок:

(x for ys in lst for xs in ys for x in xs)

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

5
ответ дан 2 December 2019 в 03:29
поделиться

Выражение:

(k for k in (j for j in (i for i in xrange(10))))

эквивалентно:

(i for i in xrange(10))

это - почти то же:

xrange(10)

Последний вариант более изящен, чем первый.

0
ответ дан 2 December 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: