Разница заключается в том, что 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
не действует, и в этом случае он просто вызывает ошибку.
Производительность 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
Оставив в стороне проблему скорости, которая часто основана на том, где вы делаете элемент 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()
, за исключением встроенных в стандартную нотацию).
timeit
должны бытьtimeit(f1())
иtimeit(f2())
. Или я чего-то не хватает? – dojuba 11 July 2017 в 08:18timeit.timeit
вызывает свой аргумент, если он не является строкой. – M. I. Wright 20 February 2018 в 08:56