Главная страница  Карта сайта  Печать  Написать письмо  RSS
Войти
Кнопка открытия главного меню
Персональный сайт
Стеллецкого Владимира
Обновлено: 22.12.2023 г.

Python

В 2009 году я решил изучить ещё какой-нибудь язык программирования. После анализа текущего выбора языков программирования я остановил свой выбор на Python или Ruby. После ещё некоторых колебаний склонился всё же к Python. Может быть когда-нибудь и до Ruby руки дойдут.

Если обнаружите ошибки или сможете предложить более "правильное" решение размещённых здесь задач, или же какую-то задачку для решения - пишите, буду очень признателен.

Ссылки (18.12.2019) #

«   ‹   1   2   3   следующая ›   последняя »

Удаление дублирующихся заголовков (строк) в текстовом файле (22.12.2023) #

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

Для решения данной задачи основным кандидатом сразу же стал Python. Правда, также рассматривал возможность написания такой программы на Go - очень уж хотелось опять попрактиковаться, но в итоге всё же остановился на Python. Получилось следующее решение такой задачи.

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

Комментарии

swi, www (23.12.2023)
пока мыл посуду придумал такое решение на рефале:
a =/0/k/b/(k/b1/k/G0A/..)()k/W/k/G0A/..k/W/k/G0A/..k/G0A/.. *первое чтение заголовка
b1 e1=k/W/e1.e1 *вывод 1й строки 1го заголовка
d e1= *удаление лишних строк заголовка
b (e1)(ep)e1=k/W/ep.k/b/(e1)()k/d/k/G0A/.k/G0A/..k/G0A/.. *повторное появление заголовка
_ w1(ep)va=k/W/ep.k/b/w1(va)k/G0A/. *очередная строка не заголовок, выводим предыдущую
_ w1wp= * конец файла. Последнюю строку не выводим
* у двух последних строк для наглядности первые пробелы заменены на знак подчеркивания _
По сравнению с решением судоку (см. ниже) выглядит не так уж и страшно. :-)
swi, www (30.12.2023)
;)
задача проще ;)

Решение судоку (31.03.2023) #

В качестве разминки и дополнительной практики в программировании решил предложить Андрею попробовать написать программу для решения судоку (числовой головоломки). Их в последнее время регулярно публикуют в районной газете, которую периодически кладут в почтовый ящик. А для дополнительной мотивации и в качестве примера решил и сам написать такую программу.

В итоге, я выбрал Python, а Андрей изучаемую им сейчас Java. Получилось своего рода соревнование (или как сейчас говорят "батл" или "челендж").

Моё решение (на Python) уже готово, хотя, конечно, можно ещё поработать над оформлением кода и вывода найденного решения (посмотреть код).

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

Теперь думаю чтобы ещё ему предложить.

PS: А ещё подумываю о реализации решения этой же задачи на Go, чтобы освежить в голове синтаксис этого языка программирования.

Комментарии

swi, www (02.04.2023)
Очень интересно!
я еще в 2006 году реализовал, но без перебора, хотя внутреннее представление на перебор рассчитано:
19.04.2006 15:30 2 825 sudoku.ref
текст на рефале:
a =/0/k/r/k/f0/(k/arow/.)(k/acol/.)(k/a3x3/.)k/b/k/G0A/....
b =
e1sa=k/f1/e1.k/b/k/G0A/..
f1 e1' 'e2=(k/f2/e1.)k/f1/e2.
e1 =(k/f2/e1.)
f2 ='123456789'
e1=e1
f0 (s1e2)(s3e4)(s5e6)wtee=((s1s3s5)wt)k/f0/(e2)(e4)(e6)ee.
()()()=
r e1=k/s1/()()e1.
*s1 - выбор единичек для нормализации и проверки
s1 (e0)(e1)ea(wu(sr))eb=k/s1/(e0ea(wu(sr)))(e1(wu(sr)))eb.
(e0)w1eb=k/np/w1()e0eb.
*np - нормализация и проверка (поиск)
np (((sueb)ec)ed)(e0)e1((e2sue3)e4)e5=+
* k/P/'e 'easueb' 'ec' 'e2sue3' 'e4.+
k/np1/(((sueb)ec)ed)(e0e1)((e2sue3)e4)e5.
(((sueb)ec)ed)(e0)e1=k/np/(((eb)ec)ed)()e0e1.
((()ec)ed)(e0)e1=k/np/(ed)()e0e1.
()()e5=k/t/e5.
*np1 - нормализация и проверка на непротиворечивость
np1 (((eu)(sz))ec)(e0)((e2eu)(sz))e5=k/np/(((eu)(sz))ec)(e0((e2eu)(sz)))e5.
* если нашли себя
((wu(sz))ed)(e0)(w2(e3sze4))e5=k/np2/((wu(sz))ed)(e0)(w2(e3 e4))e5.
wu(e0)wte5=k/np/wu(e0wt)e5.
*np2 - проверка на непротиворечивость
np2 (eu)(e0)(w2(s3))e5=k/np/(eu(w2(s3)))(e0(w2(s3)))e5.
* новая проверка
((wuwt)ee)(e0)(w2())e5=k/pp/'E'(wuwu)(wtwt)e0(w2())e5.
* противоречие
wu(e0)wte5=k/np/wu(e0wt)e5.
*t - проверка на конец и перебор, а сначала ищем однозначности
t e1=k/od/()e1.
*od - ищем однозначности
od (e0)e1(w2(s3s4e5))ee=k/od1/(e0e1)()()(w2(s3s4e5))ee.
(e0)ee=k/per/e0ee.
od1 w0(e1)(e2)((sue4)(ste5))ea((ebsuec)(edstee))ef=+
k/od1/w0(e1)(e2st)((sue4)(e5))ea((ebsuec)(edstee))ef.
* (e0)(e1)(e2)((sue4)(ste5))ea=k/np/(((e1sue4)(st)))()e0((e1sue4)(st))ea.
(e0)(e1)(e2)((sue4)(ste5))ea=k/od2/(e1)(e2)((sue4)(ste5))(e0)ea.
w0(e1)(e2)((sue4)())ea=k/od1/w0(e1su)()((e4)(e2))ea.
(e0)(e1)()(()(e2))ea=k/od/(e0((e1)(e2)))ea.
od2 (e1)(e2)((sue4)(ste5))(ea((ebsuec)(edstee))ef)e0=+
k/od1/(ea((ebsuec)(edstee))ef)(e1)(e2st)((sue4)(e5))e0.
(e1)(e2)((sue4)(ste5))(e0)ea=k/np/(((e1sue4)(st)))()e0((e1sue4)(st))ea.
*per - перебор
per ea(wu(s1s2e3))eb=k/per1/(ea)(wu(s1s2e3))eb.
ea=k/pp/'Y'ea.
per1 (ea)(wu(s1s2e3))eb=k/pp/'?'(wuwu)((s1)(s1))ea(wu(s1))eb.k/np/((wu(s1)))()ea(wu(s1))eb.k/per1/(ea)(wu(s2e3))eb.
(ea)(wu(s1 ))eb=k/pp/'?'(wuwu)((s1)(s1))ea(wu(s1))eb.k/np/((wu(s1)))()ea(wu(s1))eb.
pp s1e2=k/P/s1k/pp/e2..
(wu(es))e2=' 'esk/pp/e2.
=
arow ='111111111'+
'222222222'+
'333333333'+
'444444444'+
'555555555'+
'666666666'+
'777777777'+
'888888888'+
'999999999'
acol ='abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'+
'abcdefghi'
a3x3 ='AAABBBCCC'+
'AAABBBCCC'+
'AAABBBCCC'+
'DDDEEEFFF'+
'DDDEEEFFF'+
'DDDEEEFFF'+
'GGGHHHIII'+
'GGGHHHIII'+
'GGGHHHIII'

Добавил в заметку своё решение на Python, но ещё раз отмечу, что его надо бы ещё немного оформить.
swi, www (02.04.2023)
Нет. Здесь перебор запрограммирован.
это в Сакуре, я его не реализовал ;)

6 Python декораторов, которые значительно упростят ваш код (16.03.2023) #

Интересная статья, в которой собраны несколько полезных декораторов Python:

  1. @lru_cache: Ускоряем программы кэшированием - не рассчитываем повторно результат выполнения функции, если её уже вызывали с данными параметрами
  2. @total_ordering: Добавляем недостающие методы сравнения (для классов)
  3. @contextmanager: Кастомный менеджер контекстов
  4. @property: Настраиваем геттеры и сеттеры для классов
  5. @cached_property: Кешируем результат функции как атрибут - т.е. первый раз функция выполняется, сохраняется результат и далее возвращается он без вызова самой функции.
  6. @atexit.register: Объявляем функцию которая вызывается при выходе из программы

PS: 3 и 6 показались наименее полезными (на текущий момент)

Telegram-бот (12.03.2022) #

Решил разобраться, как делаются Telegram-боты и попробовать написать своего (пока, правда, без конкретной цели, больше для изучения вопроса и разных экспериментов). На текущий момент изучаю официальную документацию и статьи по теме (см. ссылки ниже). К сожалению, очень много статей и обзоров посвящено вопросу как создать бота (что довольно-таки просто), а не вопросам его "обучения", т.е. программированию. Приведу ссылки на несколько понравившихся мне статей:

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

Комментарии

Мой комментарий (23.04.2022)
Разработка бота потихоньку продолжается. Познакомился с основными возможностями Telegram-ботов и пока реализовал с помощью своего бота удобный интерфейс для решения трёх прикладных задач по работе.

Как очень часто бывает, помимо практической пользы от реализованной программы и удовольствия от её написания, удалось узнать/попробовать что-то новое.
В этот раз помимо изучения самой библиотеки для написания бота, удалось поближе познакомиться с классами и декораторами в Python.

Небольшие программки (19.12.2021) #

За последние несколько недель удалось вместе с Андреем написать несколько небольших программок на Python:

  • нормализатор данных - удаление двойных и нестандартных пробелов, замена кавычек, пробелы вокруг скобок и знаков препинания, нормализация телефонных номеров; (посмотреть код)
  • два разных алгоритма для сравнения двух разных типов структурированных данных - сравнения прайс-листов и поиска похожих наборов исследований (профилей или диагностических панелей). (посмотреть код)
  • парсер логов, который позволил увидеть цельную картину происходящего и разобраться в одной довольно запутанной ситуации.

И хотя все эти программы были довольно таки не сложные, всё равно удалось попрактиковаться в программировании, с пользой провести время, а также закрепить и приобрести новые знания (Андрею) и "размять" мозги.

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

Комментарии

swi, www (12.01.2022)
"нормализатор данных" было бы удобно написать на рефале... Но оформить в виде модуля... Хотя кому теперь этот рефал нужен?! :(
Как раз сегодня сделал возможность "развернуть" блок с кодом для решения описанных выше задач (так что можно посмотреть, что у нас в итоге получилось).
Посмотрим насколько такое "разворачивание" будет востребовано и удобно.
 
Касательно рефала - возможно, на нём действительно было бы быстрее и проще написать решение данной задачи (не знаю данный язык программирования), но пока Python подкупает меня своей универсальностью - и в базу данных можно "залезть", и данные обработать и никаких отдельных "конвейеров" городить не надо - запустил один файл и готово. :)
Мой комментарий (13.01.2022)
Если есть время и желание предлагаю реализовать аналогичный алгоритм на РеФАле и разместить решение здесь.
Думаю, будет интересно посмотреть/посравнивать решения одной и той же задачи на столь разных языках программирования.
 
PS Готов предоставить ТЗ и примеры для тестирования.

Проблемы с кодировкой (14.10.2021) #

При получении данных с MSSQL-сервера с помощью pymssql столкнулся с тем, что данные поступают в нечитаемом виде:

15 Äðîçäîâ False 165
16 Çàéöåâà False 95

Сначала попробовал исправить кодировку полученных данных в python-скрипте - к сожалению, не получилось.

Потом была идея исправить это указав кодировку при подключении к MSSQL, например:
Connection = pymssql.connect(server, user, password, database, charset='WINDOWS-1251')

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

В итоге, в Интернете был найдено следующее решение - попробовать привести на MSSQL тип колонки к NVARCHAR.
После этого данные стали поступать в нормальном виде.

Python'о-выходные (05.04.2021) #

На выходных удалось немного попрограммировать на Python - разбирали с ребёнком решения задач. В итоге с удовольствием освежил и закрепил свои знания и навыки, а также удалось узнать кое что новое: впервые на практике применил несложный, но новый для меня приём, вместе разобрали решения нового для меня круга задач (работа с изображениями, цветовые схемы BGR и HSV(B), распознавание информации с изображений), поверхностно познакомились с возможностями пакетов/библиотек NumPy и cv2.

В очередной раз получил массу удовольствия от программирования на Python.

Особенности Python для новичков (05.12.2020) #

Полезная статья для тех, кто только изучает Python (правда, для некоторых рассматриваемых примеров определённый уровень знаний всё же уже нужен), особенно, если делает это самостоятельно. В ней рассмотрены частые примеры корректного решения отдельных задач, написанные без учёта (и зачастую понимания) особенностей и тонкостей Python.

Так часто бывает, если новый язык изучаешь самостоятельно, опираясь только на общую документацию и Интернет, вместо того, чтобы прочитать самоучитель или просто описание языка. Сам поначалу писал Delphi-код на синтаксисе Python.

41 вопрос о работе со строками в Python (26.11.2020) #

Неплохая статья с разбором тонкостей при работе со строками в Python. Конечно, в основном рассматриваются общеизвестные моменты, но есть и малоизвестные нюансы.

Для себя отмечу f-строки (появились в Python 3.6) и методы maketrans() и translate(). Остальное было известно.

«   ‹   1   2   3   следующая ›   последняя »

  Вы 19 765 посетитель этой странички
с 05 марта 2009 года
© http://svv-home.ru
О сайте