This media is not supported in your browser
VIEW IN TELEGRAM
Встроенный календарь в Питоне 🗓️
Знали ли вы, что в Питоне уже есть встроенный календарь, который можно легко вывести вызовом одной функции?
Сможете написать такой сами?
#python #calendar
Знали ли вы, что в Питоне уже есть встроенный календарь, который можно легко вывести вызовом одной функции?
import calendar
# печатает месяц
calendar.prmonth(2024, 2)
# печатает весь календарный год
calendar.prcal(2024)
Сможете написать такой сами?
#python #calendar
👍1👎1🔥1🤔1
🐶 ауффффф
хочу сегодня поделиться с вами ТГ-ботом, написанным вчера на скорую руку просто по фану
@dp_doggy_dog_bot
бот делает ровно одну конкретную вещь – показывает рандомную фото рандомной собаки + также рандомный факт о собаках
кому интересно, код здесь https://github.com/DiPaolo/doggy-dog-bot. Там все предельно просто – 1 файлик, сгенеренный на основе моего темплейта для ТГ-ботов (который вы также можете найти на моем ГитХабе) + дергаем стороннюю открытую АПИшку + выкачал ~400 рандомных фактов, перевел утилитой, завернул в список и положил его в pickle-файлик
наслаждайтесь милотой ☺️
#telegramBot #python #fun #dogs
хочу сегодня поделиться с вами ТГ-ботом, написанным вчера на скорую руку просто по фану
@dp_doggy_dog_bot
бот делает ровно одну конкретную вещь – показывает рандомную фото рандомной собаки + также рандомный факт о собаках
кому интересно, код здесь https://github.com/DiPaolo/doggy-dog-bot. Там все предельно просто – 1 файлик, сгенеренный на основе моего темплейта для ТГ-ботов (который вы также можете найти на моем ГитХабе) + дергаем стороннюю открытую АПИшку + выкачал ~400 рандомных фактов, перевел утилитой, завернул в список и положил его в pickle-файлик
наслаждайтесь милотой ☺️
#telegramBot #python #fun #dogs
GitHub
GitHub - DiPaolo/doggy-dog-bot: Telegram bot to get a random dog photo & fact
Telegram bot to get a random dog photo & fact. Contribute to DiPaolo/doggy-dog-bot development by creating an account on GitHub.
👍1👎1🔥1🤔1
Как работает веб-сервер 🤔 объясняю на пальцах
расскажу сегодня простыми словами, как работают сайты и как получается, что после ввода адреса своего любимого сайта в браузерной строке у тебя появляется страница
1. браузер берет введенный адрес (по сути это адресат, как на конверте) и идет по нему куда-то там на сервер
2. запущенная на сервере (специальный или даже обычный компьютер) программа получает запрос вида “а дай-ка мне страницу – там пользователь просит”, формирует исходный код страницы на языке HTML (это такой язык разметки веб-страниц) и отдает обратно отправителю
3. далее по сетям этот ответ идет обратно и возвращается к нам в браузер. После чего тот красиво рисует сайт на основе полученного описания в формате HTML
код тут 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server/simplest_web_server.py
берите и запускайте свой первый собственный веб-сервер 💪
#python #webServer #howItWorks #наПальцах
расскажу сегодня простыми словами, как работают сайты и как получается, что после ввода адреса своего любимого сайта в браузерной строке у тебя появляется страница
1. браузер берет введенный адрес (по сути это адресат, как на конверте) и идет по нему куда-то там на сервер
2. запущенная на сервере (специальный или даже обычный компьютер) программа получает запрос вида “а дай-ка мне страницу – там пользователь просит”, формирует исходный код страницы на языке HTML (это такой язык разметки веб-страниц) и отдает обратно отправителю
3. далее по сетям этот ответ идет обратно и возвращается к нам в браузер. После чего тот красиво рисует сайт на основе полученного описания в формате HTML
код тут 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server/simplest_web_server.py
берите и запускайте свой первый собственный веб-сервер 💪
#python #webServer #howItWorks #наПальцах
👍2👎1🤔1
Реальный Код
Как работает веб-сервер 🤔 объясняю на пальцах расскажу сегодня простыми словами, как работают сайты и как получается, что после ввода адреса своего любимого сайта в браузерной строке у тебя появляется страница 1. браузер берет введенный адрес (по сути это…
продолжим… и поиграемся немного с нашим сервером
вывести дату – уже неплохо. Но давайте добавим чуть больше какой-то логики поинтереснее
например, выведем календарь на текущий месяц. Мы уже делали это выше стандартными средствами Питона 👆 https://t.me/the_real_coding/28
просто переиспульзуем ту же функцию + завернем ее вывод в формат HTML
код в итоге стал не сильно сложнее + там есть мои комменты – обязательно посмотрите. При этом мы продвинулись вперед и добавили нашему серверу чуть больше полезности
а впереди еще интереснее! 😉
код: https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar.py
запустите сами и проверьте у себя. Вам нужен только лишь Питон, даже IDE не потребуется 👌
#python #calendar #webServer #играемся
вывести дату – уже неплохо. Но давайте добавим чуть больше какой-то логики поинтереснее
например, выведем календарь на текущий месяц. Мы уже делали это выше стандартными средствами Питона 👆 https://t.me/the_real_coding/28
просто переиспульзуем ту же функцию + завернем ее вывод в формат HTML
код в итоге стал не сильно сложнее + там есть мои комменты – обязательно посмотрите. При этом мы продвинулись вперед и добавили нашему серверу чуть больше полезности
а впереди еще интереснее! 😉
код: https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar.py
import calendar
import datetime
import http
from http.server import BaseHTTPRequestHandler, HTTPServer
Handler = http.server.SimpleHTTPRequestHandler
class HelloWorldServer(BaseHTTPRequestHandler):
def do_GET(self):
# печатаем текущий месяц и сохраняем в строку
today = datetime.datetime.today()
month_calendar_str = calendar.month(today.year, today.month)
# в HTML есть ряд особенностей вывода текста; обрабатываем их:
# 1. переход на новую строку в HTML осуществляется не с помощью символа '\n',
# а добавлением тега '<br>'
month_calendar_str = month_calendar_str.replace('\n', '<br>')
# 2. несколько пробелов подряд выводятся как один, потому вместо каждого
# пробела ставим спец. символ, принудительно вставляющего пробел
month_calendar_str = month_calendar_str.replace(' ', ' ')
# добавляем в наш HTML-код страницы пункт, указывающий, какая кодировка
# используется на странице:
# <meta charset="UTF-8">
# это нужно, чтобы корректно отображались русские символы
# еще один нюанс - используем тег '<tt>' (телетайп, то есть моноширинный шрифт),
# чтобы наши строки не съезжали и все понедельники были друг под другом,
# а субботы - под субботами
html_page = \
f"""
<html>
<head>
<title>Hello, World!</title>
<meta charset="UTF-8">
</head>
<body>
<h1 align='center'>Календарь</h1>
<tt>
{month_calendar_str}
</tt>
</body>
</html>
"""
body = html_page.encode('UTF-8', 'replace')
self.send_response(200)
self.send_header("Content-type", "text/html")
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
if __name__ == "__main__":
webServer = HTTPServer(server_address=('127.0.0.1', 8080),
RequestHandlerClass=HelloWorldServer)
print('Server started')
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
except Exception as ex:
print(f'Server unexpectedly finished ({ex})')
webServer.server_close()
print('Server stopped')
запустите сами и проверьте у себя. Вам нужен только лишь Питон, даже IDE не потребуется 👌
#python #calendar #webServer #играемся
👍1👎1🔥1🤔1
совершенствуем наш календарь 🗓️
- отметим красным цветом выходные дни, для чего напишем собственную функцию
- используем тег
- используем русские названия дней недели и месяцев
- выделим текущий день
- выведем весь календарный год
полный код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year.py
смотрите-изучайте-задавайте вопросы 🙌
PS запилил пост и потом понял, что ошибочка затесалась – не отображались последние дни месяцев 😅 недотестировал 😁
#python #calendar #webServer #играемся
- отметим красным цветом выходные дни, для чего напишем собственную функцию
- используем тег
<table>
, чтобы дни недели были выровнены друг под другом- используем русские названия дней недели и месяцев
- выделим текущий день
- выведем весь календарный год
полный код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year.py
смотрите-изучайте-задавайте вопросы 🙌
PS запилил пост и потом понял, что ошибочка затесалась – не отображались последние дни месяцев 😅 недотестировал 😁
#python #calendar #webServer #играемся
👍2👎1🤔1
+ АПИшку давайте прикрутим, чё уж там 😁
дернем публичное АПИ для получения списка праздников, чтобы отметить красным официальные выходные дни
тут в канале все как всегда просто, когда двигаемся маленькими шагами step-by-step – берем
код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year_with_public_holidays.py
#python #publicApi #requests #webServer #calendar #играемся
дернем публичное АПИ для получения списка праздников, чтобы отметить красным официальные выходные дни
тут в канале все как всегда просто, когда двигаемся маленькими шагами step-by-step – берем
requests
, получаем ответ по URL-адресу для России, ответ преобразуем в питоновский объект списка, а оттуда выдираем список дат-праздников. Далее, если выводимая дата находится в этом списке, то отмечаем ее красным также, как и выходные дни:
def get_public_holidays(year: int) -> List[datetime.date]:
out = list()
res = requests.get(f'https://date.nager.at/api/v3/PublicHolidays/{year}/ru')
if not res.ok:
return out
holiday_list_data = res.json()
for holiday in holiday_list_data:
date_str = holiday['date']
date = datetime.datetime.strptime(date_str, '%Y-%m-%d')
out.append(date.date())
return out
код 👉 https://github.com/DiPaolo/the-real-coding/blob/main/python/simplest_web_server_ext/simplest_web_server_calendar_full_year_with_public_holidays.py
#python #publicApi #requests #webServer #calendar #играемся
👍3👎1🤔1
«Что будет проще для понимания условного гуманитария: js или питон?»
⏬⏬⏬
#вопросОтвет #расскажуЗаМинуту #python #js #вкатывание
⏬⏬⏬
#вопросОтвет #расскажуЗаМинуту #python #js #вкатывание
👍3👎1🤔1
спешу поделиться с вами радостью!
в совсем недавно вышедший питон 3.13 вошел мой фикс 😃 ууууууррррааааааа 🥳 несказанно счастлив и горжусь 💪
бага была зарепорчена мною еще года три назад, и пофикшена тогда же:
argparse incorrectly shows help string on a new line in case of long command string (https://github.com/python/cpython/issues/87041)
а вот и сам фикс: https://github.com/python/cpython/commit/8d3a0fecbe2edb69cf66db82f1c59601aac94651
так что вот, приложил свою руку 😎☺️
#python
в совсем недавно вышедший питон 3.13 вошел мой фикс 😃 ууууууррррааааааа 🥳 несказанно счастлив и горжусь 💪
бага была зарепорчена мною еще года три назад, и пофикшена тогда же:
argparse incorrectly shows help string on a new line in case of long command string (https://github.com/python/cpython/issues/87041)
а вот и сам фикс: https://github.com/python/cpython/commit/8d3a0fecbe2edb69cf66db82f1c59601aac94651
так что вот, приложил свою руку 😎☺️
#python
GitHub
argparse incorrectly shows help string on a new line in case of long command string · Issue #87041 · python/cpython
BPO 42875 Nosy @rhettinger, @DiPaolo PRs #24177 Files argparse-indent-sample.py Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state...
🔥3👍2👎2❤1👏1🤔1🤓1
что же касается самого релиза, то я для себя отметил следующее:
- PEP 703 – Making the Global Interpreter Lock Optional in CPython (https://peps.python.org/pep-0703/)
- вместо него есть штука Free-threaded CPython (https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython)
- A better interactive interpreter (https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-better-interactive-interpreter)
- PEP 730 – Adding iOS as a supported platform (https://peps.python.org/pep-0730/)
- PEP 738 – Adding Android as a supported platform (https://peps.python.org/pep-0738/)
полный список фич и обновлений тут https://www.python.org/downloads/release/python-3130/
🐍
#python #release
- PEP 703 – Making the Global Interpreter Lock Optional in CPython (https://peps.python.org/pep-0703/)
- вместо него есть штука Free-threaded CPython (https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython)
- A better interactive interpreter (https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-better-interactive-interpreter)
- PEP 730 – Adding iOS as a supported platform (https://peps.python.org/pep-0730/)
- PEP 738 – Adding Android as a supported platform (https://peps.python.org/pep-0738/)
полный список фич и обновлений тут https://www.python.org/downloads/release/python-3130/
🐍
#python #release
👍5👎2🤔2
как ускорить своего бота в 10x раз 🚀
сегодня покажу одну маленькую вещь, которая может значительно ускорить вашу систему. Эта вещь – кэширование. Кэширование активно применяется на всех уровнях: от кэша процессора L1/L2/L3 и до кэширующих баз данных типа Redis
вкратце, суть такова: если есть сложные вычисления либо доступ к данным занимает длительное время, и данные какое-то время будут актуальны – можно их сохранить «поближе» к себе в более скоростном месте
например, доступ к оперативной памяти значительно быстрее доступа к диску, а доступ к диску значительно быстрее, чем получить данные по сети
надеюсь, тут все понятно. теперь к мааааааааленькому одному конкретному примеру, как я это сделал на практике
есть у меня бот, который показывает погоду в нескольких городах. Погоду он берет с некоторого погодного АПИ. На каждый город (допустим их 4) нужно сходить с запросом к серверу
но мы понимаем, что в течение часа погода сильно не изменится. Потому я решаю е ходить в течение часа за погодой в том же регионе, а сохранить ее у себя. ВАЖНО я бы не мог сделать такое допущение, если бы это был сервис предупреждения о бурях и другой непогоде где-нибудь в горах. Мой бот позволяет мне пренебречь этим и показывать «старую» погода в пределах часа
в Питоне есть встроенный удобные декоратор – @lru_cache (https://docs.python.org/3/library/functools.html). Однако в нем нету TTL (time to live – то есть сколько наши данные не будут «протухшими» по времени)
чтобы не городить огород самому с этим TTL вокруг стандартной функции, я легко нашел и воспользовался библиотеку с такой функциональностью – https://pypi.org/project/cachetools/
вот что получилось:
теперь, сделав запрос один раз, декоратор у себя в мапяти(!) сохранят значение (да-да! прямо JSON). И в следующий раз приобращении к этой функции с теми же аргументами, не будет выполнять код функции, а вместо этого вернет уже готовый результат. При этом, чере час он очистит кэш для этих входных аргументов функции, чтобы снова сходить на сервер по АПИ и получить актуальную погоду
вот результат – 10x в скорости ответа. А это значит, что мои пользователи увидят ответ значительно быстрее 😀
вот запрос первый раз (некэшированные данные)
после этого запроса они закэшировались, и то же обращение за погодой отрабатывает уже в 10 раз быстрее!
и так происходит в течение часа (обратите внимание на время):
по истечению же часа мы вновь тратим чуть больше времени, чтобы обновить данные и снова записать их в кэш:
после чего – опять быстро выдаем ответ пользователю:
вот такие дела… на все про все – 15 минут и 10x быстрее работа бота 😎
#python #cache #ускоряем #боты
сегодня покажу одну маленькую вещь, которая может значительно ускорить вашу систему. Эта вещь – кэширование. Кэширование активно применяется на всех уровнях: от кэша процессора L1/L2/L3 и до кэширующих баз данных типа Redis
вкратце, суть такова: если есть сложные вычисления либо доступ к данным занимает длительное время, и данные какое-то время будут актуальны – можно их сохранить «поближе» к себе в более скоростном месте
например, доступ к оперативной памяти значительно быстрее доступа к диску, а доступ к диску значительно быстрее, чем получить данные по сети
надеюсь, тут все понятно. теперь к мааааааааленькому одному конкретному примеру, как я это сделал на практике
есть у меня бот, который показывает погоду в нескольких городах. Погоду он берет с некоторого погодного АПИ. На каждый город (допустим их 4) нужно сходить с запросом к серверу
но мы понимаем, что в течение часа погода сильно не изменится. Потому я решаю е ходить в течение часа за погодой в том же регионе, а сохранить ее у себя. ВАЖНО я бы не мог сделать такое допущение, если бы это был сервис предупреждения о бурях и другой непогоде где-нибудь в горах. Мой бот позволяет мне пренебречь этим и показывать «старую» погода в пределах часа
в Питоне есть встроенный удобные декоратор – @lru_cache (https://docs.python.org/3/library/functools.html). Однако в нем нету TTL (time to live – то есть сколько наши данные не будут «протухшими» по времени)
чтобы не городить огород самому с этим TTL вокруг стандартной функции, я легко нашел и воспользовался библиотеку с такой функциональностью – https://pypi.org/project/cachetools/
вот что получилось:
@cached(cache=TTLCache(maxsize=512, ttl=60*60))
def get_weather_at_location(latitude, longitude):
ret = requests.get(
f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}"
f"&hourly=temperature_2m,weather_code,wind_speed_10m&wind_speed_unit=ms¤t_weather=true&timezone=Asia%2FNovosibirsk")
return ret.json()
теперь, сделав запрос один раз, декоратор у себя в мапяти(!) сохранят значение (да-да! прямо JSON). И в следующий раз приобращении к этой функции с теми же аргументами, не будет выполнять код функции, а вместо этого вернет уже готовый результат. При этом, чере час он очистит кэш для этих входных аргументов функции, чтобы снова сходить на сервер по АПИ и получить актуальную погоду
вот результат – 10x в скорости ответа. А это значит, что мои пользователи увидят ответ значительно быстрее 😀
вот запрос первый раз (некэшированные данные)
2024-11-04 13:57:58,786 - root - INFO - request stats (chat_id=218988127, message_id=121, time_sec=1.85)
после этого запроса они закэшировались, и то же обращение за погодой отрабатывает уже в 10 раз быстрее!
2024-11-04 13:58:02,425 - root - INFO - request stats (chat_id=218988127, message_id=123, time_sec=0.17)
и так происходит в течение часа (обратите внимание на время):
2024-11-04 14:18:35,425 - root - INFO - request stats (chat_id=218988127, message_id=133, time_sec=0.139)
по истечению же часа мы вновь тратим чуть больше времени, чтобы обновить данные и снова записать их в кэш:
2024-11-04 15:10:33,043 - root - INFO - request stats (chat_id=218988127, message_id=137, time_sec=1.89)
после чего – опять быстро выдаем ответ пользователю:
2024-11-04 15:10:36,277 - root - INFO - request stats (chat_id=218988127, message_id=139, time_sec=0.215)
вот такие дела… на все про все – 15 минут и 10x быстрее работа бота 😎
#python #cache #ускоряем #боты
👍3👎2🔥2🤔1🤓1
лист компрехэншн
если вы хоть раз задумывались, зачем нужны list comprehension в питоне, и, может быть думали, что они быстрее, то все просто и однозначный ответ раскрыт в PEP 202 (https://peps.python.org/pep-0202/):
так что это всего лишь для краткости записи
#python #pep #comprehension
если вы хоть раз задумывались, зачем нужны list comprehension в питоне, и, может быть думали, что они быстрее, то все просто и однозначный ответ раскрыт в PEP 202 (https://peps.python.org/pep-0202/):
Rationale
List comprehensions provide a more concise way to create lists in situations where map() and filter() and/or nested loops would currently be used.
так что это всего лишь для краткости записи
[subscriber.add_mark(random.choice(['👍', '👎', '🤔'])) for subscriber in get_subscribers()]
#python #pep #comprehension
👍4❤2🔥2🤓1👀1
Реальный Код
хотелось написать сюда, но не знал о чем… 🤔 … и накидал скрипт, который считает статистику использования мною команд в терминале что получилось – ниже 👇 выше ☝️ можно такое на собесах спрашивать, чтобы больше узнать о человеке: чем пользуется, какой стек…
вот оформил код. Пробуйте и делитесь, что получилось у вас 🤗
https://github.com/DiPaolo/deepeasy-terminal-stats
#gitHub #sourceCode #link #python #terminal #stats
https://github.com/DiPaolo/deepeasy-terminal-stats
#gitHub #sourceCode #link #python #terminal #stats
🔥4🥰3❤2🤓1
finita la comedia
нет-нет, все хорошо, просто речь сегодня пойдет про ключевое слово (а точнее – аннотацию) final в питоне
надо сказать, что я лично узнал об этой фиче совсем недавно, тогда как в языке она присутствует с версии 3.8
ну и сразу дам ссылку на PEP – https://peps.python.org/pep-0591/
если говорить кратко – это аналог ключевого слова const в других языках. тем самым мы говорим, что значение переменной не будет меняться
хотя погодите! все ли так очевидно? давайте смотреть на примере…
вывод:
хммммм…. но как же так?! я же сам сказал, что это константа, как мы смогли поменять ее значение??
все дело в том, что мы должны помнить, питон – нетипизированный язык! и все эти задания типов, в том числе и рассматриваемая сегодня аннотация final – это не строгое правило, а лишь подсказка (так и называется – type hint) для IDE и для утилит статического анализа
то есть, в ИДЕшке-то оно вам подсветит возможную проблему, а статический анализатор навроде ruff – ругнется и скажет, что у вас ошибка в коде. при всем при это код вы сможете запустить и он будет изменять значение вашей переменной, обозначенной как final!
так что имейте ввиду эту особенность, ну и конечно крайне рекомендую – используйте аннотацию final везде, где только возможно. этим вы еще дополнительно скажете человеку, который будет читать ваш код, что это – константа, и не предполагается ее изменение. хотя, теперь вы знаете, что если очень хочется… 😁
#python #final
нет-нет, все хорошо, просто речь сегодня пойдет про ключевое слово (а точнее – аннотацию) final в питоне
надо сказать, что я лично узнал об этой фиче совсем недавно, тогда как в языке она присутствует с версии 3.8
ну и сразу дам ссылку на PEP – https://peps.python.org/pep-0591/
если говорить кратко – это аналог ключевого слова const в других языках. тем самым мы говорим, что значение переменной не будет меняться
хотя погодите! все ли так очевидно? давайте смотреть на примере…
from typing import Final
TEST = 11
print(f'TEST before: {TEST}')
TEST += 1
print(f'TEST after: {TEST}')
TEST_CONST: Final = 12
print(f'TEST_CONST before: {TEST_CONST}')
TEST_CONST += 1
print(f'TEST_CONST after: {TEST_CONST}')
вывод:
TEST before: 11
TEST after: 12
TEST_CONST before: 12
TEST_CONST after: 13
хммммм…. но как же так?! я же сам сказал, что это константа, как мы смогли поменять ее значение??
все дело в том, что мы должны помнить, питон – нетипизированный язык! и все эти задания типов, в том числе и рассматриваемая сегодня аннотация final – это не строгое правило, а лишь подсказка (так и называется – type hint) для IDE и для утилит статического анализа
то есть, в ИДЕшке-то оно вам подсветит возможную проблему, а статический анализатор навроде ruff – ругнется и скажет, что у вас ошибка в коде. при всем при это код вы сможете запустить и он будет изменять значение вашей переменной, обозначенной как final!
так что имейте ввиду эту особенность, ну и конечно крайне рекомендую – используйте аннотацию final везде, где только возможно. этим вы еще дополнительно скажете человеку, который будет читать ваш код, что это – константа, и не предполагается ее изменение. хотя, теперь вы знаете, что если очень хочется… 😁
#python #final
🤔3😱3👀3
я завалил собес по питону 😒
это было ожидаемо, на самом деле… ввиду моей особенности. те, кто знакомы со мной лично, могут знать: я очень плох в технических собесах
я могу что угодно написать: написать быстро, хорошо, качественно, практически на любом языке и независимо от фреймворка… я легко переключаюсь между языками и фреймворками, даже стеками… но на собесе… 😒😒😒 на собесе совсем не так
такая вот у меня особенность 🤷♂️ да, я хорош в практике и очень плох в теории. а готовиться-зубрить… ну честно говоря не хочется, да и смысла большого не вижу
вообще, собес был ну очень простой 🤦♂️
но вот эта моя особенность не позволила мне его пройти. но как сказал в начале – я особо и не возлагал на него надежд. позиция кстати была изначалльно на юнит-лида, но потом перешла на тимлида. так что да – это был собес по питону на тимлида
что ваще смешно: была задача, которую я сам делал 2 недели назад 😅 в своем рабочем коде. мне там понадобилось считать длительность отработки запроса, и я прикрутил декоратор, который это делает. ну прикрутил за 20 минут и забыл
да, так это работает у меня: я могу быстро найти решение, запилить его и дальше забыть. но при этом буду помнить, где, что, для чего и как в общих чертах я это делал
и тут они значит дают задачу: написать декоратор, который запускает функцию N раз и считает длительность ее выполнения. и я не смог его написать! 😩 я помнил, когда, где и для чего писал такой же декоратор, а вот вспомнить наизусть синтаксис я не смог 🤷♂️
короче, такие у меня дела…
это я все к чему… ну во-первых, поделиться с вами. во-вторых, вас ждут решения этих задач 😅
#python #собес
это было ожидаемо, на самом деле… ввиду моей особенности. те, кто знакомы со мной лично, могут знать: я очень плох в технических собесах
я могу что угодно написать: написать быстро, хорошо, качественно, практически на любом языке и независимо от фреймворка… я легко переключаюсь между языками и фреймворками, даже стеками… но на собесе… 😒😒😒 на собесе совсем не так
такая вот у меня особенность 🤷♂️ да, я хорош в практике и очень плох в теории. а готовиться-зубрить… ну честно говоря не хочется, да и смысла большого не вижу
вообще, собес был ну очень простой 🤦♂️
но вот эта моя особенность не позволила мне его пройти. но как сказал в начале – я особо и не возлагал на него надежд. позиция кстати была изначалльно на юнит-лида, но потом перешла на тимлида. так что да – это был собес по питону на тимлида
что ваще смешно: была задача, которую я сам делал 2 недели назад 😅 в своем рабочем коде. мне там понадобилось считать длительность отработки запроса, и я прикрутил декоратор, который это делает. ну прикрутил за 20 минут и забыл
да, так это работает у меня: я могу быстро найти решение, запилить его и дальше забыть. но при этом буду помнить, где, что, для чего и как в общих чертах я это делал
и тут они значит дают задачу: написать декоратор, который запускает функцию N раз и считает длительность ее выполнения. и я не смог его написать! 😩 я помнил, когда, где и для чего писал такой же декоратор, а вот вспомнить наизусть синтаксис я не смог 🤷♂️
короче, такие у меня дела…
это я все к чему… ну во-первых, поделиться с вами. во-вторых, вас ждут решения этих задач 😅
#python #собес
😱2😢2😭2😨1😎1
то самое слово – корутины 😱
читаю сейчас первоисточник про корутины в питоне – PEP 492 – Coroutines with async and await syntax (https://peps.python.org/pep-0492/)
позже приду к вам с мыслями и информацией по поводу асинхронщины нашей любимой 😆 … и такой полезной 🔥
#python #pep #coroutines #async
читаю сейчас первоисточник про корутины в питоне – PEP 492 – Coroutines with async and await syntax (https://peps.python.org/pep-0492/)
позже приду к вам с мыслями и информацией по поводу асинхронщины нашей любимой 😆 … и такой полезной 🔥
#python #pep #coroutines #async
🔥3🤓2👀2
Реальный Код
хотелось написать сюда, но не знал о чем… 🤔 … и накидал скрипт, который считает статистику использования мною команд в терминале что получилось – ниже 👇 выше ☝️ можно такое на собесах спрашивать, чтобы больше узнать о человеке: чем пользуется, какой стек…
сегодня начинаю серию постов про мои топ утилиты/программы, которые я чаще всего использую
и начинаем мы... па-бааааааа-мммм... ну конечно же с питона 😆
python – это программа-интерпретатор одноименного языка программирования. что значит интерпретатор? а это такая программа, которая читает исходный код программы на этом языке и исполняет каждую строку за строкой
пробежимся по основным возможностям...
вообще, вот следующие три варианта можно использовать во всех unix-подобных операционных системах и частично с некоторыми особенностями – в Windows
// показать справку по аргументам программы и краткую информацию по ее использованию (вместо питона может быть любая программа):
в среде Windows исторически было принято вызывать страницу с описанием параметров с помощью аргумента /h или /?, однако сейчас все больше программ, которые используют unix-like стиль. да и в целом, кросс-платформенные программы обычно используют тот же unix-like подход
// вывести версию программы:
// получить развернутую помощь по программе (unix-like системы: Linux, MacOS и прочие):
еще раз подчеркну, что три варианта использования выше применимы к абсолютному большинству программ и утилит. рекомендую первым делом всегда начинать знакомство с новой утилитой через эти параметры
итак, к питону...
// запустить скрипт на выполнение:
// запустить пакет на выполнение:
например, вывести список установленных пакетов:
тут мы говорим интерпретатору запустить пакет (`-m`) с именем pip и передать ему параметр list. в итоге будет распечатан список установленных пакетов
// выполнить кусок питоновского кода:
например, вот так мы можем сгенерировать пароль:
этот код выведет что-то вроде:
или в другой раз:
// запустить интерактивную среду Python (она ещеназывается REPL, Read-Eval-Print Loop), или, проще говоря, ИДЕ на самых минималках, а скорее даже питонячий плейграунд для проверки каких-то конструкций языка:
при этом у вас появится в начале строки такой знак:
который означает, что вы находитесь как раз в интерактивном интерпретаторе питона
в нем вы можете также писать исходный код, включая многостроковые конструкции. после вбивания питоновских конструкций и жамканья Enter вы будете тут же получать результат. рекомендую: зайдите-поиграйтесь, если еще не пробовали
для выхода используйте функцию exit()
вот например как может это выглядеть:
на этом на сегодня все. happy питонинга вам 😉
#python #repl #terminal
и начинаем мы... па-бааааааа-мммм... ну конечно же с питона 😆
python – это программа-интерпретатор одноименного языка программирования. что значит интерпретатор? а это такая программа, которая читает исходный код программы на этом языке и исполняет каждую строку за строкой
пробежимся по основным возможностям...
вообще, вот следующие три варианта можно использовать во всех unix-подобных операционных системах и частично с некоторыми особенностями – в Windows
// показать справку по аргументам программы и краткую информацию по ее использованию (вместо питона может быть любая программа):
python --help
в среде Windows исторически было принято вызывать страницу с описанием параметров с помощью аргумента /h или /?, однако сейчас все больше программ, которые используют unix-like стиль. да и в целом, кросс-платформенные программы обычно используют тот же unix-like подход
// вывести версию программы:
python --version
// получить развернутую помощь по программе (unix-like системы: Linux, MacOS и прочие):
man python
еще раз подчеркну, что три варианта использования выше применимы к абсолютному большинству программ и утилит. рекомендую первым делом всегда начинать знакомство с новой утилитой через эти параметры
итак, к питону...
// запустить скрипт на выполнение:
python my_script.py
// запустить пакет на выполнение:
python -m package
например, вывести список установленных пакетов:
python -m pip list
тут мы говорим интерпретатору запустить пакет (`-m`) с именем pip и передать ему параметр list. в итоге будет распечатан список установленных пакетов
// выполнить кусок питоновского кода:
python -c <код>
например, вот так мы можем сгенерировать пароль:
python -c "import random; print(''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)))"
этот код выведет что-то вроде:
2Lqszm8l
или в другой раз:
WTgs90No
// запустить интерактивную среду Python (она ещеназывается REPL, Read-Eval-Print Loop), или, проще говоря, ИДЕ на самых минималках, а скорее даже питонячий плейграунд для проверки каких-то конструкций языка:
python
при этом у вас появится в начале строки такой знак:
>>>
который означает, что вы находитесь как раз в интерактивном интерпретаторе питона
в нем вы можете также писать исходный код, включая многостроковые конструкции. после вбивания питоновских конструкций и жамканья Enter вы будете тут же получать результат. рекомендую: зайдите-поиграйтесь, если еще не пробовали
для выхода используйте функцию exit()
вот например как может это выглядеть:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2024, 11, 16, 20, 9, 31, 518836)
>>> ll = [1, 2, 3, 4, 5]
>>> ll
[1, 2, 3, 4, 5]
>>> '-'.join(ll)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> ', '.join(ll)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> ll = ['a', 'b', 'c']
>>> '-'.join(ll)
'a-b-c'
>>> exit()
на этом на сегодня все. happy питонинга вам 😉
#python #repl #terminal
🔥3👍2❤1
о полезности чтения чужих исходников
я кажется уже упомниал, что крайне полезно читать чужой код. благо, егокак говна за баней очень много на ГитХабе: по любой тематике, любого качества, на любом языке
через это ты не только учишься быстро понимать и вникать в код (а это тоже навык), но самое главное – можешь учиться новому (к вопросу про мой предыдущий пост, кстати☝️), перенимать какие-то фишки, приемчики или даже узнавать новые конструкции языка или используемые бибилиотеки. ну а где-то, наоборот, можешь понять, почему ты бы написал лучше и чем данный код плох, какие есть минусы и почему его сложно читать (=поддерживать)
это, кстати, касается и код-ревью: важно читать и перенимать чужой опыт и фишечки написания кода
так вот… читаю я сегодня на досуге код OpenShot (это такой видеоредактор). а что примечательно – его ГУЕвая часть написана на связке Python+Qt
читаю-читаю, и натыкаюсь в разделе инициализации логов на такую конструкцию:
и узнаю, что в питоне, оказывается, из коробки есть log rotation (об этом в другой раз; вкратце, это когда лог пишется до определенного момента в файл, после чего начинает писаться в следующий файл, чтобы файлы не разрастались)
поглядел в доке: так там целая поляна всевозможных лог хендлеров, от null до отправления UDP-датаграмм
так что в очередной раз даю совет: читайте чужой код!
#python #log #sourceCode #опыт
я кажется уже упомниал, что крайне полезно читать чужой код. благо, его
через это ты не только учишься быстро понимать и вникать в код (а это тоже навык), но самое главное – можешь учиться новому (к вопросу про мой предыдущий пост, кстати☝️), перенимать какие-то фишки, приемчики или даже узнавать новые конструкции языка или используемые бибилиотеки. ну а где-то, наоборот, можешь понять, почему ты бы написал лучше и чем данный код плох, какие есть минусы и почему его сложно читать (=поддерживать)
это, кстати, касается и код-ревью: важно читать и перенимать чужой опыт и фишечки написания кода
так вот… читаю я сегодня на досуге код OpenShot (это такой видеоредактор). а что примечательно – его ГУЕвая часть написана на связке Python+Qt
читаю-читаю, и натыкаюсь в разделе инициализации логов на такую конструкцию:
#
# Create rotating file handler
#
if os.path.exists(info.USER_PATH):
fh = logging.handlers.RotatingFileHandler(
os.path.join(info.USER_PATH, 'openshot-qt.log'),
encoding="utf-8",
maxBytes=25*1024*1024, backupCount=3)
fh.setLevel(info.LOG_LEVEL_FILE)
fh.setFormatter(file_formatter)
log.addHandler(fh)
else:
class DummyHandler:
def setLevel(self, level):
return True
fh = DummyHandler()
и узнаю, что в питоне, оказывается, из коробки есть log rotation (об этом в другой раз; вкратце, это когда лог пишется до определенного момента в файл, после чего начинает писаться в следующий файл, чтобы файлы не разрастались)
поглядел в доке: так там целая поляна всевозможных лог хендлеров, от null до отправления UDP-датаграмм
так что в очередной раз даю совет: читайте чужой код!
#python #log #sourceCode #опыт
🔥2👍1👌1