Добавить литеральный список в Python [duplicate]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

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

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

29
задан Nima Vaziri 20 May 2013 в 01:52
поделиться

3 ответа

append является мутирующей (деструктивной) операцией (она изменяет список вместо того, чтобы возвращать новый список). Идиоматический способ выполнения неразрушающего эквивалента append был бы

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]

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

m = l.append("a")
n = l.append("b")

и ожидать, что n будет [1,2,3,"b"]

37
ответ дан smci 5 September 2018 в 08:38
поделиться

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

list = [1, 2, 3]

Я бы посоветовал использовать list в качестве имени переменной, поскольку list на самом деле уже определен как встроенный тип. Как заметил ChaseTheSun и squiguy, там не так много, а затем

l = [1, 2, 3]
l.append(4)
print l  ## [1, 2, 3, 4]
3
ответ дан mgilson 5 September 2018 в 08:38
поделиться

Это соглашение в Python, что методы, которые мутируют последовательности, возвращают None.

Рассмотрим:

>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]

>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}

>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])

Начиная с Python 3.3, теперь это больше явно документировано :

Некоторые классы коллекций изменяемы. Методы, которые добавляют, вычитают или изменяют их члены на месте и не возвращают определенный элемент, никогда не возвращают сам экземпляр коллекции, но None.

Часто задаваемые вопросы по дизайну и истории дает обоснование за этим проектным решением (относительно списков):

Почему нет list.sort() возвращает отсортированный список?

] В ситуациях, когда важна производительность, создание копии списка только для сортировки было бы расточительным. Поэтому list.sort() сортирует список на месте. Чтобы напомнить вам об этом, он не возвращает отсортированный список. Таким образом, вы не будете обманываться, чтобы случайно переписать список, когда вам нужна отсортированная копия, но также необходимо сохранить несортированную версию.

В Python 2.4 появилась новая встроенная функция - sorted() - был добавлен. Эта функция создает новый список из предоставленного итерации, сортирует его и возвращает его.

9
ответ дан Steven Rumbalski 5 September 2018 в 08:38
поделиться
Другие вопросы по тегам:

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