Python 将函数实现为Lambda

Python 将函数实现为Lambda,python,lambda,Python,Lambda,有没有办法将以下功能作为lambda实现: def z(s,f): for c in s: if c in f:f.remove(c) else:return 0 return 1 我最大的麻烦是f.remove(c): 上面的代码只是抱怨语法错误 请注意,我并不是为了任何严肃的目的而使用它,只是为了娱乐性的代码高尔夫。相当于lambda: lambda s, f: int(all(c in f and f.remove(c) is None for c in s)) z = l

有没有办法将以下功能作为lambda实现:

def z(s,f):
 for c in s:
  if c in f:f.remove(c)
  else:return 0
 return 1
我最大的麻烦是f.remove(c):

上面的代码只是抱怨语法错误


请注意,我并不是为了任何严肃的目的而使用它,只是为了娱乐性的代码高尔夫。

相当于
lambda

lambda s, f: int(all(c in f and f.remove(c) is None for c in s))
z = lambda s, f: [f.remove(c) if c in f else throw(Return) 
                  for c in s] except Return: 0

这将使用对
以及
所有
的延迟求值来
仅删除相应的字符

等效的
lambda

lambda s, f: int(all(c in f and f.remove(c) is None for c in s))
z = lambda s, f: [f.remove(c) if c in f else throw(Return) 
                  for c in s] except Return: 0
这将使用对
以及
所有
的延迟求值来
仅删除相应的字符

你可以把它写成lambda,但你真的,真的不应该

首先,必须将每条语句转换为表达式。这里有多个步骤,每一个都不是好主意

如果f中的c:f.remove(c)
变为
f.remove(c)如果c else 0
。在这样的表达式中使用仅因副作用而调用的函数是非常不道德的,但这并不违法。我们只需要考虑到这样一个事实,即
f.remove(c)
总是返回
None
,然后选择可以放在其他分支中的其他内容

现在,这并不意味着提前返回,因为这是不可能的;表达式中不能有
return
语句或任何语句。我们稍后再谈

接下来,for
语句的
必须成为某种理解,在本例中是一个生成器表达式:
(f.remove(c)if c in f,否则0表示c in s)
。请注意,我们将值
None
0
放入迭代器中,尽管我们实际上并不关心这些值,因此这是对理解的滥用,但也不是非法的

现在,我们可以通过使用
all
函数来处理“提前返回”:
all(对于中的值(f.remove(c)if c in f,否则0 for c in s),value为None
。如果每个值都是
None
,那么这将是
True
,但一旦它找到一个不是的值(因为f
中的
c是false),它将停止,并计算为
false
。我们可以通过调用
int
False
转换为
0
True
转换为
1
,只需调用
int
(或者如果foo else 0
,则使用
1,但此时何必费心尝试成为Pythonic呢?)

<>当然,这是误用<代码> lambda < /COD>,因为代码“lambda < /c> >的整个点是它给我们一个可以在表达式中间定义的匿名函数;如果您想在语句中定义它并给它一个名称,那么使用
lambda
而不是
def
所做的就是混淆代码

如果需要,您可以将两个循环折叠为一个循环,并进行各种其他更改,以使其更加简洁。如果您使用代码高尔夫,您可以将其作为lambda编写,但您确实不应该这样做

首先,必须将每条语句转换为表达式。这里有多个步骤,每一个都不是好主意

如果f中的c:f.remove(c)
变为
f.remove(c)如果c else 0
。在这样的表达式中使用仅因副作用而调用的函数是非常不道德的,但这并不违法。我们只需要考虑到这样一个事实,即
f.remove(c)
总是返回
None
,然后选择可以放在其他分支中的其他内容

现在,这并不意味着提前返回,因为这是不可能的;表达式中不能有
return
语句或任何语句。我们稍后再谈

接下来,for
语句的
必须成为某种理解,在本例中是一个生成器表达式:
(f.remove(c)if c in f,否则0表示c in s)
。请注意,我们将值
None
0
放入迭代器中,尽管我们实际上并不关心这些值,因此这是对理解的滥用,但也不是非法的

现在,我们可以通过使用
all
函数来处理“提前返回”:
all(对于中的值(f.remove(c)if c in f,否则0 for c in s),value为None
。如果每个值都是
None
,那么这将是
True
,但一旦它找到一个不是的值(因为f
中的
c是false),它将停止,并计算为
false
。我们可以通过调用
int
False
转换为
0
True
转换为
1
,只需调用
int
(或者如果foo else 0
,则使用
1,但此时何必费心尝试成为Pythonic呢?)

<>当然,这是误用<代码> lambda < /COD>,因为代码“lambda < /c> >的整个点是它给我们一个可以在表达式中间定义的匿名函数;如果您想在语句中定义它并给它一个名称,那么使用
lambda
而不是
def
所做的就是混淆代码


如果您愿意,可以将两个循环折叠为一个循环,如果您想使用code golf,还可以进行其他各种更改,使其更加简洁。

如果我们想寻找一些愚蠢的想法,我想到了一种方法,可以从表达式中提前返回。首先,我们需要一点可重复使用的脚手架:

class Return(Exception): pass

def throw(e): raise e

def early(f):
    try:
        return f()
    except Return as e:
        return e.args[0]
现在:

如果被接受,
early
功能将不必要,内部的
lambda

lambda s, f: int(all(c in f and f.remove(c) is None for c in s))
z = lambda s, f: [f.remove(c) if c in f else throw(Return) 
                  for c in s] except Return: 0

如果我们在寻找一些愚蠢的想法,我想到了一种方法,可以从一个表达式中提前返回。首先,我们需要一点可重复使用的脚手架:

class Return(Exception): pass

def throw(e): raise e

def early(f):
    try:
        return f()
    except Return as e:
        return e.args[0]
现在:

如果被接受,
early
功能将不必要,内部的
lambda

lambda s, f: int(all(c in f and f.remove(c) is None for c in s))
z = lambda s, f: [f.remove(c) if c in f else throw(Return) 
                  for c in s] except Return: 0

你应该在你的语法错误中问这个问题,这个问题和删除
无关;这意味着您正在尝试使用列表理解/生成器表达式语法,而不使用