Pythoner
6.96K subscribers
922 photos
27 videos
4 files
715 links
Полезные материалы по Python, которые будут интересны опытному и начинающему разработчику.

Сотрудничество - @flattys
Цены - @serpent_media

Канал на бирже: https://telega.in/c/pythonercode
Download Telegram
✈️Метод strip() удаляет начальные и конечные пробелы (а также другие переданные символы) из строки. Это удобно для очистки ввода, сравнения данных и предобработки текста.

➡️Пример:
user_input = "  hello world  "
cleaned = user_input.strip()
print(cleaned)
# ➜ "hello world"

🔫В этом примере strip() убирает лишние пробелы по краям строки, оставляя только значимый текст.

💡strip() удобно использовать при чтении из файлов, работе с формами, разборе CSV/JSON и валидации пользовательского ввода. Также существуют .lstrip() и .rstrip() — для удаления только слева или справа. Метод делает работу с текстом точной и предсказуемой

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥3👍2
✈️Что такое асинхронное программирование?
Асинхронное программирование - это способ написания кода, позволяющий выполнять несколько задач одновременно без блокировки основного потока выполнения. В Python для этого используются ключевые слова async и await, которые делают функции асинхронными и определяют точки, где происходит ожидание.

➡️Преимущества асинхронного программирования:
1. Увеличение производительности: Асинхронный код позволяет эффективно использовать ресурсы, ускоряя выполнение задач.
2. Масштабируемость: Обработка множества задач одновременно без блокировки позволяет создавать масштабируемые приложения.
3. Улучшен отклик приложения: Пользователи получают быстрый отклик, даже если выполняются длительные операции.

➡️Основные концепции асинхронного программирования в Python:
- `async def` и `await`: Обозначают асинхронные функции и точки ожидания выполнения задачи.
- Цикл событий (Event Loop): Основной механизм управления выполнением асинхронных задач.
- Корутины (Coroutines): Асинхронные функции, которые могут приостанавливать свое выполнение.

➡️Пример асинхронного кода:
import asyncio

async def async_example():
print("Начало выполнения")
await asyncio.sleep(2)
print("Завершение выполнения")

async def main():
tasks = [async_example() for _ in range(5)]
await asyncio.gather(*tasks)

if __name__ == "__main__":
asyncio.run(main())


➡️Интеграция асинхронного кода:
Множество библиотек и фреймворков в Python уже поддерживают асинхронное программирование, включая aiohttp, asyncio, и многие другие. Это позволяет создавать высокопроизводительные веб-приложения, работающие с асинхронными запросами.

Дополнительные ресурсы:
- Документация Python по асинхронному программированию
- Статья на Real Python: "Async IO in Python: A Complete Walkthrough"

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥2
✈️Инкапсуляция - это один из четырех основных принципов объектно-ориентированного программирования. Она позволяет скрыть внутреннюю реализацию объекта от других объектов и защитить его состояние от неправильного использования.

➡️ Методы и атрибуты
В Python, чтобы скрыть атрибуты объекта, их нужно объявить как приватные, используя два подчеркивания перед именем атрибута. Например, для создания приватного атрибута name нужно написать __name. Также для доступа к этому атрибуту извне класса нужно использовать специальные методы get и set.

➡️Метод get возвращает значение приватного атрибута, а метод set устанавливает новое значение. Эти методы должны быть определены в самом классе. Например:
class Person:
def __init__(self, name):
self.__name = name

def get_name(self):
return self.__name

def set_name(self, name):
self.__name = name

person = Person("John")
print(person.get_name()) # "John"
person.set_name("Mike")
print(person.get_name()) # "Mike"


💡Для чего нужна инкапсуляция вообще?
- Защита данных от внешнего доступа
- Предотвращение случайных изменений данных
- Упрощение взаимодействия с объектами
- Сокрытие сложной логики работы объекта от пользователя

💡Будет ли код работать без нее?
- Да, будет!

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥3🤣1
✈️CPython — это основная реализация Python на C, и именно она запускается, когда ты пишешь python file.py.

➡️Работает в 3 шага:
1. Парсинг — Python-код превращается в AST (дерево разбора)
2. Компиляция — AST превращается в байткод (.pyc), понятный интерпретатору
3. Исполнение — байткод читается виртуальной машиной, которая шаг за шагом исполняет инструкции

➡️Можно посмотреть байткод вот так:
import dis

def hello():
print("hi")

dis.dis(hello)

🔫Выведет набор инструкций, как CPU, только питоновый.
CPython — медленный, но гибкий. Именно тут живёт GIL, и именно он влияет на потоки.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥31
✈️Метод setdefault() используется для получения значения по ключу из словаря, одновременно создавая его, если ключа ещё нет.

➡️Пример:
data = {}
data.setdefault("users", []).append("Анна")
data.setdefault("users", []).append("Борис")

print(data)

{'users': ['Анна', 'Борис']}


💡Удобно при работе с коллекциями внутри словаря — не нужно проверять наличие ключа вручную. Альтернатива конструкции с if key not in dict.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥2
✈️В мире Python программирования, логирование играет важную роль в отслеживании работы приложений и выявлении ошибок. Одним из самых удобных и мощных инструментов для этой задачи является библиотека Loguru. В этом посте мы рассмотрим основные преимущества и возможности Loguru, которые делают его отличным выбором для логирования в Python.

➡️Простота использования
Одним из основных преимуществ Loguru является его простота использования. В отличие от стандартной библиотеки logging, которая может показаться сложной и громоздкой, Loguru предлагает простой и интуитивно понятный интерфейс. Для начала работы достаточно импортировать библиотеку и начать логирование с помощью одной строки кода:
from loguru import logger

logger.info("Привет, Loguru!")


Это позволяет значительно сократить время на настройку и сразу приступить к логированию.

➡️Гибкость и мощность
Loguru предоставляет широкие возможности для настройки логирования. Вы можете легко настроить формат сообщений, уровни логирования и маршрутизацию логов. Например, вы можете отправлять логи в разные файлы в зависимости от их уровня важности:
logger.add("debug.log", level="DEBUG")
logger.add("error.log", level="ERROR")

logger.debug("Это сообщение для отладки")
logger.error("Это сообщение об ошибке")


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

➡️Встроенные дополнительные функции
Помимо стандартных возможностей логирования, Loguru включает в себя множество дополнительных функций, которые делают его ещё более привлекательным. Например, библиотека поддерживает автоматическое добавление контекстной информации к логам, такую как имя функции, строка кода и т.д. Также существует возможность автоматического ротации логов, что позволяет избежать переполнения дискового пространства:
logger.add("file_{time}.log", rotation="500 MB")

logger.info("Это сообщение будет записано в новый файл при достижении лимита в 500 MB")


💡Эти и другие функции делают Loguru мощным инструментом для профессионального логирования.

🖥GitHub loguru

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
✈️Оба — in-memory key-value хранилища, но Redis — более функциональный и гибкий, тогда как Memcached — максимально простой и быстрый.

➡️Redis:
— поддерживает разные типы данных (строки, списки, множества, хэши, sorted sets)
— умеет работать с TTL, Pub/Sub, скриптами (Lua)
— поддерживает персистентность и репликацию

➡️Memcached:
— только строки и числа
— максимально простой и быстрый
— нет встроенной персистентности
— хорош для простого кэширования без сложной логики

💡Когда что выбрать:
Redis — если нужно больше, чем просто кэш (например, счётчики, очереди, блокировки)

Memcached — если важна скорость и simplicity при коротком сроке жизни данных

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍31
🎮Pyxel — это библиотека для создания ретро-игр на языке программирования Python. Она идеально подходит для разработчиков, которые хотят погрузиться в мир 8-битных игр, создавая собственные проекты с минимальными усилиями.

💡Почему Pyxel

➡️Простота использования

Одним из главных преимуществ Pyxel является её простота использования. Она предоставляет интуитивно понятный интерфейс и минимальный набор функций, необходимых для создания игр. Это позволяет сосредоточиться на творческом процессе, не отвлекаясь на сложные технические детали.

➡️Встроенные инструменты

Pyxel поставляется с набором встроенных инструментов, которые облегчают разработку игр. Среди них: редактор спрайтов, редактор звуков и редактор карт.

➡️Кроссплатформенность

Ещё одно важное преимущество Pyxel — это её кроссплатформенность. Библиотека поддерживает Windows, macOS и Linux, что позволяет разрабатывать игры на любой из этих платформ.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥41
✈️Библиотека DataSketch реализует алгоритмы вероятностного хеширования и сжатия данных для быстрого сравнения больших наборов. Она идеально для обработки Big Data и поиска дубликатов.

➡️Пример использования:
from datasketch import MinHash, MinHashLSH

# Создаем "отпечатки" текстов
m1 = MinHash(num_perm=128)
m2 = MinHash(num_perm=128)
for word in ["data", "science"]: m1.update(word.encode())
for word in ["data", "analysis"]: m2.update(word.encode())

# Сравниваем (0.75 = порог схожести)
print("Схожесть:", m1.jaccard(m2)) # Результат: 0.5


💡Библиотека позволяет находить дубликаты среди миллионов документов даже на обычном ноутбуке.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥2
✈️Когда у вас есть файл с защищенным паролем, а пароль неизвестен, брутфорс может помочь попытаться разгадать его.

➡️Этот метод требует большого количества времени и ресурсов, особенно если пароль длинный и сложный, но в некоторых случаях он может оказаться эффективным.

import string
import itertools

def brute_force_pass(target, length):
chars = string.ascii_letters + string.digits # Символы: буквы и цифры
for attempt in itertools.product(chars, repeat=length): # Генерация комбинаций
pwd_attempt = ''.join(attempt) # Преобразование кортежа в строку
print(f"Trying: {pwd_attempt}") # Вывод текущей попытки
if pwd_attempt == target: # Проверка, совпадает ли пароль
print(f"Password found: {pwd_attempt}") # Если совпал - выводим его
return pwd_attempt
print("Password not found") # Если пароль не найден
return None


💡Метод брутфорса может быть мощным инструментом, однако его использование должно быть этичным и законным. И никогда не пытайтесь взломать файлы или системы без разрешения владельцев)))

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥31
✈️Python предоставляет нам множество возможностей для работы с данными. Одной из таких возможностей является использование списков для хранения объектов. Сейчас мы рассмотрим, как создать класс, создать объекты на основе этого класса, поместить эти объекты в список и обратиться к ним.

➡️Создание класса
Для начала, давайте создадим класс, который будет представлять людей. Класс будет иметь атрибуты "имя" и "возраст". Вот пример такого класса:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age


➡️Создание объектов
Теперь, когда у нас есть класс, мы можем создать объекты на его основе. Например, давайте создадим двух людей:
person1 = Person("John", 25)
person2 = Person("Alice", 30)


➡️Помещение объектов в список
Чтобы поместить объекты в список, мы можем использовать метод append(). Например, чтобы создать список людей и добавить туда наших двух людей, мы можем написать следующий код:
people = []
people.append(person1)
people.append(person2)

⬆️Теперь у нас есть список people, в котором хранятся объекты, представляющие двух людей.

➡️Обращение к объектам в списке
Чтобы обратиться к объектам в списке, мы можем использовать индексы. Например, чтобы получить имя первого человека в списке people, мы можем написать следующий код:
first_person_name = people[0].name

⬆️Теперь в переменной first_person_name будет храниться значение "John".

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🔥2👀2🤬1
✈️browser-history — это библиотека на Python, которая позволяет легко получать историю посещений и закладки из популярных браузеров.

➡️Это очень полезно, если вам нужно анализировать свою интернет-активность или работать с данными о посещенных сайтах.

➡️Пример:
from browser_history import get_history

# Получаем историю
outputs = get_history()

# Это список кортежей (дата и время, URL)
his = outputs.histories

# Выводим историю на экран
for entry in his:
print(entry)


💻GitHub

💡Модуль также поддерживает получение закладок, хотя эта функция считается экспериментальной.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥1
✈️gRPC — это фреймворк удалённых вызовов (Remote Procedure Call) от Google, который использует бинарный протокол Protocol Buffers (protobuf) вместо текста (JSON).

➡️Основные преимущества перед REST:
- Скорость и компактность — бинарные данные меньше и передаются быстрее, чем JSON.
- Жёсткий контракт (IDL) — схема данных описана в .proto файле, из которого генерируются клиенты и серверы на разных языках.
- Стриминг — поддержка двунаправленных потоков (клиент - сервер), что в REST приходится эмулировать через WebSocket/SSE.
- Мульти-язычность — можно легко писать сервисы на разных языках, и они будут совместимы.

➡️Пример .proto файла:
syntax = "proto3";

service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
string name = 1;
}

message HelloReply {
string message = 1;
}


💡Заключение:
gRPC отлично подходит для high-performance микросервисов и real-time систем, где важны скорость и строгая типизация. REST же проще для публичных API и быстрой интеграции.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1😡1
✈️Функция enumerate() позволяет перебирать элементы с индексами, а параметр start задаёт, с какого числа начинать счёт.

➡️Пример:
tasks = ["Купить хлеб", "Выучить Python", "Сделать проект"]

for i, task in enumerate(tasks, start=1):
print(f"{i}. {task}")

1. Купить хлеб
2. Выучить Python
3. Сделать проект


💡Удобно для списков задач, меню и любых случаев, где индексация должна начинаться не с нуля.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥31
✈️Модуль difflib в Python - это мощный инструмент, который помогает разработчикам сравнивать последовательности. Он особенно полезен для сравнения текстовых данных и нахождения различий между ними.

➡️Функция get_close_matches

Функция get_close_matches() используется для поиска наиболее похожих вариантов в последовательности. Это полезно, например, при реализации системы автодополнения, где нужно предложить пользователю наиболее вероятные варианты на основе его ввода.

➡️Например:
import difflib

words = ['кот', 'собака', 'кит', 'слон']
difflib.get_close_matches('кот', words)


⬆️В этом примере функция возвращает: ['кот', 'кит'].

➡️Функция ndiff

Функция ndiff() используется для сравнения двух последовательностей и выявления различий между ними. Она возвращает генератор, который производит строки, иллюстрирующие различия между последовательностями. Это полезно, например, при сравнении версий текстовых документов.

➡️Например:
import difflib

str1 = "кот"
str2 = "кит"
diff = difflib.ndiff(str1, str2)
print('\\n'.join(diff))


⬆️В этом примере функция выводит:
  к
- о
+ и
т


➡️Функция SequenceMatcher

Функция SequenceMatcher() является более общей и мощной функцией, чем ndiff(). Она позволяет сравнивать любые две последовательности и определять степень их сходства.

➡️Например:
import difflib

str1 = "кот"
str2 = "кит"
match = difflib.SequenceMatcher(None, str1, str2)
print(match.ratio())


⬆️В этом примере функция возвращает: 0.6666666666666666, что означает, что строки совпадают на 66.67%.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🔥1
✈️Функция sample() позволяет выбрать случайным образом элементы из последовательности или коллекции. Это удобно при необходимости получить случайную выборку из данных.

➡️Функция принимает два основных аргумента:
💬population — последовательность, из которой надо выбрать элементы (list, tuple, string и т. д.)
💬k — количество элементов для выборки.

➡️Дополнительные аргументы:
💬counts — список весов элементов (по умолчанию равновероятный выбор).
💬rng — генератор случайных чисел (по умолчанию берется из модуля random).

➡️Пример:
from random import sample

letters = ['a', 'b', 'c', 'd', 'e']

result = sample(letters, k=3)

print(result)


⬆️В примере из списка букв берется случайная выборка размером 3 элемента. Результат при каждом запуске будет разный.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🔥1
👍5👏2😁2
Что выдаст код выше
Anonymous Quiz
12%
5
19%
55555
1%
5 5
32%
5 Error
36%
Error
🤔7🤨3🙈2
🤔Разбор

Функция напечатает 5 один раз, а затем выдаст ошибку, потому что дальше программа пытается вызвать "ничего" (None) как функцию


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🔥2👀1
✈️В больших проектах важно точно понимать, что пошло не так. Вместо того чтобы ловить все подряд через Exception, создавайте собственные исключения:
class MyError(Exception):
pass


➡️Теперь можно выбросить исключение, связанное с вашей логикой:
raise MyError("Что-то пошло не так")


➡️Зачем это нужно?
— Код становится читаемее
— Ошибки легче отлавливать
— Проще отлаживать и тестировать
— Можно группировать ошибки по типу

➡️Вы даже можете создать иерархию ошибок:
class ValidationError(MyError):
pass

class DatabaseError(MyError):
pass


💡Такой подход особенно полезен в API, играх, сложных скриптах и т.д. — везде, где важно знать какая именно ошибка произошла.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1
✈️Функция zip_longest() из модуля itertools объединяет несколько последовательностей, заполняя недостающие значения указанным значением.

➡️Пример:
from itertools import zip_longest

names = ["Анна", "Борис"]
scores = [90]

for name, score in zip_longest(names, scores, fillvalue="—"):
print(name, score)

Анна 90
Борис —


💡Полезно при работе с данными разной длины, чтобы не потерять элементы.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥51