.i有一个分类器功能:
def f(x, threshold):
if logi == 1:
if x > threshold:
return 1
else:
return 0
并且有一个列表a = [2,3,12,4,53,3],如果使用map(f(threshold = 4),a)将引发错误" f()缺少1需要位置论证:' x'" 但如果我指定阈值默认值4,它将起作用。将函数定义修改为
def f(x, threshold=4):
if logi == 1:
if x > threshold:
return 1
else:
return 0
map(f,a)
会有预期的结果[0,0,1,0,1,0],我想知道是否有一些方法可以达到相同的目标而不指定参数默认值?
答案 0 :(得分:0)
我想知道是否有某种方法可以达到同一目标 没有指定参数默认值?提前谢谢!
肯定有!,真的有几种方法。 我个人使用列表理解,因为它们是如此可读。像这样:
def f(x, threshold, logi=1):
if logi == 1:
if x > threshold:
return 1
else:
return 0
else:
if x < threshold:
return 1
else:
return 0
a=[2, 3, 12, 4, 53, 3]
x = [f(item, 4) for item in a]
print(x)
#output => [0, 0, 1, 0, 1, 0]
希望这会有所帮助:)
如果你在地图上设置,那么functools可能会有所帮助:
from functools import partial
mapfunc = partial(f, 4)
(map(mapfunc, a))
答案 1 :(得分:0)
map
支持接受多个iterables,在最短时间结束时停止,将每个的输出作为顺序postional参数传递给mapper函数。如果你有一个固定的参数,你可以使用itertools.repeat
反复产生它,例如:
from itertools import repeat
map(f, a, repeat(4))
这种方法可以推广到更复杂的场景,允许循环使用一组固定的值(itertools.cycle
),或者只使用zip
配对两个迭代,但不需要zip
然后itertools.starmap
元组回到位置参数。
另一种对常量参数特别有用的方法是与functools.partial
部分绑定:
from functools import partial
map(partial(f, threshold=4), a)
其中partial
创建一个新的(CPython中的C级)包装器函数,该函数在未显式覆盖时将提供的参数传递给包装函数。