Как сочинять функции, чисто используя стандартную библиотеку Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как сочинять функции, чисто используя стандартную библиотеку Python?

Сообщение Anonymous »

Стандартная библиотека Python огромна, и моя интуиция говорит, что в этом должен быть способ сделать это, но я просто не могу понять это. Это исключительно для любопытства и целей обучения: < /p>
У меня есть две простые функции: < /p>

Код: Выделить всё

def increment(x):
return x + 1

def double(x):
return x * 2
И я хочу составить их в новую функцию double_and_increment . Я, конечно, мог бы просто сделать это как таковой: < /p>

Код: Выделить всё

double_and_increment = lambda x: increment(double(x))
< /code>
Но я также мог бы сделать это в более запутанном, но, возможно, более «эргономично масштабируемом» способе: < /p>
import functools

double_and_increment = functools.partial(functools.reduce, lambda acc, f: f(acc), [double, increment])
< /code>
Оба вышеперечисленного работают нормально: < /p>
>>> double_and_increment(1)
3
Теперь вопрос в том, существует ли инструмент в стандартной библиотеке, которая позволила бы достичь композиции без каких-либо определенных пользователей Lambdas, регулярных функций или классов. operator.call , но это, к сожалению, принимает аргументы в обратном порядке:

Код: Выделить всё

>>> (lambda acc, f: f(acc))(1, str)  # What we want to replace.
>>> '1'
>>> import operator
>>> operator.call(str, 1)  # Incorrect argument order.
>>> '1'
У меня есть догадка, что использование functools.reduce по-прежнему является способом достижения композиции, но для жизни я не могу найти способ избавиться от определенного пользователя лямбда.

Код: Выделить всё

import functools, operator

# Curried form, can't figure out how to uncurry.
functools.partial(operator.methodcaller, '__call__')(1)(str)

# The arguments needs to be in the middle of the expression, which does not work.
operator.call(*reversed(operator.attrgetter('args')(functools.partial(functools.partial, operator.call)(1, str))))
просмотрели все существующие вопросы, но они совершенно разные и полагаются на использование определенных пользователей функций и/или лямбда.

Подробнее здесь: https://stackoverflow.com/questions/774 ... rd-library
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»