Найти в Дзене
Lexx Xell

Таблица умножения в одну строку

На картинке вы видите обычную таблицу умножения, которая, думаю, всем хорошо знакома. Ничего особенного в ней нет, кроме того, что весь алгоритм ее построения сжат до одной стандартной Python’овской строки в 79 символов (см. PEP8). Кому интересно добро пожаловать под кат. Для начала, полагаю, стоит ответить на появившийся у многих вопрос “А зачем это?”. Все сложилось из двух факторов, во-первых я, по настоятельной рекомендации одного хорошего человека, занялся углубленным изучением Python’а, а во-вторых мне нравится концепция и изящество кодегольфа. Результатом стало желание написать (конечно слишком громко сказано) что-нибудь очень маленькое (в идеале в одну строку), но наглядное, используя для всего этого особенности кодинга на Python’е. Я решил вывести на экран таблицу умножения. Стоит отметить, что пишу я на Python3.7. Версии младше 3.6 не подойдут из-за отсутствия поддержки f-строк, и в итоге рабочий скрипт превысит длину в 79 символов. Хотелось бы принести некую пользу этой ста

На картинке вы видите обычную таблицу умножения, которая, думаю, всем хорошо знакома.

Ничего особенного в ней нет, кроме того, что весь алгоритм ее построения сжат до одной стандартной Python’овской строки в 79 символов (см. PEP8). Кому интересно добро пожаловать под кат.

Для начала, полагаю, стоит ответить на появившийся у многих вопрос “А зачем это?”. Все сложилось из двух факторов, во-первых я, по настоятельной рекомендации одного хорошего человека, занялся углубленным изучением Python’а, а во-вторых мне нравится концепция и изящество кодегольфа. Результатом стало желание написать (конечно слишком громко сказано) что-нибудь очень маленькое (в идеале в одну строку), но наглядное, используя для всего этого особенности кодинга на Python’е. Я решил вывести на экран таблицу умножения.

Стоит отметить, что пишу я на Python3.7. Версии младше 3.6 не подойдут из-за отсутствия поддержки f-строк, и в итоге рабочий скрипт превысит длину в 79 символов.

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

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

-2

Сформировать значения таблицы можно, используя генераторы, а циклы оставить для распаковки списков. Минусом такого подхода оказалось большее количество строк:

-3

Генератору можно отдать и расстановку Tab’ов (‘\t’) используя f-строки:

nums = [[f'{x*y}\t' for x in range(1,11)] for y in range(1,11)]

Если извлеченный в первом цикле список склеить в строку, с помощью строкового метода join(), использовать параллельное назначение переменных и разместить цикл в одной строке ,то размеры кода значительно уменьшатся:

-4

А если внести join() и ‘\n’ в генератор:

-5

Теперь в нашем распоряжении список из строк, и его тоже можно склеить с помощью join(), избавившись тем самым от циклов:

-6

Ну и обещанный вариант в одну строку (от print, конечно, не избавиться)

-7

В комментариях к моей статье на Хабре читатели предложили свои варианты однострочника.