четверг, 1 августа 2019 г.

ЛМНты Python, 11 - 15

>>> or else

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

name = user_name()
name = name if name else 'User'

Но можно написать более компактный код, используя оператор or:

name = user_name() or 'User'

Оператор or работает по короткой схеме (short-sircuit) и возвращает первое же значение, которое оценивается как True. Хотя выражение выглядит как логическое, его результатом является не булево значение!

>>> and also

Оператор and, как и оператор or, работает по короткой схеме (short-sircuit) и позволяет организовать условное присваивание первого из операндов, который будет оценен как False:

>>> x = 1 and 'Привет' and 0
>>> x
0

Также можно организовать условный вызов функции после оператора and. Вызов будет сделан только в том случае, когда значение перед операторорм and будет оценено как True:

>>> input('имя? ') and input('рост? ')
имя?
''
>>> input('имя? ') and input('рост? ')
имя? Андрей
рост? 185
'185'

>>> insinstance

Принадлежность объекта к некоторому классу или одному из нескольких классов в Python проверяется с помощью функции isinstance(). Например,

>>> isinstance(1, int)
True
>>> isinstance(1.0, int)
False
>>> isinstance(1.0, (int, float))
True
>>> isinstance([], (tuple, dict, list))
True

В соответствии с картиной мира ООП объект является одновременно экземпляром своего класса и каждого из классов-предков:

>>> class A(list):
...     pass
...
>>> class B(A):
...     pass
...
>>> b = B()
>>> isinstance(b, B)
True
>>> isinstance(b, A)
True
>>> isinstance(b, list)
True

Чтобы воспользоваться методами, полученными объектом от некоторого класса, достаточно установить принадлежность объекта к этому классу. И не имеет практического значения, "свой" ли это класс объекта или один из классов-предков.

>>> issubclass

Функция issubclass() проверяет, является ли класс подклассом другого класса:

>>> issubclass(int, object)
True
>>> issubclass(frozenset, set)
False
>>> issubclass(frozenset, object)
True

Класс object является общим предком всех классов в Python, поэтому все объекты – экземпляры класса object, а все классы – его подклассы:

>>> isinstance(1.0, object)
True
>>> isinstance('Hello', object)
True
>>> issubclass(bool, object)
True
>>> issubclass(list, object)
True

>>> bool это int

Булевы значения в Python представляются экземплярами класса bool, который является подклассом int:

>>> issubclass(bool, int)
True
>>> isinstance(False, int)
True
>>> isinstance(1 != 1, int)
True

Поэтому булевы значения True и False в числовых контекстах ведут себя как числа 1 и 0, соответственно:

>>> True + True
2
>>> (True + True)**(2*True)
4
>>> 'True is %d' % True
'True is 1'
>>> 'False is %d' % False
'False is 0'
>>>

В строковом контексте они превращаются в строки 'True' и 'False':

>>> 'True is %s' % True
'True is True'
>>> 'False is %s' % False
'False is False'

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

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