понедельник, 2 сентября 2019 г.

ЛМНты Python, 16 - 20

>>> Больше, чем гугол

Целое число в Python ограничено только памятью компьютера:

>>> from math import factorial
>>> factorial(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

А число класса float следует стандарту для хранения чисел с плавающей точкой двойной точности. Если преобразовать 100! в число float, а затем обратно в int, это будет уже другое число из-за потери значащих цифр при преобразовании в float:

>>> float(factorial(100))
9.332621544394415e+157
>>> int(float(factorial(100)))
93326215443944150965646704795953882578400970373184098831012889540582227238570431295066113089288327277825849664006524270554535976289719382852181865895959724032

Как видим, неизменными сохранились только старшие 16 десятичных знаков. Кстати, число 100! намного больше знаменитого числа гугол:

>>> factorial(100) > 10**100
True

>>> """Публично доступен"""

Согласно PEP257 – Docstring Conventions, док-строки нужно заключать в тройные кавычки (а не в тройные апострофы). Пример модуля с правильно оформленными док-строками:

"""Demonstrate module docstring."""

class MyClass(object):
    """Demonstrate class docstring."""

    def method(self):
        """Demonstrate function/method docstring."""
        pass

Согласно PEP257, док-строки пишутся для всех публичных интерфейсов (модулей, классов, методов, функций). Отсутствие док-строки говорит о том, что данный модуль/класс/метод/функция не публичный. В этом случае его имя должно начинаться с одного символа подчеркивания '_', что является признаком непубличного интерфейса.

>>> Небулева логика

Выражения c операторами and и or выглядят как логические, но их результат в общем случае не булево значение:

>>> 42 and (1,) and {}
{}
>>> [] or '' or 42
42

Если один из операндов имеет тип bool, то результат может получиться булевым:

>>> 1 and False
False
>>> False and 1
False
>>> 2>1 or 42
True
>>> 42 or 2>1
42

Из-за того, что and и or работают по короткой схеме, перемена мест операндов привела к разным результатам! Логика не страдает, так как эти результаты эквивалентны в смысле оценки на True/False. Если же оба операнда булевы, то перемена мест "слагаемых" не скажется на результате:

>>> bool() and (2*2 == 4)
False
>>> (2*2 == 4) and bool()
False
>>> bool() or (2*2 == 4)
True
>>> (2*2 == 4) or bool()
True

>>> [not] in

Для проверки вхождения подстроки в строку или строку байтов используйте оператор in:

>>> 'wor' in 'hello world'
True
>>> 'war' in 'hello world'
False
>>> b'hell' in b'hello world'
True

С его помощью проверяйте наличие одного элемента в любой последовательности (sequence), словаре или множестве:

>>> 3 in [1, 2, 3]
True
>>> 3 in (1, 2, 3)
True
>>> 3 in {1: 'один', 2: 'два', 3: 'три'}
True
>>> 3 in {1, 2, 3}
True

Объекты класса range тоже поддерживают этот оператор:

>>> type(range(5))
<class 'range'>
>>> 3 in range(5)
True
>>> 5 in range(5)
False

>>> Почти как последовательность

Тип range можно рассматривать как неизменяемую последовательность с некоторыми ограничениями. Так, нельзя сложить (конкатенировать) два объекта range или умножить объект range на целое число, зато объект range можно индексировать, срезать, проверять вхождение в него значений.

>>> range(10)[5]
5
>>> range(10)[5:]
range(5, 10)
>>> range(10)[::-1]
range(9, -1, -1)
>>> 7 in range(10)
True
>>> 10 in range(10)
False
>>> max(range(10))
9
>>> min(range(10))
0
>>> len(range(10))
10
>>> range(10).count(5)
1
>>> range(10).index(5)
5

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

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