Я вижу некоторые моменты в вашем вопросе, давайте рассмотрим их по порядку:
1.Могу ли я передать функцию в качестве параметра кому-либо?
Да:
def f(op, x, y):
return op(x, y)
def add(x, y):
return x + y
f(add, 10, 7) #gives 17
2.Тогда как насчет операторов?
В отличие от схемы, операторы Python не являются функциями, поэтому вы не можете передавать их напрямую в качестве параметров.Вы можете создать функции-оболочки самостоятельно или импортировать модуль operator из стандартной библиотеки.
import operator
operator.add(1, 2)
(lambda x,y : x+y)(1, 2)
Операторы, не являющиеся реальными функциями, в большинстве случаев немного печальны.но, по крайней мере, Python дает нам цепные сравнения, такие как 10 <= x < 100
взамен ...
3.Так в чем же разница между Python и Scheme?
В общем смысле функции в Python столь же мощны, как и функции в Scheme, однако есть некоторые вещи, на которые следует обратить внимание:
Ключевое слово lambda ограничено
В качестве тела функции может быть только одно выражение
f = lambda x, y: x + y
Поскольку в Python есть множество вещей, которые являются операторами, а не выражениями (назначения, 2.x print
, ...), вместо этого вам часто приходится прибегать к именованным функциям.
Есть замыкания
def make_printer(msg):
def printer():
print msg
return printer
printer('a message')()
Но мутирование переменных в них - это боль
Это не работает.Он пытается связать новый n для внутренней функции вместо использования внешнего
def make_counter(n):
def inc():
n = n + 1
return n
return inc
new 3.x нелокальное ключевое слово
def make_counter(n):
def inc():
nonlocal n
n = n + 1
return n
return inc
обходной путь с изменяемыми объектами
def make_counter(n):
nw = [n]
def inc():
nw[0] = nw[0] + 1
return nw[0]
return inc
Объекты вместо замыканий.Использует магический метод __call__
, чтобы притвориться его функцией
class Counter:
def __init__(self, n):
self.n = n
def __call__(self):
self.n += 1
return self.n