Из того, что я могу почерпнуть из того, что я нашел в Интернете, в большинстве случаев удается избежать какого-то странного соглашения об именах, которое из того, что я прочитал, вероятно, не очень хорошая идея для начала.
.\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
похоже на начало. тогда \/
избегает слэша.
Проверьте PEP 202, который был, где синтаксис пониманий списка был представлен языку.
Для понимания Вашего примера от самого Guido существует простое правило:
Также от 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
циклы легко анализируются визуально.
Если Вы волнуетесь по поводу слишком большой сложности на одной строке, Вы могли бы разделить ее:
(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 понимание, и в той точке было все еще довольно легко понять.
Так как они - выражения генератора, можно обязать каждого со своим собственным именем делать это более читаемым без любого изменения в производительности. Изменение его к вложенному циклу, вероятно, было бы вредно для производительности.
irange = (i for i in xrange(10))
jrange = (j for j in irange)
krange = (k for k in jrange)
Это действительно не имеет значения, который Вы выбираете, я думаю, что многострочный пример более читаем в целом.
В случае Вашего примера я, вероятно, записал бы это как:
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)
Я мог бы записать, что как быстрый способ сгладить список, но в целом я думаю, что Вы - запись: время, которое Вы экономите путем ввода меньшего, обычно балансируется дополнительным временем, Вы тратите разбирание в выражении генератора.
Выражение:
(k for k in (j for j in (i for i in xrange(10))))
эквивалентно:
(i for i in xrange(10))
это - почти то же:
xrange(10)
Последний вариант более изящен, чем первый.