Python 如何在值上映射它';有什么区别吗?
当且仅当值不是Python 如何在值上映射它';有什么区别吗?,python,functional-programming,maybe,Python,Functional Programming,Maybe,当且仅当值不是None时,是否有一种简洁的方法来映射该值?差不多 def fmapMaybe(f, v): if v is not None: f(v) else: None 更新:我正在寻找一种方法来处理值,如果它们与None不同,则保留None,否则,语义与我的fmapMaybe完全相同 在上面的代码中,f是一个任意单参数函数,v是一个值,如果它与None不同,则应传递给f。对什么是v或f没有进一步的限制 举一个具体的例子:我想从字典中获取一
None
时,是否有一种简洁的方法来映射该值?差不多
def fmapMaybe(f, v):
if v is not None:
f(v)
else:
None
更新:我正在寻找一种方法来处理值,如果它们与None
不同,则保留None
,否则,语义与我的fmapMaybe
完全相同
在上面的代码中,f
是一个任意单参数函数,v
是一个值,如果它与None
不同,则应传递给f
。对什么是v
或f
没有进一步的限制
举一个具体的例子:我想从字典中获取一个字符串值,并将其转换为整数(如果找到的话)。因此结果应该是一个整数,或者None
。使用上述函数,我将写:
fmapMaybe(int, os.environ.get('LINES'))
有没有更简短、更简洁的方法
正如Don Stewart所评论的,这类似于Haskell中的
Maybe
函子上的fmap
,或者Scala中的map
over选项上的fmap
。(如果我们认为<代码> f <代码>也可以返回<代码>没有< /COD>,它将类似于Haskell中的Madie<代码> > <代码> >和Scale < Scala < /Scale >, < P>如果你不告诉我们V是什么,你想做什么,这是我能想出的最好的。如果v是可数的:
result = [f(x) for x in v if x != None]
如果v是一个单一值,那么你的If条件对我来说是正常的 与评论中已经说过的内容类似:
fmapMaybe = lambda f,list : map(f,(i for i in list if i!=None))
测试:
x = [1, 2, 3, None, 5, None, None, 8]
fmapMaybe( lambda x:x**2, x )
#[1, 4, 9, 25, 64]
你能详细说明一下吗。你的问题目前似乎很模糊,无法回答。关于什么是f
、什么是v
、什么是mappaye
应该做什么,您没有提供足够的信息?对不起,到底是什么问题<代码>f(v)如果v不是None其他None
?或者您想先过滤掉None
吗?您正在Python中的Maybe functor上实现fmap
?lambda f,v:None如果v不是其他f(v)?也许这是一种误导。“也许你应该叫它fmapMaybe。”nymk好主意,更正。是的,这就是我想要实现的,我只是好奇python是否已经有了这样的函数,或者我是否必须自己定义它们。我更新了这个问题。我不想对v
设置任何限制,因此我不认为v
是可编辑的。只有当x
是一个列表时,这才有效,我不想要(也不能有)这样的限制。如果您使用numpy
您应该检查np.nan