Python lambda表达式编写迭代器脚本

Python lambda表达式编写迭代器脚本,python,lambda-calculus,Python,Lambda Calculus,我正在编写一个python脚本,它应该包含一个函数列表,作为lambda表达式编写,并返回所有函数的组合,但是,我在脚本中有一个箭头,可能是因为我使用lambda表达式的方式。看起来,即使我给返回的函数一个数值,我也会得到一个函数,而不是一个数字。这就是我写的: def compose1(lst): if lst == []: return lambda x: x else: temp = (lst[len(lst)-1]) for

我正在编写一个python脚本,它应该包含一个函数列表,作为lambda表达式编写,并返回所有函数的组合,但是,我在脚本中有一个箭头,可能是因为我使用lambda表达式的方式。看起来,即使我给返回的函数一个数值,我也会得到一个函数,而不是一个数字。这就是我写的:

def compose1(lst):
    if lst == []:
        return lambda x: x
    else:
        temp = (lst[len(lst)-1])
        for i in range(len(lst)-2,-1,-1):
            temp = lambda x: lst[i](temp)
        return lambda x: temp
这是对我编写的函数的一次尝试,它表明我有一个错误

f = compose1([lambda x: x+1, lambda x: x*2, lambda x: x-1])
for x in range(10):
    assert (f(x) == 1 + (x - 1) * 2)
f = compose1([lambda x: x-1, lambda x: x*2, lambda x: x+1])
for x in range(10):
    assert (f(x) == (x + 1) * 2) - 1
我希望能在这个问题上稍作停顿。。
谢谢:)

你的问题是你的逻辑

for i in range(len(lst)-2,-1,-1):
    temp = lambda x: lst[i](temp)
return lambda x: temp
这将为功能设置
temp
lst
是一个函数列表,
lst[i]
是一个函数。调用它,给出一个值,然后用lambda生成一个新函数。然后返回一个给出该函数的函数

你的返回值是一个函数,它给出一个函数,它给出一个值,因此你的问题

请注意,此代码还有其他问题<例如,如果lst=[]:不是lst:则应为
。正如Python设计的那样,您也不应该按索引进行迭代,而应该按值进行迭代。实际上,我无法计算出您试图用代码实现什么,这表明按索引进行迭代是多么困难

您的代码当前执行以下操作:

  • 如果没有值,则返回返回第一个参数的函数
  • 如果有一个值,则返回列表中的函数
  • 如果有多个值,则返回一个函数,该函数返回通过运行列表中的第一个函数检索到的第一个值

我不知道你想做什么,但我很确定那不是。你的问题是你的逻辑

for i in range(len(lst)-2,-1,-1):
    temp = lambda x: lst[i](temp)
return lambda x: temp
def compose(*funcs):
    """
    compose(func[,...[, func]]) -> function

    Return the composition of functions.
    For example, compose(foo, bar)(5) == foo(bar(5))
    """
    if not all(callable(func) for func in funcs):
        raise TypeError('argument must be callable')
    funcs = funcs[::-1]

    def composition(*args, **kwargs):
        args = funcs[0](*args, **kwargs)
        for func in funcs[1:]:
            args = func(args)
        return args
    return composition

f = compose(*[lambda x: x+1, lambda x: x*2, lambda x: x-1])
for x in range(10):
    assert f(x) == (1 + (x - 1) * 2)
f = compose(*[lambda x: x-1, lambda x: x*2, lambda x: x+1])
for x in range(10):
    assert f(x) == ((x + 1) * 2) - 1
这将为功能设置
temp
lst
是一个函数列表,
lst[i]
是一个函数。调用它,给出一个值,然后用lambda生成一个新函数。然后返回一个给出该函数的函数

你的返回值是一个函数,它给出一个函数,它给出一个值,因此你的问题

请注意,此代码还有其他问题<例如,如果lst=[]:
不是lst:则应为
。正如Python设计的那样,您也不应该按索引进行迭代,而应该按值进行迭代。实际上,我无法计算出您试图用代码实现什么,这表明按索引进行迭代是多么困难

您的代码当前执行以下操作:

  • 如果没有值,则返回返回第一个参数的函数
  • 如果有一个值,则返回列表中的函数
  • 如果有多个值,则返回一个函数,该函数返回通过运行列表中的第一个函数检索到的第一个值

我不确定你想做什么,但我很确定不是这样。

看起来你的循环只是在重新实现
reduce
的功能。下面是函数组合问题的函数视图:

def compose(*funcs):
    """
    compose(func[,...[, func]]) -> function

    Return the composition of functions.
    For example, compose(foo, bar)(5) == foo(bar(5))
    """
    if not all(callable(func) for func in funcs):
        raise TypeError('argument must be callable')
    funcs = funcs[::-1]

    def composition(*args, **kwargs):
        args = funcs[0](*args, **kwargs)
        for func in funcs[1:]:
            args = func(args)
        return args
    return composition

f = compose(*[lambda x: x+1, lambda x: x*2, lambda x: x-1])
for x in range(10):
    assert f(x) == (1 + (x - 1) * 2)
f = compose(*[lambda x: x-1, lambda x: x*2, lambda x: x+1])
for x in range(10):
    assert f(x) == ((x + 1) * 2) - 1
def compose1(fnlist):
    if not fnlist:
        return lambda x: x

    # compose 1 function of x from two others
    def compose2fns(fn1, fn2):
        return lambda x : fn1(fn2(x))
    # or if you really love lambdas
    # compose2fns = lambda fn1,fn2: lambda x: fn1(fn2(x))

    # use reduce to cumulatively apply compose2fns to the functions
    # in the given list
    return reduce(compose2fns, fnlist)
这可以通过你的测试

高尔夫代码: 我无法抗拒,这里有一行代码,甚至包括您检查的空输入列表:

compose1 = lambda fnlist: reduce(lambda fn1,fn2: lambda x : fn1(fn2(x)), 
                                  fnlist or [lambda x:x])

看起来您的循环只是在重新实现
reduce
的功能。下面是函数组合问题的函数视图:

def compose1(fnlist):
    if not fnlist:
        return lambda x: x

    # compose 1 function of x from two others
    def compose2fns(fn1, fn2):
        return lambda x : fn1(fn2(x))
    # or if you really love lambdas
    # compose2fns = lambda fn1,fn2: lambda x: fn1(fn2(x))

    # use reduce to cumulatively apply compose2fns to the functions
    # in the given list
    return reduce(compose2fns, fnlist)
这可以通过你的测试

高尔夫代码: 我无法抗拒,这里有一行代码,甚至包括您检查的空输入列表:

compose1 = lambda fnlist: reduce(lambda fn1,fn2: lambda x : fn1(fn2(x)), 
                                  fnlist or [lambda x:x])
我喜欢这种语法:

f = do (lambda x: x-1) (lambda x: x*2) (lambda x: x+1)

for x in range(10):
    assert f(x) == 1 + (x - 1) * 2
实施过程令人惊讶地微不足道:

class do(object):
    def __init__(self, x):
        self.fns = [x]
    def __call__(self, x):
        if callable(x):
            self.fns.append(x)
            return self
        for f in self.fns:
            x = f(x)
        return x
我喜欢这种语法:

f = do (lambda x: x-1) (lambda x: x*2) (lambda x: x+1)

for x in range(10):
    assert f(x) == 1 + (x - 1) * 2
实施过程令人惊讶地微不足道:

class do(object):
    def __init__(self, x):
        self.fns = [x]
    def __call__(self, x):
        if callable(x):
            self.fns.append(x)
            return self
        for f in self.fns:
            x = f(x)
        return x

对,这就是我们的目标。我真的搞不懂,+1.5坦克!当然,从这个脚本中可以学到很多东西!对,这就是我们的目标。我真的搞不懂,+1.5坦克!当然,从这个脚本中可以学到很多东西!您的第一个
assert
在表达式周围有一些虚假的括号。如果删除了它们,您可能还会注意到第二个
assert
中的括号位于错误的位置。您的第一个
assert
在表达式周围有一些虚假的括号。如果您删除了它们,那么您可能还会注意到第二个
assert
中的括号位于错误的位置。请提供帮助。谢谢。一定要用你的设备!我需要帮助。谢谢。一定要用你的设备!