🐍 Пишем Тетрис на Python с помощью библиотеки Pygame
https://proglib.io/p/pishem-tetris-na-python-s-pomoshchyu-biblioteki-pygame-2022-05-30
@pro_python_code
https://proglib.io/p/pishem-tetris-na-python-s-pomoshchyu-biblioteki-pygame-2022-05-30
@pro_python_code
Библиотека программиста
🐍 Пишем Тетрис на Python с помощью библиотеки Pygame
Изучаем основные возможности Pygame в процессе создания lite-версии одной из самых популярных игр в мире.
🕘 schedule в Python
Вам приходилось работать с CRON? Это такой сервис в nix-системах, который позволяет регулярно в определенные моменты времени запускать скрипты или программы. Штука с долгой историей, в наследство которой достался странный синтаксиc для описания правил:
Что если бы мы хотели иметь свой CRON внутри программы Python, чтобы в нужные моменты времени вызывать функции? Да еще, чтобы у него был человеческий синтаксис? Такая библиотека есть и называется schedule.
Рассмотрим пример:
Как видите, правила для задания временных интервалов прекрасно читаются, словно они предложения на английском языке. Перевод пары примеров:
В задания можно передавать параметры вот так:
Если по какой-то причине нужно отменить задание, это делается так:
Если нужно отменить группу заданий, то к ним добавляют тэги:
Метод
Библиотека сама не обрабатывает сама исключения в ваших задачах, поэтому, возможно, понадобится создать подкласс планировщика, как в этом примере.
Если задания занимают продолжительное время или должны выполняться параллельно, то вам самостоятельно придется организовать их выполнение в отдельных потоках. Примеры есть в официальном FAQ.
Вам приходилось работать с CRON? Это такой сервис в nix-системах, который позволяет регулярно в определенные моменты времени запускать скрипты или программы. Штука с долгой историей, в наследство которой достался странный синтаксиc для описания правил:
0 * * * * my_script
Что если бы мы хотели иметь свой CRON внутри программы Python, чтобы в нужные моменты времени вызывать функции? Да еще, чтобы у него был человеческий синтаксис? Такая библиотека есть и называется schedule.
pip install schedule
Рассмотрим пример:
import schedule
import time
def job():
print("Работаю")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute.at(":17").do(job)
# нужно иметь свой цикл для запуска планировщика с периодом в 1 секунду:
while True:
schedule.run_pending()
time.sleep(1)
Как видите, правила для задания временных интервалов прекрасно читаются, словно они предложения на английском языке. Перевод пары примеров:
# спланируй.каждые(10).минут.сделать(работу)
schedule.every(10).minutes.do(job)
# спланируй.каждый().день.в(10:30).сделать(работу)
schedule.every().day.at("10:30").do(job)
В задания можно передавать параметры вот так:
def greet(name):
print('Hello', name)
schedule.every(2).seconds.do(greet, name='Alice')
Если по какой-то причине нужно отменить задание, это делается так:
def job1():
# возвращаем такой токен, и это задание снимается с выполниния в будущем
return schedule.CancelJob
schedule.every().day.at('22:30').do(job1)
Если нужно отменить группу заданий, то к ним добавляют тэги:
schedule.every().day.do(greet, 'Monica').tag('daily-tasks')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks')
schedule.clear('daily-tasks') # массовая отмена по тэгу
Метод
to
позволяет задать случайный интервал для выполнения задания, например от 5 до 10 секунд:schedule.every(5).to(10).seconds.do(my_job)
Библиотека сама не обрабатывает сама исключения в ваших задачах, поэтому, возможно, понадобится создать подкласс планировщика, как в этом примере.
Если задания занимают продолжительное время или должны выполняться параллельно, то вам самостоятельно придется организовать их выполнение в отдельных потоках. Примеры есть в официальном FAQ.
Manim – Python движок, который позволяет создавать интересные математические анимации
Другими словами, это движок для точных программных анимаций, предназначенный для создания пояснительных математических видео
⤷ Примеры использования данного движка (Рекомендую просмотреть)
@pro_python_code
Другими словами, это движок для точных программных анимаций, предназначенный для создания пояснительных математических видео
⤷ Примеры использования данного движка (Рекомендую просмотреть)
@pro_python_code
This media is not supported in your browser
VIEW IN TELEGRAM
📊 Alive-progress on Python
letters = [chr(ord('A') + x) for x in range(26)]
with alive_bar(26, dual_line=True, title='Alphabet') as bar:
for c in letters:
bar.text = f'-> Teaching the letter: {c}, please wait...'
if c in 'HKWZ':
print(f'fail "{c}", retry later')
time.sleep(0.3)
bar()
Alphabet |███████████████████████████▊ | ▃▅▇ 18/26 [69%] in 6s (3.2/s, eta: 3s)
-> Teaching the letter: S, please wait...
Git: https://github.com/rsalmei/alive-progress
letters = [chr(ord('A') + x) for x in range(26)]
with alive_bar(26, dual_line=True, title='Alphabet') as bar:
for c in letters:
bar.text = f'-> Teaching the letter: {c}, please wait...'
if c in 'HKWZ':
print(f'fail "{c}", retry later')
time.sleep(0.3)
bar()
Alphabet |███████████████████████████▊ | ▃▅▇ 18/26 [69%] in 6s (3.2/s, eta: 3s)
-> Teaching the letter: S, please wait...
Git: https://github.com/rsalmei/alive-progress
Выберите вариант ответа, где все методы есть методами словаря dict().
Anonymous Quiz
40%
get(), set(), keys(), items()
12%
setdefault(), popitem(), pop(), fromkeys()
8%
clear(), get(), push(), index()
20%
update(), remove(), values(), copy()
19%
Узнать ответ
Показываем уведомления на рабочем столе
На macOS это очень просто, даже не нужно ставить дополнительный софт и модули, а использовать встроенный osascript.
На Linux можно пойти схожим путем, задействуя программу notify-send (если у вас Ubuntu, то она почти наверняка уже установлена):
Разработчики на Windows, и о вас я не забуду. Попробуйте win10toast.
Есть ли кросс-платформенное решение? Да, это библиотека plyer от создателей Kivy.
plyer умеет не только уведомления, но и предоставляет унифицированный интерфейс к всевозможным API декстопных и мобильных ОС.
Однако, plyer потребует установки дополнительного софта или модулей для каждой платформы. Когда вы в первый раз запустите код, не удивляйтесь ошибкам. Например, на macOS мне потребовалось установить Cython и pyobjus. Библиотека plyer сам по себе не вытягивает эти зависимости, поэтому в вашем проекте не забудьте их добавить самостоятельно (например, в requirements.txt)
На macOS это очень просто, даже не нужно ставить дополнительный софт и модули, а использовать встроенный osascript.
import os
def notify_macos(title, text):
os.system("""
osascript -e 'display notification "{}" with title "{}"'
""".format(text, title))
notify_macos("Поздравляю", "Ген супер-человека найден!")
На Linux можно пойти схожим путем, задействуя программу notify-send (если у вас Ubuntu, то она почти наверняка уже установлена):
import subprocess as s
def notify_linux(message, title):
subprocess.Popen(['notify-send', title, message])
return
Разработчики на Windows, и о вас я не забуду. Попробуйте win10toast.
# pip install win10toast
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast("Заголовок",
"Текст",
duration=5)
Есть ли кросс-платформенное решение? Да, это библиотека plyer от создателей Kivy.
# pip install plyer
from plyer import notification
notification.notify(
title='Заголовок',
message='Сообщение',
app_icon=None, # e.g. 'C:\\icon_32x32.ico'
timeout=5, # секунд
)
plyer умеет не только уведомления, но и предоставляет унифицированный интерфейс к всевозможным API декстопных и мобильных ОС.
Однако, plyer потребует установки дополнительного софта или модулей для каждой платформы. Когда вы в первый раз запустите код, не удивляйтесь ошибкам. Например, на macOS мне потребовалось установить Cython и pyobjus. Библиотека plyer сам по себе не вытягивает эти зависимости, поэтому в вашем проекте не забудьте их добавить самостоятельно (например, в requirements.txt)
Декораторы Python | Разбираем Декораторы с примерами.
Декораторы бывают нескольких видов, и в этом ролике мы изучим декораторы функций, а про декораторы классов поговорим уже в следующий раз.
Смотреть это видео на youtube:
https://youtu.be/5BqtkdMGqlY
Декораторы бывают нескольких видов, и в этом ролике мы изучим декораторы функций, а про декораторы классов поговорим уже в следующий раз.
Смотреть это видео на youtube:
https://youtu.be/5BqtkdMGqlY
🐍 Работа с файлами в Python: 5 задач с решениями
https://proglib.io/p/rabota-s-faylami-v-python-5-zadach-dlya-nachinayushchih-s-resheniyami-2022-06-02
@pro_python_code
https://proglib.io/p/rabota-s-faylami-v-python-5-zadach-dlya-nachinayushchih-s-resheniyami-2022-06-02
@pro_python_code
Библиотека программиста
🐍 Работа с файлами в Python: 5 задач для начинающих с решениями
Начинаем изучать инструменты Python, предназначенные для работы с текстовыми файлами форматов .txt, .md и .csv: напишем программы для поиска и замены слов, подсчета стоимости товаров, получения статистики по тексту и преобразования информации из csv-файла…
This media is not supported in your browser
VIEW IN TELEGRAM
🏓 Пинг-Понг, пишем классическую аркадную игру на Python.
https://uproger.com/pong-klassicheskaya-arkadnaya-igra-na-python/
@pro_python_code
https://uproger.com/pong-klassicheskaya-arkadnaya-igra-na-python/
@pro_python_code
translatepy - универсальная библиотека и CLI, написанная на Python, для перевода, транслитерации, проверки орфографии, озвучивания текста в речь и поиск слов в словарях, с использованием следующих API:
• Google Translate
• Yandex Translate
• Bing Translate
• DeepL Translate
• Reverso
• MyMemory
• LibreTranslate
Библиотека использует разные лазейки в API для того чтобы бесплатно делать запросы, соответственно не требуются API ключи для работы сервисов перевода. Также есть возможность написать свой API модуль перевода.
#GitHub | #Python #Translation
@pro_python_code
• Google Translate
• Yandex Translate
• Bing Translate
• DeepL Translate
• Reverso
• MyMemory
• LibreTranslate
Библиотека использует разные лазейки в API для того чтобы бесплатно делать запросы, соответственно не требуются API ключи для работы сервисов перевода. Также есть возможность написать свой API модуль перевода.
#GitHub | #Python #Translation
@pro_python_code
🔟 Приложение на Python | Каждое в 10 строк кода + видео объяснение кода.
Запуск: git clone https://github.com/qxresearch/qxresearch-event-1
Список проектов
@pro_python_code
Запуск: git clone https://github.com/qxresearch/qxresearch-event-1
Список проектов
@pro_python_code
A Little Task Queue for Python.
Code: https://github.com/coleifer/huey
Docs: https://huey.readthedocs.io/en/latest/
Code: https://github.com/coleifer/huey
Docs: https://huey.readthedocs.io/en/latest/
О наследовании атрибутов
Видел тут на одном из каналов задачку про поле класса и наследование. Загадывать вам ее не буду, но объяснение приведу. Пусть:
Тут понятно и новичку, что поле foo вроде как "наследуется" классами Barak и Clara у класса Abram. Однако, давайте попробуем его поменять:
Видим, что у класса Barak и Clara значение стало 30, а
Работает это так. При поиске атрибута класса сначала спрашивается у самого класса, есть ли у него этот атрибут, если да, то он вернется, если нет, то идут к следующему классу, который старше по иерархии наследования (Clara → Barak → Abram → object). Если у него тоже нет, то идут еще дальше, пока не найдут, иначе возникнет исключение AttributeError.
В нашем примере будем рассуждать с конца. Чему равно
Предок класса Clara – класс Barak. Как только мы написали
А до этого атрибут foo был изначально только у Abram. Если теперь написать
Вывод: как только мы присвоим атрибут, то атрибуты классов-предков перестают на него влиять. Будьте внимательны, ведь такая же логика действует и для методов класса.
@pro_python_code
Видел тут на одном из каналов задачку про поле класса и наследование. Загадывать вам ее не буду, но объяснение приведу. Пусть:
class Abram:
foo = 10
class Barak(Abram):
pass
class Clara(Barak):
pass
print(Abram.foo, Barak.foo, Clara.foo) # 10 10 10
Тут понятно и новичку, что поле foo вроде как "наследуется" классами Barak и Clara у класса Abram. Однако, давайте попробуем его поменять:
Abram.foo = 20
print(Abram.foo, Barak.foo, Clara.foo) # 20 20 20
Barak.foo = 30
print(Abram.foo, Barak.foo, Clara.foo) # 20 30 30
Abram.foo = 40
print(Abram.foo, Barak.foo, Clara.foo) # 40 30 30
Видим, что у класса Barak и Clara значение стало 30, а
Abram.foo
живет своей жизнью после Barak.foo = 30
и не перестало влиять на прочие классы.Работает это так. При поиске атрибута класса сначала спрашивается у самого класса, есть ли у него этот атрибут, если да, то он вернется, если нет, то идут к следующему классу, который старше по иерархии наследования (Clara → Barak → Abram → object). Если у него тоже нет, то идут еще дальше, пока не найдут, иначе возникнет исключение AttributeError.
В нашем примере будем рассуждать с конца. Чему равно
Clara.foo
? Есть ли атрибут foo у Clara? Вообще говоря, его нет, ведь мы ни разу не присваивали ничего к Clara.foo
:>>> 'foo' in Clara.__dict__
False
Предок класса Clara – класс Barak. Как только мы написали
Barak.foo = 30
в классе Barak появился свой собственный foo:>>> Barak.foo = 20
>>> 'foo' in Barak.__dict__
True
А до этого атрибут foo был изначально только у Abram. Если теперь написать
Clara.foo = 50
, то у каждого из классов будет свой foo.Clara.foo = 50
print(Abram.foo, Barak.foo, Clara.foo) # 40 30 50
Вывод: как только мы присвоим атрибут, то атрибуты классов-предков перестают на него влиять. Будьте внимательны, ведь такая же логика действует и для методов класса.
@pro_python_code
💻 Karbon tracks background mouse events and turns them into artistic values!
@pythonl
pip install karbon
Code: https://github.com/furkanonder/karbon@pythonl