Python на примерах
1.39K subscribers
411 photos
6 videos
145 links
Короткие уроки Python на примерах
Download Telegram
Декораторы

Это функции, которые меняют поведение других функций, не меняя код внутри них.

Сами по себе декораторы составляют вызываемый объект (функция, класс с __call__), который возвращает другой вызываемый объект.

@wraps используется для изменения некоторых значения (__name__, __doc__) на значения функции, с которой мы работаем, а не декоратора.
Функция exit создана для удобства работы в интерактивном режиме, однако не рекомендуется использовать её внутри скриптов. По факту она также просто поднимают исключение, и при попытке вызова без скобок напишут подсказку о правильном способе выхода из интерпретатора:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
nameless@pycoders:~$

Использовать sys.exit стоит потому, что эта функция лежит в стандартном модуле и будет всегда там доступна. Также это довольно явный способ выразить своё желание завершить программу.

import sys

try:
# code
except:
sys.exit()
👍2
Разница между is и ==

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

is занимается сравниванием этих самых адресов. В то время как == вызывает функцию __eq__ и предназначения для сравнения значений класса.

Представьте куб, а потом ещё один такой же. Они одинаковые, но это два абсолютно разных объекта. Также и в программировании.
❤1👍1🤨1
💡Лайфхаки и памятки для питонистов

👉Вывести в консоль 2 или более списков одновременно.
>>>list1 = [1, 3, 5, 7]
>>>list2 = [2, 4, 6, 8]
>>>for a, b in zip(list1, list2):
...print (a, b)
Output:
>>>1 2
>>>3 4
>>>5 6
>>>7 8

👉Превратить строку в список.
>>>formatted_list = list(map(int, input().split()))
>>>print (formatted_list)
Output:
>>>[1, 2, 3]

👉Превратить список списков в один список.
>>>import itertools
>>>list1 = [[1,2], [3,4], [5,6]]
>>>lst = list(itertools.chain.from_iterable(list1))
Output:
>>>[1, 2, 3, 4, 5, 6]

👉Раздробить список в группы.
>>>list1 = ['Sun', 'Flowers', 'Peoples', 'Animals', 'Day', 'Night']
>>>partition = list(zip(*[iter(list1)] * 2))
>>>print(partition)
Output:
>>>[('Sun', 'Flowers'), ('Peoples', 'Animals'), ('Day', 'Night')]
🔥Must-Have Библиотеки для python разработчика.

👉PyGame - pygame - это бесплатная кросс-платформенная библиотека с открытым исходным кодом для разработки мультимедийных приложений, таких как видеоигры, с использованием Python.

👉Random - Этот модуль реализует генераторы псевдослучайных чисел для различных распределений.

👉Numpy - Фундаментальный пакет для научных вычислений с Python

👉OS - этот модуль обеспечивает переносимый способ использования функций, зависящих от операционной системы.

👉Collections - Этот модуль реализует специализированные типы данных контейнеров, предоставляя альтернативы встроенным контейнерам общего назначения Python.

👉SubProcess - Модуль подпроцесса позволяет создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких старых модулей и функций:

👉Functools - Модуль functools предназначен для функций высшего порядка: функций, которые действуют или возвращают другие функции. В общем, любой вызываемый объект может рассматриваться как функция для целей этого модуля.

👉Itertools - Этот модуль реализует ряд строительных блоков итератора, вдохновленных конструкциями из APL, Haskell и SML. Каждый был переработан в форме, подходящей для Python.
Так что же такое NaN

Not a number
(не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.

Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает NaN.

Его особенностью среди других чисел является то, что оно не равно самому себе.
Что делает @staticmethod?

Иногда метод внутри класса не использует ни self, ни cls.

Тогда — @staticmethod.

class Math:
@staticmethod
def add(x, y):
return x + y


Никаких ссылок на экземпляры — просто удобный способ логически сгруппировать функции внутри класса.
👍1
Про functools

Это модуль с полезными функциями... для работы с функциями. Например:

@cache — простой легкий неограниченный кеш функций. Если функция долго вычисляется, то вы можете сохранить сохранить результат в памяти, чтобы потом его не считать, а брать оттуда.

partial(func, *args, **keywords) — возвращает вызываемый объект, который вызывает полученную функция с переданными при создании аргументами и во время вызова.

Но и это ещё не всё, в модуле много фишек, которые можно узнать из документации.
Цепочка операторов

Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.

Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так: x < y > z. Если увидите это на проде, пишите git blame и ищите, кому бить морду.
Что такое `self` в методах класса?

self — это ссылка на текущий экземпляр класса. Через неё мы получаем доступ к атрибутам и методам объекта.

class Dog:
def __init__(self, name):
self.name = name

def bark(self):
print(f"{self.name} лает")

rex = Dog("Рекс")
rex.bark() # Рекс лает


Без self Python не поймёт, к какому объекту относятся переменные внутри класса.
👍2
Хочешь использовать ChatGPT, BERT, Stable Diffusion, T5 и другие мощные модели прямо в Python-коде?
Бери transformers от Hugging Face.

Умеет:

* Загружать готовые модели
* Работать с текстом, изображениями, аудио
* Генерировать, классифицировать, переводить, резюмировать

Пример генерации текста:

from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")
result = generator("В далёком будущем", max_length=30, num_return_sequences=1)
print(result[0]["generated_text"])


Установка:

pip install transformers


⚡️ Бонус: можно использовать как с PyTorch, так и с TensorFlow. Под капотом самые топовые модели AI.
❤1👍1
Работа с таблицами csv

В Python есть встроенная библиотека для работы с таблицами. Например, при парсинге сайта удобно оформлять результаты в таблицу, которую можно наглядно посмотреть в Excele или другом приложении. В примере представлено чтение из csv файла.
Что не так с этим кодом и зачем это нужно

Этот код вызывает ошибку утверждения assert с сообщением «error», если debug равен True. debug — это встроенная переменная Python, которая является истинной, если к интерактивной консоли или скрипту был присоединен флаг оптимизации -O. Для типичных скриптов в режиме отладки эта переменная равна True. Если оптимизация включена, то интерпретатор Python игнорирует все операторы утверждения assert, поэтому этот код не вызовет ошибку в optimized mode.

Такой код может быть использован для проверки инвариантов в программе или для отладки кода. Если утверждение не выполняется и вызывается AssertionError, это означает, что в программе произошло что-то непредвиденное, что нарушило заданное утверждение, и программа остановится с сообщением об ошибке.
❤1
Срезы итераторов

Если вы попытаетесь получить срез (slice) итератора, то столкнётесь с ошибкой TypeError, сообщающей о том, что на объект-генератор нельзя оформить подписку. Однако эта проблема поддаётся решению
❤1
Оператор walrus (:=)

В этом примере мы используем оператор walrus (:=) для одновременного присваивания значения переменной line и проверки условия внутри цикла while. Это позволяет нам сократить код, объединив операции присваивания и проверки в одну строку.
👎1🙉1
🔋 PikaPython — ультралегкий интерпретатор Python для микроконтроллеров. Проект позволяет запускать Python-код на устройствах с 4 КБ RAM и 64 КБ Flash. Не требует операционной системы и работает через REPL по UART.

Инструмент имеет встроенный прекомпилятор для автоматической генерации биндингов C-функций из .pyi файлов. Есть готовые BSP для популярных MCU и демо-проекты.

🤖 GitHub
Проверка необходимой версии Python

В коде возможно проверить наличие актуальной версии Python. Например для предупреждения пользователей о несовместимой версии.
👍1
Логические any и all

Одна из многих причин, почему Python является таким популярным языком, заключается в том, что он читаем и выразителен. Предлагаю взглянуть на следующий код:

statements = [True, True, False]

if any(statements):
print('Как минимум одно выражение истинно')
if all(statements):
print('Все выражения истинны')
if any(statements) and not all(statements):
print('Как минимум одно выражение истинно и одно не истинно')


Функция any возвращает значение True, если хотя бы одно из переданных утверждений верно, all – когда все верны.

На мой взгляд, эти две функции заслуживают отдельного внимания всего лишь из-за их простоты в использовании.
Оператор pass делает абсолютно ничего, то есть совсем ничего.

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

Например, вам надо сделать несколько функций, вы написали def'ы и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass.

def func():
pass


Ну или в конструкции try-except, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.

try:
any_function()
except:
pass

В общем, полезная штука, используйте.
Использование списков в качестве стеков

Стек — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

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

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack
[3, 4, 5]
>>> stack.pop()
5
👍2
Как писать хороший код на python?🤔📄

✅Умение правильно и хорошо писать код — это важный навык для python-разработчика. Как научится писать хороший код — вы узнаете из сегодняшней статьи. Говоря о „хорошем коде“ имеется в виду большое количество факторов с которыми вам предстоит познакомиться, чтобы писать правильный и "конвейерный" код.

Возможно, самый известный сборник этих факторов Python был написан Тимом Питерсом, давний участник языка и его группы новостей
comp.lang.python.
Этот сборник также известен под названием «The Zen of Python» и в нём изложены следующие факторы „хорошего кода“.

👉🏻 The Zen of Python, by Tim Peters 👈🏻
· Beautiful is better than ugly — Красивое — лучше, чем уродливое
·
Explicit is better than implicit — Явное лучше, чем неявное.
·
Simple is better than complex — Простое лучше, чем сложное.
·
Complex is better than complicated - Сложное лучше, чем запутанное.
· Flat is better than nested - Плоский лучше, чем вложенный.
· Sparse is better than dense - Редкое лучше, чем частое.
· Readability counts - Читаемость имеет значение.
· Special cases aren't special enough to break the rules - Особых случаев недостаточно, чтобы нарушать правила.
· Although practicality beats purity - Хотя практичность лучше чистоты.
· Errors should never pass silently - Ошибки никогда не должны замалчиваться.
· Unless explicitly silenced — Если только они не замалчиваются явно.
· In the face of ambiguity, refuse the temptation to guess – Перед лицом двусмысленности откажитесь от соблазна угадать.
· There should be one -- and preferably only one -- obvious way to do it. – Должен быть один - и желательно только один - очевидный способ сделать это.
· Although that way may not be obvious at first unless you're Dutch – Хотя поначалу этот способ может быть не очевиден, если вы не голландец.
· Now is better than never – Лучше сейчас, чем никогда.
· Although never is often better than *right* now – Хотя никогда не бывает лучше, чем прямо сейчас.
· If the implementation is hard to explain, it's a bad idea – Если реализацию сложно объяснить, это плохая идея.
· If the implementation is easy to explain, it may be a good idea – Если реализацию легко объяснить, это может быть хорошей идеей.
· Namespaces are one honking great idea -- let's do more of those! – Пространства имен - одна отличная идея - давайте сделаем их больше!
Эти факторы можно быстро заполучить просто написав в интерпретаторе
import this
После чего вы получите данный список.
***
Без пониманий этих факторов ваш код будет непригодным для больших, и без того сложных проектов.
***
❤1