Вопрос по syntax, list-comprehension, python – Квадратные скобки не требуются в списочном понимании при использовании в функции

8

Я отправил запрос на получение с этим кодом:

my_sum = sum([x for x in range(10)])

Один из рецензентов предложил это вместо:

my_sum = sum(x for x in range(10))

(разница только в том, что квадратные скобки отсутствуют).

Я был удивлен, что вторая форма кажется идентичной. Но когда я попытался использовать его в других контекстах, где работает первый, он не работает:

y = x for x in range(10)
        ^ SyntaxError !!!

Эти две формы идентичны? Есть ли важная причина того, почему квадратные скобки не нужны в функции? Или это просто то, что я должен знать?

This link может быть полезным jadkik94
Существуют также словарь и набор определений на случай, если вы о них не слышали. Amr

Ваш Ответ

4   ответа
2

Первый - это списки, где второй - выражение генератора.

    (x for x in range(10))
    <generator object at 0x01C38580>
    >>> a = (x for x in range(10))
    >>> sum(a)
    45
    >>> 

Используйте скобку для генераторов:

>>> y = (x for x in range(10))
>>> y
<generator object at 0x01C3D2D8>
>>> 
0

Прочитай этоОПТОСОЗ: 289

For instance, the following summation code will build a full list of squares in memory, iterate over those values, and, when the reference is no longer needed, delete the list:

sum([x*x for x in range(10)])

Memory is conserved by using a generator expression instead:

sum(x*x for x in range(10))

As the data volumes grow larger, generator expressions tend to perform better because they do not exhaust cache memory and they allow Python to re-use objects between iterations.

Используйте фигурный генератор:

>>> y = (x for x in range(10))
>>> y
<generator object <genexpr> at 0x00AC3AA8>
17

Это выражение генератора. Чтобы заставить его работать в автономном случае, используйте фигурные скобки:

y = (x for x in range(10))

и у становится генератором. Вы можете перебирать генераторы, чтобы он работал там, где ожидается итерация, напримерsum функция.

Usage examples and pitfalls:

>>> y = (x for x in range(10))
>>> y
<generator object <genexpr> at 0x0000000001E15A20>
>>> sum(y)
45

Будьте осторожны при хранении генераторов, вы можете пройти их только один раз. Итак, после вышеизложенного, если вы попытаетесь использоватьsum опять это случится

>>> sum(y)
0

Поэтому, если вы передадите генератор, где на самом деле ожидается список, набор или нечто подобное, вы должны быть осторожны. Если функция или класс хранит аргумент и пытается выполнить его несколько раз, вы столкнетесь с проблемами. Например, рассмотрим это:

def foo(numbers):
    s = sum(numbers)
    p = reduce(lambda x,y: x*y, numbers, 1)
    print "The sum is:", s, "and the product:", p

он потерпит неудачу, если вы передадите ему генератор:

>>> foo(x for x in range(1, 10))
The sum is: 45 and the product: 1

Вы можете легко получить список из значений, которые генерирует генератор:

>>> y = (x for x in range(10))
>>> list(y)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Вы можете использовать это, чтобы исправить предыдущий пример:

>>> foo(list(x for x in range(1, 10)))
The sum is: 45 and the product: 362880

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

Why use a generator in your situation?

Гораздо более низкое потребление памяти является причинойsum(generator expression) лучше, чемsum(list): Версия генератора должна хранить только одно значение, в то время как вариант списка должен хранить N значений. Поэтому вы всегда должны использовать генератор, где вы не рискуете побочными эффектами.

Кроме того, выражения генератора часто используют меньше памяти, потому что промежуточный список не создается.
4

Они не идентичны.

Первая форма,

[x for x in l]

это понимание списка Другое является выражением генератора и написано так:

(x for x in l)

Возвращает генератор, а не список.

Если выражение генератора является единственным аргументом в вызове функции, его скобки могут быть пропущены.

УвидетьОПТОСОЗ 289

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