Подтвердить что ты не робот

".join(reverse (val)) vs val [:: - 1]... который является pythonic?

Так что в соответствии с Zen of Python... Явный лучше, чем неявный... Sparse лучше, чем плотный... Чтение читается... но опять же Flat лучше, чем вложенный... так что тогда это pythonic

val = "which is pythonic?"
print("".join(reversed(val)))

или

print(val[::-1])

Я просто программист на Java, изучающий Python, поэтому я считаю этот пифонический интерес интересным, поскольку в мире Java AFAIK нет аналога.

4b9b3361

Ответ 1

Моя жена Анна прозвала x[::-1] "Марсианский смайлик" - я в основном склоняюсь перед ней (и ее многолетний опыт в обучении и учебе в области психологии человека и т.д.), когда дело доходит до суждения о том, что легкий и естественный для большинства людей, и она абсолютно любит боевой смайлик. "Просто пройдите назад" - насколько более прямая и высокая абстракция, чем подробное описание "отменить его, а затем присоединиться к нему"!

Кроме того, python -mtimeit часто хорошо разбирается в том, что Pythonic: верхние Pythonistas, на протяжении многих лет, конечно, имели тенденцию оптимизировать то, что они чаще всего нуждались и использовали, поэтому очень существенная разница в производительности говорит вам, что "идет с зерно" языка и его лучших практикующих. И на этот счет марсианский смайлик превосходит детализированную спецификацию...:

$ python -mtimeit '"".join(reversed("hello there!"))'
100000 loops, best of 3: 4.06 usec per loop
$ python -mtimeit '"hello there!"[::-1]'
1000000 loops, best of 3: 0.392 usec per loop

По порядку величины различия в производительности просто не оставляют столько сомнений! -)

Ответ 2

Второй (на мой взгляд) более Pythonic, поскольку он проще, короче и яснее.

Для получения дополнительной информации о том, что такое Pythonic, я бы рекомендовал Zen of Python:

Красивая лучше, чем уродливая.
    Явный лучше, чем неявный.
    Простой лучше, чем сложный.
    Комплекс лучше, чем сложный.
    Плоский лучше, чем вложенный.
    Редкий лучше, чем плотный.     Показатели удобочитаемости.
    Особые случаи не являются достаточно сложными, чтобы нарушать правила.
    Хотя практичность превосходит чистоту.
    Ошибки никогда не должны проходить молча.
    Если явно не отключен.
    Перед лицом двусмысленности откажитесь от соблазна угадать.
    Должен быть один - и желательно только один - сделай это.     Хотя этот путь может быть не очевидным, если вы не голландский.     Теперь лучше, чем никогда.     Хотя никогда не бывает лучше, чем сейчас.     Если внедрение трудно объяснить, это плохая идея.
    Если внедрение легко объяснить, это может быть хорошей идеей.
    Пространства имен - одна хорошая идея - пусть больше таких!

По моему мнению, ваш второй пример удовлетворяет этим принципам:

Красивая лучше, чем уродливая.
Простой лучше, чем сложный.
Редкий лучше, чем плотный. Показатели удобочитаемости.

Ответ 3

Со строкой, как и у вас, я бы пошел с первым параметром, так как он дает понять, что нужный результат - это строка. Для списка или другого iterable/slicable, я бы пошел со вторым.

Дополнительное преимущество первой формы заключается в том, что она будет работать, если val на самом деле не строка, а какая-то другая итерабельность символов (например, какой-то генератор). В некоторых случаях это имеет большое значение.

Ответ 4

Во-первых, если вы новичок, не волнуйтесь, что более питонично или нет. Этот запах языка войн, и вы в конечном итоге найти свое мнение в любом случае. Просто используйте то, как вы думаете, более читабельны/проще для вас, и вы найдете свет, я думаю.

Тем не менее, я согласен с Алексом в отличном ответе (поскольку он всегда прав), и я бы добавил дополнительный комментарий, почему вы должны предпочесть второй метод - первый будет работать только правильно, если val является строкой.