01.07.2019       Выпуск 289 (01.07.2019 - 07.07.2019)       Статьи

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

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

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

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

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

PEP8

). Кому интересно добро пожаловать под кат.

Для начала, стоит ответить на появившийся у многих вопрос «А зачем это?». Все сложилось из двух факторов, во-первых я, по настоятельной рекомендации одного хорошего человека, занялся углубленным изучением Python’а, а во-вторых мне нравится концепция

демосцены

. Результатом стало желание написать (конечно слишком громко сказано) что-нибудь очень маленькое (в идеале в одну строку), но наглядное, используя для всего этого особенности кодинга на Python’е. Я решил вывести на экран таблицу умножения.

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

Как восемь строк превратились в одну

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

Листинг
def MultiTabl():
	tabl = ''
	for y in range(1,11):
		for x in range(1,11):
			tabl += f'{x*y}\t'
		tabl += f'\n'
	return tabl

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

Листинг
def MultiTabl():
	nums = [[x*y for x in range(1,11)] for y in range(1,11)]
	tabl = ''
	for line in nums:
		for item in line:
			tabl += f'{item}\t'
		tabl += f'\n'
	return tabl

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

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

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

Листинг
def MultiTabl():
	nums, tabl = [[f'{x*y}\t' for x in range(1,11)] for y in range(1,11)], ''
	for line in nums: tabl += ''.join(line) + '\n'
	return tabl

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

def MultiTabl():
	nums, tabl = [''.join([f'{x*y}\t' for x in range(1,11)])+'\n' for y in range(1,11)], ''
	for line in nums: tabl += line
	return tabl

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

def MultiTabl():
	tabl = ''.join([''.join([f'{x*y}\t' for x in range(1,11)])+'\n' for y in range(1,11)])
	return tabl

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

print(
''.join([''.join([f'{x*y}\t' for x in range(1,11)])+'\n' for y in range(1,11)])
)

Конечно, гуру Python’а скажут “И что тут такого?”, но стоит заметить, что указанный подход не является очевидным для начинающих.

Не стоит воспринимать сей опус слишком серьезно, я его писал как разминку перед большой статьей, будет замечательно если он вызовет улыбку, и просто великолепно если принесет пользу.






Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus