4
>>> list=[None]
>>> def list[0](x,y):
  File "<stdin>", line 1
    def list[0](x,y):
             ^
SyntaxError: invalid syntax

如何将函数定义为列表的元素?

4

4 回答 4

10

Pythondef不够灵活,无法处理通用值,例如list[0]. 该语言只允许您使用标识符作为函数名称。以下是def-statement 语法规则的相关部分:

funcdef        ::=  "def" funcname "(" [parameter_list] ")" ":" suite
funcname       ::=  identifier

相反,您可以使用一系列赋值和定义语句:

s = [None]

def f(x, y):
    return x + y

s[0] = f

作为替代方案,您也可以将lambda表达式直接存储在列表中:

s = [lambda x,y : x+y]
于 2013-08-04T06:11:19.547 回答
9
def f(whatever):
    do_stuff()

l[0] = f

函数定义语法不允许您将函数直接定义到数据结构中,但您可以创建函数,然后将其分配到需要去的任何地方。

于 2013-08-04T06:07:09.247 回答
4
def someFunctionA(x, y):
    return x+y

def someFunctionB(x, y):
    return x*y

someList = [someFunctionA, someFunctionB]

print someList[0](2, 3)
print someList[1](5, 5)
于 2013-08-04T06:35:58.773 回答
2

允许这样的自由会使解析变得更加困难......例如带括号的表达式

...(x, y, z=3)

可以是参数声明(其中3是关键字参数 z 的默认值)或调用(将z关键字参数值作为传递3)。

如果你想允许一个通用的可赋值表达式,def你还需要允许

def foo(x, y, z=3)[3](x, y, z=3):
    ...

其中第一个括号部分与第二个部分具有不同的语义和语法规则。

为此编写解析器很烦人(基本上是因为您需要在不理解它的情况下处理任意数量的源代码)并且例如导致我所知道的整个宇宙中最糟糕的解析规则(这是最可怕的最令人烦恼的解析C ++),基本上只是放弃了通过模棱两可来获得一门体面的语言。

请注意,在许多情况下,程序更难进行解析是因为模棱两可,这也会使人类更难理解它。

Python 正确地将可读性视为非常重要。

然而,Python 中的函数是一流的对象,因此您可以很容易地解决您的问题:

def foo(...):
    ...

mylist[index] = foo

或者,仅当函数是单个表达式时,使用

mylist[index] = lambda ... : ...

(但lambda非常有限,既因为它在 Python 社区中有点“讨厌”,也因为它会在语法级别产生一些烦恼,因为需要处理括号内的缩进)。

另请注意,一些 Python 新手不知道的是,您def甚至可以在函数内部使用;例如:

def register_http():
    def handle_http(connection):
        ...
    global_register['http'] = handle_http

这将分配一个函数作为全局映射的元素,而不会用其名称污染全局(模块)命名空间。本地def也可以通过捕获局部状态变量来创建闭包(在 2.x 中是只读的,甚至在 3.x 中是读/写的)。

另请注意,如果您需要对某个函数进行一些处理,可能decorators会很有用。例如通过定义

def register(name):
    def do_registering(f):
        global_register[name] = f
        return f
    return do_registering

你可以使用

@register('http')
def handle_http(connection):
    ...
于 2013-08-04T07:06:29.150 回答