yield
просто передает управление блоку.Другими словами, он вызывает блок.
В Python функции являются первоклассными, поэтому нет необходимости различать различные типы вызываемых объектов, как это делает Ruby (метод, блоки и процессы).Таким образом, эквивалент Python для уступки блоку - это просто вызов функции:
def wrap_print(f):
print('A')
f()
print('C')
def _():
print('B')
wrap_print(_)
Тот факт, что вам нужно определить именованную функцию, обусловлен ограничением в литералах анонимной функции Python, которые могут содержать только одинодиночное выражение.
Например, в этом случае вам не нужна именованная функция:
def transform(list, transformer):
newlist = []
for el in list:
newlist.append(transformer(el))
return newlist
transform([1, 2, 3], lambda el: el * 2)
#>>> [2, 4, 6]