Какова проблема с, уменьшают ()?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

65
задан casperOne 5 April 2012 в 13:17
поделиться

3 ответа

Как Guido говорит в его , судьба уменьшает () в сообщении Python 3000 :

Поэтому теперь уменьшают (). Это - на самом деле то, которое я всегда ненавидел больше всего, потому что, кроме нескольких вовлечения в качестве примера + или *, почти каждый раз я вижу уменьшение () вызов с нетривиальным аргументом функции, я должен захватить перо и бумагу для схематического изображения то, что на самом деле питается в ту функцию, прежде чем я пойму то, что уменьшение (), как предполагается, делает. Таким образом в моем уме, применимость уменьшает (), в значительной степени ограничен ассоциативными операторами, и во всех других случаях лучше выписать цикл накопления явно.

существует превосходный пример путания reduce в статья Functional Programming HOWTO :

Быстрый, что делает следующий код?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]

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

def combine (a, b):
    return 0, a[1] + b[1]

total = reduce(combine, items)[1]

, Но было бы лучше из всех, если я просто использовал для цикла:

total = 0
for a, b in items:
    total += b

Или сумма () встроенный и выражение генератора:

total = sum(b for a,b in items)

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

68
ответ дан DzinX 24 November 2019 в 15:26
поделиться

reduce() не удаляется - это просто перемещается в functools модуль. Обоснование Guido состоит в том, что за исключением тривиальных случаев как суммирование, кодируйте записанное использование reduce(), обычно более ясно, когда записано как цикл накопления.

35
ответ дан John Millikin 24 November 2019 в 15:26
поделиться

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

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

8
ответ дан Eli Bendersky 24 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

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