在Python中定义一个函数(有一个很大的问题)



所以几天前我们得到了这项练习,我们需要制作一个函数,将两个列表作为输入并计算其平均值的差异。

听起来很简单,但是有一些捕获:

  • 整个事情必须是一行长

  • 您绝对不能使用':'

他们鼓励我们使用"导入"," help()"one_answers" dir()"。

问题是我知道如何使它仅长一条线,但是否':'真的很烦人。

我看到的方式,我首先需要定义一个函数(没有代码),然后更改它的" func_code" attr。

关于我该怎么做的任何想法?以及这些参数如何适合这个?任何答案都将被赞赏!!!

编辑:感谢所有的答案和创意思想,即Char(58)是解决方案,它确实很有创造力,我没有想到该解决方案,但是由于您使用的是:',即使您使用的是:'不是直接。

no :表示您不能使用lambda。留下高阶功能或eval骗局。

eval('lambda a,b{}sum(a)/len(a)-sum(b)/len(b)'.format(chr(58)))

这符合法律的信,但违反了它的精神。

不幸的是,没有功能组成函数,高阶功能的工作方式不能很好。实施一个没有:的一个很棘手。

使用腌制代码对象,这是一个相当独立的解决方案。我已经在Python 3.6中创建了它,并且特定的Bytestring很可能是特定版本的,但是您可以使用下面的扩展代码轻松地创建自己的版本。无论如何,这是淘汰者:

f = __import__('types').FunctionType(__import__('pickle').loads(b'x80x03cipykernel.codeutilncode_ctornqx00(Kx02Kx00Kx02Kx04KCC tx00|x00x83x01tx01|x00x83x01x1bx00tx00|x01x83x01tx01|x01x83x01x1bx00x18x00Sx00qx01Nx85qx02Xx03x00x00x00sumqx03Xx03x00x00x00lenqx04x86qx05Xx01x00x00x00aqx06Xx01x00x00x00bqx07x86qx08Xx1ex00x00x00<ipython-input-1-384cc87bd499>qtXx16x00x00x00difference_of_averagesqnKx01Cx02x00x01qx0b))tqx0cRqr.'), globals())

这是我在没有单行的恶作剧的情况下要做的:

import types   # replace these import statements with calls to __import__ in the oneliner
import pickle
def difference_of_averages(a, b):
    return sum(a)/len(a) - sum(b)/len(b)
payload = pickle.dumps(difference_of_averages.__code__) # embed as a literal in the oneliner
f = types.FunctionType(pickle.loads(payload), globals())

hmm,在我手头上的几个不同解释器上尝试了此操作,看起来我的泡菜字符串包括我创建的ipython解释器中的一些胡说八道。如果您使用我的字符串遇到错误,我建议只构建您自己的(如果包含任何垃圾,至少将与您的环境兼容)。

不使用':'很棘手,因为通常使用它来定义功能主体,例如:

def average(number_list):
    return sum(number_list) / len(number_list)

但是,我知道一种定义不需要为其身体编写块的函数的方法:您可以将lambda函数(甚至已经定义的函数)分配给要定义的函数,只需使用平等符号(=)即可。例如,如果要创建average()函数,则可以写:

average = lambda number_list: sum(number_list) / len(number_list)

average看起来像一个变量,但是您可以将其用作函数。它只是调用将number_list作为输入的lambda函数,并返回number_list的平均值。您可以这样称呼它:

value = average([10, 11, 12])  # sets value to 11

现在,lambda功能只能有一行。但这对您来说并不是一个问题,因为您的任务需要您只使用一行。

您知道现在该怎么办?您的练习需要您找到两个列表的平均值,因此您可以考虑使用一个lambda功能,该功能采用两个输入(而不是一个,就像我在上面给出的示例中一样)。还要记住,您需要返回差异,如果差异始终是正面的,请考虑使用Python的abs()函数。

编辑:好吧,吉尔奇的响应使我意识到我无法使用lambda,因为即使他们使用:。因此,显然您无法使用我的建议。不过,很高兴知道lambda功能。

鼓励您使用import的事实使我想知道您可以使用某些模块已定义的功能来定义您自己的功能是否可以。有点这样:

import math; average = math.difference_of_averages

但是,这取决于您能够找到(可能是标准的)功能,该功能正是您想要的。(我已经简要检查了mathnumpy模块,但尚未找到任何匹配的内容。)

也许这意味着您可以创建一个模块并将其定义。该模块在自己的世界中,因此不受锻炼规则的约束。

然后再一次,也许不是。

因此,除非您想在eval语句中"偷偷" :(如Gilch所建议),否则:

average = eval('lambda number_list' + chr(58) + ' sum(number_list) / len(number_list)')

我没有办法避免使用:

最新更新