Создание последовательности цифр, которые появляются в последовательности натуральных чисел

Это повторение вопроса , который уже задан здесь примерно через год, и половина назад.

Проект Эйлера Проблема 40 включает в себя создание последовательности цифр, которые появляются в натуральных числах, все объединены вместе (123456789101112131415161718192021…). В рамках решения я написал следующее:

def counting_digits():
    for number in count(1):
        for digit in str(number):
            yield digit

После завершения решения я пробовал это:

def counting_digits():
    return (digit for number in count(1) for digit in str(number))

Мои вопросы:

  1. Перед лицом Python 3, какое решение больше pythonic ?
  2. Как человек, который просто хочет понять код. Что проще /понятнее читать?
  3. Если вы не прочитали инструкцию для Project Euler Проблема 40 , какая версия позволяет лучше узнать, что делает функция?

Производительность не является частью вопроса: pythonism и понятна проблема.

11 голосов | спросил Apalala 22 Maypm11 2011, 19:19:31

4 ответа


12

То, где вы возвращаете генератор, легче читать, так как это был только один for. Кроме того, как указывал OP, ассоциативность вложенных циклов не то, что вы ожидаете в Python.

Верхняя часть может быть немного легче читать для некоторых людей; было бы намного легче читать, если бы были комментарии или переменные были семантически названы, а структура с отступом позволяет значительно улучшить комментарии. С семантически названными переменными, первая версия легче читать; Я использовал только однобуквенные имена переменных в качестве шаблона в понимании списков.

ответил ninjagecko 22 Maypm11 2011, 19:21:57
10

Кто-то, кто не знает Python, будет смотреть на первую версию и спрашивать: «Что делать?» После быстрого поиска в Google «урока python» они легко поймают его.

Тот же человек посмотрит на эту вторую версию и скажет «WTF?». Что мы ожидаем от Google, чтобы понять это?

Я не буду говорить для сообщества Python в целом, но как опытный программист на Python, я нахожу первую версию более ясной и более питонической. Когда я сталкиваюсь с вложенными генераторами или пониманием списков, мне все же нужно остановиться на мгновение, чтобы разгадать его. Я думаю, что docs признают, что вложенные генераторы и списки могут сбивать с толку, когда они советуют

  

Во избежание опасений при вложенности   список понятий, чтение справа   налево.

И вскоре после этого они говорят

  

В реальном мире вы должны предпочесть   встроенные функции для сложного потока   заявления.

ответил Steven Rumbalski 22 Maypm11 2011, 22:44:30
4

«pythonic» и «easy /clearer» является полностью субъективной проблемой.

Первый пример более читабельный и понятный - даже для Java-разработчика. Второй фрагмент кода более плотный, но я бы не назвал его pythonic. Оба фрагмента кода подходят для меня.

ответил 22 Maypm11 2011, 19:42:56
1

Я думаю, что это очень субъективно. В моем случае я использовал Python около 9 месяцев (хотя и довольно много) и нашел синтаксис выражения генератора более кратким и читаемым. Учитывая простоту, использование генератора inline было бы предпочтительным, в данном случае. Если вам нужно что-то более сложное, я бы наклонился к функции.

ответил zeekay 22 Maypm11 2011, 19:56:11

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132