如果我制作两个函数列表:
def makeFun(i):
return lambda: i
a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
为什么名单a和b不相等?
例如:
>>> a[2]()
2
>>> b[2]()
9
Run Code Online (Sandbox Code Playgroud) 我有两个Python CLI工具,它们共享一组常用的click.options。目前,通用选项已重复:
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-1', is_flag=True)
def command_one():
pass
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-2', is_flag=True)
def command_two():
pass
Run Code Online (Sandbox Code Playgroud)
是否可以将通用选项提取到可以应用于每个功能的单个装饰器中?
Python 的标准库非常庞大,我的直觉告诉我其中一定有一种方法可以实现这一点,但我就是想不出来。这纯粹是出于好奇和学习目的:
我有两个简单的功能:
def increment(x):
return x + 1
def double(x):
return x * 2
Run Code Online (Sandbox Code Playgroud)
我想将它们组合成一个新函数double_and_increment。我当然可以简单地这样做:
double_and_increment = lambda x: increment(double(x))
Run Code Online (Sandbox Code Playgroud)
但我也可以用更复杂但也许更“符合人体工程学可扩展”的方式来做到这一点:
import functools
double_and_increment = functools.partial(functools.reduce, lambda acc, f: f(acc), [double, increment])
Run Code Online (Sandbox Code Playgroud)
上面两个都工作得很好:
double_and_increment = lambda x: increment(double(x))
Run Code Online (Sandbox Code Playgroud)
现在的问题是,标准库中是否有工具可以在没有任何用户定义的 lambda、常规函数或类的情况下实现组合。
第一个直觉是将调用lambda acc, f: f(acc)中的定义替换为,但不幸的是,这会以相反的顺序获取参数:functools.reduceoperator.call
>>> (lambda acc, f: f(acc))(1, str) # What we want to replace.
>>> '1'
>>> import operator
>>> operator.call(str, 1) # Incorrect argument order.
>>> '1'
Run Code Online (Sandbox Code Playgroud)
我有一种预感,使用functools.reduce …
python language-features functional-programming standard-library function-composition
我知道如何通过将两个函数作为输入并输出其组合函数来组合两个函数,但是如何返回组合函数f(f(... f(x)))呢?谢谢
def compose2(f, g):
return lambda x: f(g(x))
def f1(x):
return x * 2
def f2(x):
return x + 1
f1_and_f2 = compose2(f1, f2)
f1_and_f2(1)
Run Code Online (Sandbox Code Playgroud) 让我们说我们在python中有函数:
def _abs(iterable): #cause its normally for one element only
return [abs(i) for i in iterable]
def A(list, foo):
return foo(list)
list = [2,3,-5]
print( A(list,foo=sum) )
>> 0
Run Code Online (Sandbox Code Playgroud)
虽然我可能会foo=sum转到A,但我正在寻找一种优雅的方式来传递类似foo=sum(_abs)表演的东西sum(_abs(list)).
我现在看到它的唯一方法是发送一个函数列表[sum, _abs]并按顺序应用它们.有没有更好的办法?