пятница, 1 мая 2020 г.

ЛМНты Python, 56 - 60

>>> Значение параметра по умолчанию

В следующем определении функции параметр c имеет значение по умолчанию:

>>> def fun(a, b, c=True):
...     return a if c else b
...
>>> fun(1, 2)
1
>>> fun(1, 2, 2<1)
2

Значения параметров по умолчанию вычисляются один раз в момент выполнения предложения def. Из этого следует, что

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

среда, 1 апреля 2020 г.

ЛМНты Python, 51 - 55

>>> Как замыкания

Интересно, что во вложенных функциях используемые нелокальные переменные точно так же доступны через locals(), как это происходит в замыканиях с бесплатными переменными:

>>> def f():
...     one = 1
...     print('f:', locals())
...     def g():
...         two = one + 1
...         print('g:', locals())
...         def h():
...             three = two + 1
...             print('h:', locals())
...         h()
...     g()
...
>>> f()
f: {'one': 1}
g: {'two': 2, 'one': 1}
h: {'three': 3, 'two': 2}

Вложенные функции, даже не потерявшие связь с контекстом, в котором они созданы, выглядят как замыкания.

воскресенье, 1 марта 2020 г.

ЛМНты Python, 46 - 50

>>> Нелокальное имя

Имя x, созданное операцией присваивания в начале функции fun, внутри вложенной функции fun2 экранируется другим именем x:

>>> def fun():
...     x = 'fun'
...     def fun2():
...         x = 'fun2'
...         print(x)
...     fun2()
...     print(x)
...
>>> fun()
fun2
fun

суббота, 1 февраля 2020 г.

ЛМНты Python, 41 - 45

>>> Генератор

Объект-генератор можно создать не только с помощью генераторного выражения, но и с помощью функции с предложением yield внутри:

>>> def down5():
...     n = 5
...     while n:
...         yield n
...         n -= 1
...
>>> type(down5)
<class 'function'>
>>> d5 = down5()
>>> type(d5)
<class 'generator'>

четверг, 2 января 2020 г.

ЛМНты Python, 36 - 40

>>> Две или больше

Функции map можно подать на вход больше одной последовательности и обработать их параллельно. Например, просуммировать поэлементно две последовательности:

>>> s1 = [1, 2, 3]
>>> s2 = [4, 5, 6, 7]
>>> m = map(lambda x, y: x+y, s1, s2)
>>> list(m)
[5, 7, 9]

Обработка завершается, когда достигнут конец самой короткой последовательности. Так же ведет себя функция zip, собирающая из нескольких последовательностей одну – с кортежами:

>>> z = zip(s1, range(5))
>>> list(z)
[(1, 0), (2, 1), (3, 2)]
>>> m = map(lambda x, y: (x, y), s1, range(5))
>>> list(m)
[(1, 0), (2, 1), (3, 2)]