>>> list=[None]
>>> def list[0](x,y):
File "<stdin>", line 1
def list[0](x,y):
^
SyntaxError: invalid syntax
如何将函数定义为列表的元素?
>>> list=[None]
>>> def list[0](x,y):
File "<stdin>", line 1
def list[0](x,y):
^
SyntaxError: invalid syntax
如何将函数定义为列表的元素?
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]
def f(whatever):
do_stuff()
l[0] = f
函数定义语法不允许您将函数直接定义到数据结构中,但您可以创建函数,然后将其分配到需要去的任何地方。
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)
允许这样的自由会使解析变得更加困难......例如带括号的表达式
...(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):
...