This media is not supported in your browser
VIEW IN TELEGRAM
Объясняю про коллбэки на пальцах ☎️📲
Коллбэк (callback) – это обычная функция, но которая должна быть вызвана при каком-то событии. Для этого мы передаем наш коллбэк в некоторую функцию. Эта функция потом просто вызовет нашу функцию-коллбэк, которую мы ей передали.
Аналогия: мы звоним в клинику, а там нам отвечают, что все операторы заняты, и предлагают оставить свой номер, чтобы они перезвонили. Это и есть пример коллбэка (с английского, кстати, так дословно и переводится – перезвонить обратно или обратный вызов).
То есть мы оставили номер, на который нужно перезвонить, когда освободится оператор.
Также и в программировании: мы передаем функцию, которую нужно вызвать при наступлении некоторого события или при выполнении каких-то условий.
Пример
Мы написали функцию (1), которая имитирует работу таймера.
При срабатывании таймера мы хотим узнать об этом и как-то среагировать. Для этого в функцию таймера передается коллбэк, то есть функция, которую нужно вызвать (3) по истечении заданного времени.
Также написали два коллбэка: (4) и (5).
В главной функции (6) запускаем два таймера, в которые передаем первый и второй наши коллбэки.
При срабатывании таймеров вызываются коллбэки: через 3 секунды первый, а потом через 5 секунд и второй. Таким образом мы узнаем, что время истекло, и можем сделать какие-то действия в нашей программе. В данном случае мы просто выводим текстовые сообщения.
Вывод работы скрипта:
#python #junior #callbacks
Коллбэк (callback) – это обычная функция, но которая должна быть вызвана при каком-то событии. Для этого мы передаем наш коллбэк в некоторую функцию. Эта функция потом просто вызовет нашу функцию-коллбэк, которую мы ей передали.
Аналогия: мы звоним в клинику, а там нам отвечают, что все операторы заняты, и предлагают оставить свой номер, чтобы они перезвонили. Это и есть пример коллбэка (с английского, кстати, так дословно и переводится – перезвонить обратно или обратный вызов).
То есть мы оставили номер, на который нужно перезвонить, когда освободится оператор.
Также и в программировании: мы передаем функцию, которую нужно вызвать при наступлении некоторого события или при выполнении каких-то условий.
Пример
Мы написали функцию (1), которая имитирует работу таймера.
При срабатывании таймера мы хотим узнать об этом и как-то среагировать. Для этого в функцию таймера передается коллбэк, то есть функция, которую нужно вызвать (3) по истечении заданного времени.
Также написали два коллбэка: (4) и (5).
В главной функции (6) запускаем два таймера, в которые передаем первый и второй наши коллбэки.
При срабатывании таймеров вызываются коллбэки: через 3 секунды первый, а потом через 5 секунд и второй. Таким образом мы узнаем, что время истекло, и можем сделать какие-то действия в нашей программе. В данном случае мы просто выводим текстовые сообщения.
Вывод работы скрипта:
-- start timer
-- timer end
Alarm
-- start timer
-- timer end
ALARM !!!
#python #junior #callbacks
Раскрашивание текста в print()
Вывод в терминал / консоль / командную строку можно оформлять цветом. Для этого используются специальные последовательности символов.
Эта же функциональность доступна и в Питоне.
Вот эти последовательности спец. символов.
Для выделений текста цветом:
Чтобы покрасить фон текста:
Например:
Также есть спец. последовательности символов для выделения жирным, а также подчеркивать текст.
Кроме того, важная последовательность для сброса ранее установленного значения:
#python #junior #text #formatting
Вывод в терминал / консоль / командную строку можно оформлять цветом. Для этого используются специальные последовательности символов.
Эта же функциональность доступна и в Питоне.
Вот эти последовательности спец. символов.
Для выделений текста цветом:
\033[0;30m - черный
\033[0;31m - красный
\033[0;32m - зеленый
\033[0;33m - желтый
\033[0;34m - синий
\033[0;35m - фиолетовый
\033[0;36m - бирюзовый
\033[0;37m - белый
Чтобы покрасить фон текста:
\033[40m - черный
\033[41m - красный
\033[42m - зеленый
\033[43m - желтый
\033[44m - синий
\033[45m - фиолетовый
\033[46m - бирюзовый
\033[47m - белый
Например:
print('\033[41m красный \033[0m')
print('\033[42m зеленый \033[0m')
print('\033[44m синий \033[0m')
Также есть спец. последовательности символов для выделения жирным, а также подчеркивать текст.
Кроме того, важная последовательность для сброса ранее установленного значения:
\033[0m
#python #junior #text #formatting
Свой веб-сервер за минуту
Знали ли вы, что в стандартной поставке Питона есть модуль, который позволяет поднять веб-сервер за считанные секунды прямо “из коробки”?
Модуль называется
1. заходим в папку, к файлам которой мы хотим предоставить доступ по веб-интерфейсу
2. набираем в консоли:
3. готово!
Теперь мы можем вбить в браузере адрес http://localhost:8000 и удостовериться, что все работает – мы увидим список файлов в нашей папке, плюс, сможем их скачать. А если в вашей папке есть файл index.html, то отобразится веб-страница, описанная в этом файле.
#python #web_server #junior #middle
Знали ли вы, что в стандартной поставке Питона есть модуль, который позволяет поднять веб-сервер за считанные секунды прямо “из коробки”?
Модуль называется
http.serverи вот как им пользоваться:
1. заходим в папку, к файлам которой мы хотим предоставить доступ по веб-интерфейсу
2. набираем в консоли:
python -m http.server
3. готово!
Теперь мы можем вбить в браузере адрес http://localhost:8000 и удостовериться, что все работает – мы увидим список файлов в нашей папке, плюс, сможем их скачать. А если в вашей папке есть файл index.html, то отобразится веб-страница, описанная в этом файле.
#python #web_server #junior #middle
Формат времени и даты
Сегодня расскажу вам о стандарте представления времени и дат, который часто используется в разработке.
Стандарт этот именуется ISO 8601. Почему важно знать о нем? Потому что он часто используется при разработке ПО: хранение логов, передача дат в JSON, хранение даты и времени в базе данных и так далее.
В нем описан не только стандартизированный (то есть единый) формат записи даты и времени как таковой, но и учтен формат записи часового пояса. А это крайне важная вещь при разработке ПО, которое потенциально может работать либо распределенно, либо на компьютерах по всему миру.
Стандарт поддерживается большинством языков в рамках их стандартных библиотек, что позволяет легко прочитать либо сохранить дату/время в унифицированном формате.
Вот как выглядит, например, формат полной записи времени, даты и часового пояса:
Например,
В ISO 8601 описаны также и другие форматы хранения даты и времени, однако, описанный выше формат является самым полным.
#junior #middle #iso #datetime
Сегодня расскажу вам о стандарте представления времени и дат, который часто используется в разработке.
Стандарт этот именуется ISO 8601. Почему важно знать о нем? Потому что он часто используется при разработке ПО: хранение логов, передача дат в JSON, хранение даты и времени в базе данных и так далее.
В нем описан не только стандартизированный (то есть единый) формат записи даты и времени как таковой, но и учтен формат записи часового пояса. А это крайне важная вещь при разработке ПО, которое потенциально может работать либо распределенно, либо на компьютерах по всему миру.
Стандарт поддерживается большинством языков в рамках их стандартных библиотек, что позволяет легко прочитать либо сохранить дату/время в унифицированном формате.
Вот как выглядит, например, формат полной записи времени, даты и часового пояса:
YYYY-MM-DDThh:mm:ssTZD
Например,
2023-07-09T14:58:02+04:00
, что означает 9 июля 2023 г. 14 часов 58 минут и 2 секунды по московскому времени. Символ T
служит разделителем даты и времени. В конце также может стоять символ Z
, который будет означать время по UTC (например, та же дата+время может быть записана как 2023-07-09T10:58:02Z
)В ISO 8601 описаны также и другие форматы хранения даты и времени, однако, описанный выше формат является самым полным.
#junior #middle #iso #datetime
👍2👎1🤔1
Поиск функции по кодовой базе
Сегодня поделюсь с вами командой, которая позволяет легко и быстро найти нужную вам функцию по всей вашей кодовой базе.
В моем случае мне нужно найти мою реализацию очереди на Питоне, которую я когда-то делал, но не помню, в каком проекте. Для этого я использовал следующую команду:
Разберем ее по частям:
⁃
⁃ далее идет папка, в которой мы будем искать:
⁃ после
⁃ вертикальная черта
⁃ после вертикальной черты идет команда поиска внутри переданных файлов из команды, стоящей до черты
Для удобства, мы можем использовать следующие варианты команды.
Вывести все найденные строки в файл:
Не искать в питоновских подключаемых пакетах в папках
#junior #middle #shell #command_line
Сегодня поделюсь с вами командой, которая позволяет легко и быстро найти нужную вам функцию по всей вашей кодовой базе.
В моем случае мне нужно найти мою реализацию очереди на Питоне, которую я когда-то делал, но не помню, в каком проекте. Для этого я использовал следующую команду:
find ~/repos -name "*.py" | xargs grep -i "queue”
Разберем ее по частям:
⁃
find
– команда, которая производит поиск файлов⁃ далее идет папка, в которой мы будем искать:
~/repos
⁃ после
-name
указываем, в каких файлах будем искать (в нашем случае это все питоновские файлы)⁃ вертикальная черта
|
означает перенаправление вывода в следующую команду, то есть результат выполнения команды find ~/repos -name "*.py"
будет передан в следующую команду, а не напечатан в терминале⁃ после вертикальной черты идет команда поиска внутри переданных файлов из команды, стоящей до черты
Для удобства, мы можем использовать следующие варианты команды.
Вывести все найденные строки в файл:
find ~/repos -name "*.py" | xargs grep -i "queue" > ~/temp/find_queue.txt
Не искать в питоновских подключаемых пакетах в папках
site-packages
:find ~/repos -name "*.py" -not -path '*/site-packages/*' | xargs grep -i "queue”
#junior #middle #shell #command_line
👍2👎1🤔1
Пишем функцию генерации пароля на Python
Внимание! Данная функция не обеспечивает должной безопасности. Не рекомендуется использовать ее в реальных проектах для генерации паролей.
Сегодня разберем короткую и удобную функцию для генерации паролей, IDшников или рандомных имен файлов. Вы также можете использовать ее для своих нужд генерации случайных строк.
Разложим ее на составные части:
⁃
⁃
⁃ вместе получаем
⁃
⁃
Например, вот как можно получить список квадратов элементов исходного списка
⁃ в нашем случае значение текущего индекса цикла нам не требуется, поэтому вместо переменной (`i`, например) мы поставили
⁃
Результаты выполнения получившейся функции:
#junior #python #разбор_кода #random
Внимание! Данная функция не обеспечивает должной безопасности. Не рекомендуется использовать ее в реальных проектах для генерации паролей.
Сегодня разберем короткую и удобную функцию для генерации паролей, IDшников или рандомных имен файлов. Вы также можете использовать ее для своих нужд генерации случайных строк.
import random
import string
def gen_rand_str(length: int) -> str:
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(0, length))
Разложим ее на составные части:
⁃
string.ascii_letters
– не что иное, как константная строка, доступная в стандартной библиотеке Питона, и содержащая ASCII-символы в верхнем + нижнем регистрах
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
⁃
string.digits
– строка с цифрами
>>> string.digits
'0123456789'
⁃ вместе получаем
>>> string.ascii_letters + string.digits
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
⁃
random.choice()
возвращает случайный элемент из списка, либо же случайный символ из строки
>>> random.choice('abcdef')
'c'
>>> random.choice('abcdef')
'e'
>>> random.choice('abcdef')
'd'
⁃
[<выражение> for _ in range(0, length)]
– один из вариантов однострочного цикла for, когда мы пробегаем в цикле length раз и выполняем выражение, стоящее в начале; более того, результат этого выражения добавится в список, и так на каждой итерации цикла for; в итоге на выходе получится новый список; “по-научному” это называется list comprehensionНапример, вот как можно получить список квадратов элементов исходного списка
>>> [I * i for i in range(0, 4)]
[0, 1, 4, 9]
>>> [i * i for i in l]
[0, 1, 9, 25]
⁃ в нашем случае значение текущего индекса цикла нам не требуется, поэтому вместо переменной (`i`, например) мы поставили
_
, что означает, что переменная цикла нам не требуется⁃
'<разделитель>'.join(<список>)
формирует строку из элементов списка с разделителем, указанным в начале
>>> ‘ + '.join(['1', '2', '3', '4'])
'1 + 2 + 3 + 4'
Результаты выполнения получившейся функции:
>>> gen_rand_str(4)
'9h8S'
>>> gen_rand_str(4)
'dtMF'
>>> gen_rand_str(8)
'8Udtmpao'
>>> gen_rand_str(8)
'fHmPrwlF'
>>> gen_rand_str(12)
'tl5OSVV6odTq'
>>> gen_rand_str(12)
'JL1qNlzRywMS'
#junior #python #разбор_кода #random
👍2👎1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Генерируем рандомного юзера [requests + API]
Сегодня покажу вам код в 8 (восемь!) строк для генерации пользователя со случайным именем, фамилией и телефоном.
Конечно, мы могли бы распарсить статьи в Википедии и получить список популярных имен и фамилий, и написать код рандомной генерации сами. Но это мы оставим на потом, а сегодня воспользуемся уже готовым сервисом, который в ответ на запрос отдает JSON с рандомными данными о фейковом пользователе. Без регистрации и смс 😁
Пояснений в этот раз не будет. У кого возникнут вопросы по коду – приглашаю в комментарии 👇👇👇
#junior #python #requests #api #random #user #data
Сегодня покажу вам код в 8 (восемь!) строк для генерации пользователя со случайным именем, фамилией и телефоном.
Конечно, мы могли бы распарсить статьи в Википедии и получить список популярных имен и фамилий, и написать код рандомной генерации сами. Но это мы оставим на потом, а сегодня воспользуемся уже готовым сервисом, который в ответ на запрос отдает JSON с рандомными данными о фейковом пользователе. Без регистрации и смс 😁
Пояснений в этот раз не будет. У кого возникнут вопросы по коду – приглашаю в комментарии 👇👇👇
#junior #python #requests #api #random #user #data
👍2👎1🤔1
Реальный Код
Генерируем рандомного юзера [requests + API] Сегодня покажу вам код в 8 (восемь!) строк для генерации пользователя со случайным именем, фамилией и телефоном. Конечно, мы могли бы распарсить статьи в Википедии и получить список популярных имен и фамилий,…
Смотрите также в шортсах на ютубе, ну и заодно подписывайтесь на канал
https://youtube.com/shorts/0CuiJaF820Y
https://youtube.com/shorts/0CuiJaF820Y
YouTube
Генерируем рандомного юзера [python + requests + API]
Подписывайся на Telegram-канал: https://t.me/the_real_coding Запомнить просто: the_real_coding – только реальный код ⌨️Сегодня покажу вам код в 8 (восемь!) с...
Реальный Код
Генерируем рандомного юзера [requests + API] Сегодня покажу вам код в 8 (восемь!) строк для генерации пользователя со случайным именем, фамилией и телефоном. Конечно, мы могли бы распарсить статьи в Википедии и получить список популярных имен и фамилий,…
Залил код для вашего удобства. Пользуйтесь на здоровье 🤗
https://github.com/DiPaolo/the-real-coding/blob/main/python/random_user.py
https://github.com/DiPaolo/the-real-coding/blob/main/python/random_user.py
GitHub
the-real-coding/python/random_user.py at main · DiPaolo/the-real-coding
Playground aka примеры простых программ для новичков + для Telegram и YouTube каналов - DiPaolo/the-real-coding
👍1👎1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Прогресс бар на питоне [python + tqdm + random]
А вот как можно добавить визуализацию прогресса в ваш скрипт. В этом случае пользователь будет видеть прогресс бар, бегущий от 0% до 100%, а кроме того, примерное время до окончания процесса. Это особенно полезно в случае длительной обработки, либо же при обработке большого количества элементов, ну или все вместе.
Из интересных моментов в скрипте хочу отметить использование пакета random. Обратите внимание, как и для чего это используется.
Полный текст скрипта можете найти здесь: https://github.com/DiPaolo/the-real-coding/blob/main/python/progress_bar_tqdm.py
А с комментариями и вопросами жду вас в чатике 👇👇👇
#junior #middle #python #tqdm #random #progress_bar #cli
А вот как можно добавить визуализацию прогресса в ваш скрипт. В этом случае пользователь будет видеть прогресс бар, бегущий от 0% до 100%, а кроме того, примерное время до окончания процесса. Это особенно полезно в случае длительной обработки, либо же при обработке большого количества элементов, ну или все вместе.
Из интересных моментов в скрипте хочу отметить использование пакета random. Обратите внимание, как и для чего это используется.
Полный текст скрипта можете найти здесь: https://github.com/DiPaolo/the-real-coding/blob/main/python/progress_bar_tqdm.py
А с комментариями и вопросами жду вас в чатике 👇👇👇
#junior #middle #python #tqdm #random #progress_bar #cli
This media is not supported in your browser
VIEW IN TELEGRAM
Считаем возраст юзера [python + datetime]
В прошлый раз мы уже написали скрипт для генерации рандомного пользователя. Сегодня улучшим его, добавив возраст пользователя.
Тут все достаточно просто:
1️⃣ рандомную дату рождения мы получали и раньше, сейчас же мы просто начнем ее использовать
2️⃣ формат даты нам известен и не меняется, однако приходит в виде строки!, потому с использованием функции
3️⃣ в функции
👨💻 полный код примера доступен тут https://github.com/DiPaolo/the-real-coding/blob/main/python/random_user_with_age.py.
#junior #python #datetime #date
В прошлый раз мы уже написали скрипт для генерации рандомного пользователя. Сегодня улучшим его, добавив возраст пользователя.
Тут все достаточно просто:
1️⃣ рандомную дату рождения мы получали и раньше, сейчас же мы просто начнем ее использовать
2️⃣ формат даты нам известен и не меняется, однако приходит в виде строки!, потому с использованием функции
datetime.strptime()
из пакета datetime
переводим ее в объект даты, чтобы работать с датой было удобнее3️⃣ в функции
get_age()
несложным алгоритмом считаем, сколько полных лет прошло с даты рождения и до сегодняшнего дня (обратите внимание, что нам нужно учесть, что ДР мог в этом году либо уже пройти, либо еще нет, соответственно, значение возраста в зависимости от этого условия будет разным)👨💻 полный код примера доступен тут https://github.com/DiPaolo/the-real-coding/blob/main/python/random_user_with_age.py.
#junior #python #datetime #date
👍4👎1🤔1
Хочу сегодня поделиться с вами элегантным приемом для оформления обработки ошибок для разных действий.
Это код из проекта openpyxl. Вот ссылка на конкретный участок кода https://foss.heptapod.net/openpyxl/openpyxl/-/blob/branch/3.1/openpyxl/reader/excel.py#L285
Итак, что мы видим:
1. заключаем наши повторяющиеся действия с разным названием в
2. каждому действию (вызову функции) предшествует название действия (
3. в обработчике ошибок (
Таким образом, пользователь будет знать конкретный этап, на котором что-то пошло не так
Берите на заметку! Красивый прием. Я уже успел применить этот прием в своем коде 😉
#middle #python #code_review #hint #best_practices
Это код из проекта openpyxl. Вот ссылка на конкретный участок кода https://foss.heptapod.net/openpyxl/openpyxl/-/blob/branch/3.1/openpyxl/reader/excel.py#L285
Итак, что мы видим:
1. заключаем наши повторяющиеся действия с разным названием в
try
/catch
секцию2. каждому действию (вызову функции) предшествует название действия (
action
)3. в обработчике ошибок (
catch
) оформляем сообщение об ошибке, используя название последнего выполнявшегося до выбрасывания исключения шага (с помощью переменной action
)Таким образом, пользователь будет знать конкретный этап, на котором что-то пошло не так
Берите на заметку! Красивый прием. Я уже успел применить этот прием в своем коде 😉
#middle #python #code_review #hint #best_practices
👍3👎1🤔1
У меня появился канал в VK 🥳 Вскоре там появятся видео. А пока призываю вас подписаться на канал в других сетях, если еще не подписаны. Особенно буду благодарен за подписку в Дзене (это который Яндекс Дзен, Zen).
VK ➡️ https://vk.com/the_real_coding
YouTube ➡️ http://youtube.com/@the_real_coding
Дзен ➡️ https://dzen.ru/the_real_coding
VK ➡️ https://vk.com/the_real_coding
YouTube ➡️ http://youtube.com/@the_real_coding
Дзен ➡️ https://dzen.ru/the_real_coding
👍4❤2👎1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
GUI-утилитка по фану [Python + Qt + многопоточность]
Сегодня у меня для вас воскресный залипательный видосик “просто так”.
Просто по фану сделанная утилитка, которая запускает N потоков с рандомной длительностью, и отображает их статус в UI. В любой момент можно стопнуть. Надобавлять потоков тоже можно любое количество.
Из используемых инструментов:
- Python
- PySide (он же Qt для питона)
- многопоточность
- модуль random
Код тут: https://github.com/DiPaolo/the-real-coding/tree/main/python/gui_multithreading_progress_visualization
Как вам? Сложно-нет? Сделали бы сами? Интересен видос с разбором кода? Пишите в коментах 👇
#fun #demo #python #qt #random #gui #pyside
Сегодня у меня для вас воскресный залипательный видосик “просто так”.
Просто по фану сделанная утилитка, которая запускает N потоков с рандомной длительностью, и отображает их статус в UI. В любой момент можно стопнуть. Надобавлять потоков тоже можно любое количество.
Из используемых инструментов:
- Python
- PySide (он же Qt для питона)
- многопоточность
- модуль random
Код тут: https://github.com/DiPaolo/the-real-coding/tree/main/python/gui_multithreading_progress_visualization
Как вам? Сложно-нет? Сделали бы сами? Интересен видос с разбором кода? Пишите в коментах 👇
#fun #demo #python #qt #random #gui #pyside
👍2👎1🤔1
101!
Меж тем на YouTube канале Реальный Код количество подписчиков сегодня перевалило за 100 🥳
Кто еще не подписался - велком, http://youtube.com/@the_real_coding
А также подписывайтесь на канал в других соцсетях:
VK: https://vk.com/the_real_coding
Zen: https://dzen.ru/the_real_coding
Меж тем на YouTube канале Реальный Код количество подписчиков сегодня перевалило за 100 🥳
Кто еще не подписался - велком, http://youtube.com/@the_real_coding
А также подписывайтесь на канал в других соцсетях:
VK: https://vk.com/the_real_coding
Zen: https://dzen.ru/the_real_coding
👍5❤1👎1🥰1🤔1
У моей любимой библиотеки UI компонентов для Реакта – Mantine UI, вышла новая версия 7.4, заслуживающая внимания.
А именно: они добавили поддержку графиков из коробки.
Что ж, молодцы. Надо будет обязательно затестить.
Полный чейнджлог доступен тут https://mantine.dev/changelog/7-4-0/
#news #frontend #mantine
А именно: они добавили поддержку графиков из коробки.
New
@mantine/charts
package provides a set of components to build charts and graphs. All components are based on
recharts
. Currently, the package provides
AreaChart
,
BarChart
,
LineChart
and
Sparkline
components. More components will be added in the next minor releases.
Что ж, молодцы. Надо будет обязательно затестить.
Полный чейнджлог доступен тут https://mantine.dev/changelog/7-4-0/
#news #frontend #mantine
👍3👎1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Имитация подбора пароля в терминале
Подумалось 🤔 а чё бы это мне не написать что-то забавное, например, имитацию подбора пароля. Ну и написал. Вот что получилось 👆
Код, как обычно, здесь – https://github.com/DiPaolo/the-real-coding
#python #forfun
Подумалось 🤔 а чё бы это мне не написать что-то забавное, например, имитацию подбора пароля. Ну и написал. Вот что получилось 👆
Код, как обычно, здесь – https://github.com/DiPaolo/the-real-coding
#python #forfun
👍3👎1🤔1
🤣2👍1👎1🔥1🤔1