← Home

Python шпаргалка

By Брендель В. М.

Python шпаргалка Анонимная функция, она же lamda-функция, объявляется на месте где будет использована. Это ускоряет парсинг .py сырца и более соответствует функциональному подходу.

Декоратор в Python — замыкание с синтаксическим сахаром.

Замыкание — это функция с окружением. Позволяет изменить поведение какой-либо функции без изменения самой функции.

def print_text(string):

  print(string) 

print_text('hello')

hello

def make_string_upper(func):

def inner(string): 

      func(string.upper()) 

 return inner 

print_upper_string = make_string_upper(print_text)

print_upper_string('hello')

HELLO

Изменили поведение функции. print_text печатает текст в верхнем индексе, при этом саму функцию print_text не меняли.

Метакласс — класс, экземпляры которых являются классами. Позволяет в процессе исполнения модифицировать классы и создавать объекты этих модифицированных классов. Используются преимущественно прошареными программистами для написания лаконичного API библиотек со сложным функционалом (flask_marshmallow, например).

Примеси (mixin) — вид множественного наследования.

class Mixin1():

 def test(self):

      print('Mixin1')

class Mixin2():

 def test(self):

     print('Mixin2') 

class MyClass(Mixin1, Mixin2):

  pass

class MyClass(Mixin1, Mixin2,): pass

obj = MyClass()

obj.test()

Mixin1

class MyClass(Mixin2, Mixin1):

   pass

obj = MyClass()

obj.test()

Mixin2

При одинаковых методах в примесях, Python использует методы объявленные справо налево. Просто такое правило множественного наследования.

Как правило примеси — это огрызки классов реализующих ту или иную функциональность. Подключаются по необходимости. Это позволяет хорошо декомпозировать код, сделать его более лаконичны, легко читаемым.

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

Рекурсия.

В интерпретаторе Python действительно по умолчанию установлено ограничение глубины рекурсии, равным 1000, но это численный параметр, который всегда можно переустановить.

Используется в функциональном стиле программирования.

def factorial (n):

 if n == 0:

          return 1

 else:

     return n * factorial(n - 1)

Callback'и:

Простая функция или функция обратного вызова (колбек) - пример для Python RU.CODE-MAVEN.COM

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

На вход функции подается функция, реализующая каллбэк. По результам коллбэка выход из осной функции. Разумеется callback'и более актуальны для асинхронного подхода. Поэтому полноценно используются в asyncio.

Про функциональщину:

map, filter, reduce в Python есть. И даже работают. Но писать в функциональном стиле вырвиглазно — длинные строки операций по которым текут данные совсем не pythonic way. Во-вторых, никакого прироста в производительности нет, что простой цикл, что итератор, что функциональная текуха одинаковы по скорости.

При том, что GIL не позволяет полноценно параллелить исполнение программы. threated map/reduce хоть и есть, но имеет смысл только для I/O bound программ. На python без граблей только однопоточные цифро дробилки работают норм.

Насчет цифродробилок. Так как в Python все - объекты, в любом нагруженном математикой коде нужно использовать numpy. При этом нужно следить, что да как.

Есть вероятность следующего:

a=2

b=3

c=a+b

e=numpy.array(range(0,10))

d=numpy.array(range(0,10))

g=e+d

Скорее всего g посчитается быстрей чем с.

Причина: numpy перегружает оператор сложения, и складывает два вектора своими методами, написанными на C. c же посчитает интерпретатор Python со всех хурмой, связанной с проверкой типов, диспатчингом объекта и т.п.

Как вариант в tensorflow 2.0 появился императивный метод написания обработки данных. TF написан на C++, по скорости сравнимо с numpy.

tf.add(2, 3)

5

Это тоже гораздо быстрее, чем нативное Python сложение.

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

TF 1.x имеет чисто функциональный стиль, когда полностью описывается граф скольжения данных, а сам процесс дробильни инициализируется tf.session.run(). В общем-то тоже хороший подход, все-таки декларативный подход в такого типа зада прекрасен, как никогда.

Православный способ использования сеттеров/геттеров в Python

class Fees(object):

def init(self):

  self._fee = None

 @property

 def fee(self):

        return self._fee

 @fee.setter

 def set_fee(self, value):

      if isinstance(value, str):

            self._fee = Decimal(value)

      elif isinstance(value, Decimal):

           self._fee = value

Про ООП в Pythone

Заметки об объектной системе языка Python ч.2

Вторая часть заметок об объектной системе python'a (первая часть тут). В этой статье рассказывается, что такое классы, метаклассы, type, object и как происходит

HABR.COM

@classmethod. Понятно что делает, непонятно когда применять.

Вот хороший пример.

Python-сообщество / Python для новичков / classmethod PYTHON.SU

Насколько я понял @classmethod за счет ссылки на класс, а не на объект позволяет использовать методы более глобально. Использование метода с декоратором @classmethod применяется для всех объектов иниализированных от класса.

Также если метод декорирован декоратором classmethod, то метод можно вызывать даже до создания экземпляра класса. Это кстати важно. Иногда не нужно печь полноценный объект, а функцию к данным из класса применить нужно.

Простая функция или функция обратного вызова (колбек) - пример для Python RU.CODE-MAVEN.COM