Python: в отсортированном (массив, ключ =?), Лямбда или operator.itemgetter? [Дубликат]

Разница заключается в том, что functionOne является выражением функции и поэтому определяется только при достижении этой строки, тогда как functionTwo является объявлением функции и определяется, как только выполняется его окружающая функция или скрипт (из-за грузоподъемный [/ д0]).

Например, выражение функции:

// TypeError: functionOne is not a function
functionOne();

var functionOne = function() {
  console.log("Hello!");
};

И объявление функции:

// Outputs: "Hello!"
functionTwo();

function functionTwo() {
  console.log("Hello!");
}

Это также означает, что вы не можете условно определять функции с помощью объявлений функций:

if (test) {
   // Error or misbehavior
   function functionThree() { doSomething(); }
}

Вышеупомянутое фактически определяет functionThree независимо значения test; если use strict не действует, и в этом случае он просто вызывает ошибку.

20
задан Endophage 21 June 2013 в 21:16
поделиться

2 ответа

Производительность itemgetter немного лучше:

>>> f1 = lambda: sorted(w, key=lambda x: x[1])
>>> f2 = lambda: sorted(w, key=itemgetter(1))
>>> timeit(f1)
21.33667682500527
>>> timeit(f2)
16.99106214600033
30
ответ дан Charlie 22 August 2018 в 04:20
поделиться
  • 1
    +1 Благодарим вас за предоставленный аспект производительности! – Endophage 21 June 2013 в 21:25
  • 2
    Но здесь измеряется создание лямбда-функций. Для измерения самой сортировки вызовы timeit должны быть timeit(f1()) и timeit(f2()). Или я чего-то не хватает? – dojuba 11 July 2017 в 08:18
  • 3
    @dojuba timeit.timeit вызывает свой аргумент, если он не является строкой. – M. I. Wright 20 February 2018 в 08:56

Оставив в стороне проблему скорости, которая часто основана на том, где вы делаете элемент itemgetter или лямбда-функционал, я лично считаю, что itemgetter действительно приятно получать сразу несколько элементов: например, itemgetter(0, 4, 3, 9, 19, 20) создаст функцию который возвращает кортеж элементов по указанным индексам перечислимого объекта, переданного ему. Чтобы сделать это с помощью лямбда, вам понадобится lambda x:x[0], x[4], x[3], x[9], x[19], x[20], что намного более clunkier. (И тогда некоторые пакеты, такие как numpy, имеют расширенную индексацию, которая очень похожа на itemgetter(), за исключением встроенных в стандартную нотацию).

9
ответ дан JAB 22 August 2018 в 04:20
поделиться
  • 1
    +1 отличная точка в нескольких записях, конечно же, победитель. – Endophage 21 June 2013 в 21:25
Другие вопросы по тегам:

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