воскресенье, 1 декабря 2019 г.

ЛМНты Python, 31 - 35

>>> map и filter

Встроенные функции map и filter принимают на вход функцию и последовательность, а возвращают итерируемый объект, порождающий новую последовательность путем вызова полученной функции для каждого элемента входной последовательности.

Функция, передаваемая в map, отображает входное значение на другое. Например:

>>> def cube(n):
...     return n**3
...
>>> m = map(cube, [1, 2, 3, 4])
>>> type(m)
<class 'map'>
>>> list(m)
[1, 8, 27, 64]

суббота, 2 ноября 2019 г.

ЛМНты Python, 26 - 30

>>> Zen of Python

Модуль this хранит принципы программирования на Python, извеcтные как Zen of Python:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

вторник, 1 октября 2019 г.

ЛМНты Python, 21 - 25

>>> Последовательность из итератора

Последовательность можно задать явно, перечислив ее элементы, или аналитически, передав конструктору итератор, порождающий элементы последовательности. Наверное, самый популярный итератор – тот, что предоставляется объектом класса range, получаемым с помощью функции range().

>>> it = iter(range(5))
>>> type(it)
<class 'range_iterator'>
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

понедельник, 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

четверг, 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. Хотя выражение выглядит как логическое, его результатом является не булево значение!

понедельник, 1 июля 2019 г.

ЛМНты Python, 6 - 10

>>> is [not]

Недавно мы сравнивали id объектов, чтобы показать, что булевы значения True, полученные разными способами, представлены одним и тем же объектом:

>>> id(1 == 1) == id(True)
True
>>> id(bool(1)) == id(not False)
True

Чтобы проверить, что за двумя значениями или именами стоит один и тот же объект, в Python имеется оператор is (который, на самом деле, сравнивает id двух объектов).

суббота, 1 июня 2019 г.

ЛМНты Python, 1 - 5

>>> Выражения – это предложения

Выражения – полноценные предложения языка Python:

python
>>> 3.14
3.14
>>> [1,2] + [3]
[1, 2, 3]
>>> 'Привет, Python'
'Привет, Python'
>>> """Можно написать скрипт из одних выражений,
... и он выполнится без ошибок.
... """
'Можно написать скрипт из одних выражений,\nи он выполнится без ошибок.\n'
>>>

Документирующие строки Python (docstrings) – это выражения, состоящие из строкового литерала, а не особая конструкция, требующая специальной обработки.

пятница, 22 марта 2019 г.

Вероятность выиграть в Спортлото, или Введение в комбинаторику

Моя мама играла в Спортлото, когда я был школьником. Тогда было два вида билетов: 5 из 36 и 6 из 49. Надеюсь, вы видели фильм "Спортлото-82" и вам не нужно объяснять, как работает эта лотерея :)

Давайте посмотрим, какова вероятность выиграть максимальный приз, угадав все выпавшие номера в Спортлото 5 из 36.