суббота, 1 августа 2020 г.

ЛМНты Python, 71 - 75

>>> Ваша правда

В отлиичие от пустых объектов стандартных классов, объект вашего класса по умолчанию оценивается как True:

>>> class B(object):
...     pass
...
>>> b = B()
>>> if b:
...     print('True')
...
True
>>> bool(b)
True

Для того, чтобы ваш объект был оценен как False, его метод __len__ должен возвращать 0 или метод __bool__ – возвращать False.

>>> class B(object):
...     def __len__(self):
...         return 0
...
>>> b = B()
>>> len(b)
0
>>> bool(b)
False
>>>
>>> class B(object):
...     def __bool__(self):
...         return False
...
>>> b = B()
>>> bool(b)
False

Как видим, от реализуемых классом методов зависит возможность использования с объектами этого класса некоторых стандартных функций Python, например, len().

>>> Декоратор умеет классы

Функции-декораторы работают с классами так же, как и с функциями. Пример функции, добавляющей классу новый метод:

>>> def deco(klas):
...     def whoami(self):
...         print(self)
...     klas.whoami = whoami
...     return klas
...
>>> class A(object):
...     pass
...
>>> A = deco(A)
>>> a = A()
>>> a.whoami()
<__main__.A object at 0x000002523C9C15F8>

Тот же эффект достигается при помощи декорирования класса:

>>> @deco
... class B(object):
...     pass
...
>>> B().whoami()
<__main__.B object at 0x000002523C9C1668>

>>> Оперативные заготовки

Модуль operator предоставляет функции, реализующие операторы:

>>> import operator as op
>>> op.add(13, 4)
17
>>> 13 + 4
17
>>> op.add('hello', ' wold')
'hello wold'
>>> 'hello' + ' world'
'hello world'

Этот модуль полезен, когда нужно передать функцию, реализующую оператор, в качестве параметра. Вместо того, чтобы создавать собственную функцию, с помощью def или lambda, воспользуйтесь готовой:

>>> from functools import reduce
>>> reduce(op.add, [1,2,3,4,5])
15
>>> reduce(op.mul, [1,2,3,4,5])
120

>>> sorted

Функция sorted получает на вход итерируемый объект (iterable) и возвращает новый упорядоченный список, не изменяя исходный объект:

>>> a = [2,5,1,3,7,4,9,8,6]
>>> sorted(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[2, 5, 1, 3, 7, 4, 9, 8, 6]

Сортировкy можно кастомизировать с помощью именованных параметров key и reverse. Параметру key передается функция, возвращающая значение, по которому выполняется упорядочивание. А reverse задает направление сортировки: по возрастанию (по умолчанию) или убыванию. Например:

>>> sorted(a, key=lambda e: -e)
[9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> sorted(a, key=lambda e: e if e%2 else -e)
[8, 6, 4, 2, 1, 3, 5, 7, 9]
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> sorted может

Элементами iterable-объекта могут быть вложенные списки (или другие последовательности). При сортировке такого объекта параметр key функции sorted позволяет задать элемент вложенной последовательности, по которому выполняется упорядочивание:

>>> a = [
...     ('C', 2, 1.0),
...     ('A', 3, 3.0),
...     ('B', 1, 2.0)
... ]
>>>
>>> sorted(a)
[('A', 3, 3.0), ('B', 1, 2.0), ('C', 2, 1.0)]
>>>
>>> sorted(a, key=lambda e: e[1])
[('B', 1, 2.0), ('C', 2, 1.0), ('A', 3, 3.0)]
>>>
>>> sorted(a, key=lambda e: e[2])
[('C', 2, 1.0), ('B', 1, 2.0), ('A', 3, 3.0)]

Для получения функции, возвращающей элемент последовательности с нужным индексом, можно воспользоваться функцией itemgetter из модуля operator:

>>> from operator import itemgetter
>>> sorted(a, key=itemgetter(1))
[('B', 1, 2.0), ('C', 2, 1.0), ('A', 3, 3.0)]

Комментариев нет:

Отправить комментарий