Python lambda表达式编写迭代器脚本
我正在编写一个python脚本,它应该包含一个函数列表,作为lambda表达式编写,并返回所有函数的组合,但是,我在脚本中有一个箭头,可能是因为我使用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
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
中的括号位于错误的位置。请提供帮助。谢谢。一定要用你的设备!我需要帮助。谢谢。一定要用你的设备!