>>> Ваша правда
В отлиичие от пустых объектов стандартных классов, объект вашего класса по умолчанию оценивается как 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)]
Комментариев нет:
Отправить комментарий