如何更改python列表索引的语法?

如何更改python列表索引的语法?,python,list,python-3.x,syntax,indexing,Python,List,Python 3.x,Syntax,Indexing,在询问之后,它收到了一条评论,关于你如何能做这样的事情: >>> def a(n): print(n) return a >>> b = a(3)(4)(5) 3 4 5 是否可以使用这个或类似的概念来索引列表,比如my\u list(n),而不是my\u list[n]?您必须使用一个自定义类,并给它一个。list的子类在这里可以很好地工作: class CallableList(list): def __call_

在询问之后,它收到了一条评论,关于你如何能做这样的事情:

>>> def a(n):
        print(n)
        return a
>>> b = a(3)(4)(5)
3
4
5

是否可以使用这个或类似的概念来索引列表,比如
my\u list(n)
,而不是
my\u list[n]

您必须使用一个自定义类,并给它一个。
list
的子类在这里可以很好地工作:

class CallableList(list):
    def __call__(self, item):
        return self[item]
您不能使用它来分配索引,但是,只有项访问才有效。切片需要您使用创建
slice()
对象:

a = CallableList([1, 2, 3])
a(2)
a(slice(None, 2, None))

nested = CallableList([1, 2, CallableList([4, 5, 6])])
nested(2)(-1)

除此之外,您还必须创建一个自定义Python语法分析器来构建AST,然后从那里编译成字节码。

您必须使用一个自定义类,并为它提供一个可调用的语法分析器。
list
的子类在这里可以很好地工作:

class CallableList(list):
    def __call__(self, item):
        return self[item]
您不能使用它来分配索引,但是,只有项访问才有效。切片需要您使用创建
slice()
对象:

a = CallableList([1, 2, 3])
a(2)
a(slice(None, 2, None))

nested = CallableList([1, 2, CallableList([4, 5, 6])])
nested(2)(-1)
此外,您还必须创建一个自定义Python语法分析器来构建AST,然后从那里编译成字节码。

my_list()中的括号被视为函数调用。如果需要,您可以编写自己的类来包装列表,并覆盖调用方法以索引到列表中

class MyList(object):

    def __init__(self, alist):
        self._list = alist

    def __call__(self, index):
        return self._list[index]

>>> mylist = MyList(['a','b','c','d','e','f'])
>>> mylist(3)
'd'
>>> mylist(4)
'e'
my_list()中的括号被视为函数调用。如果需要,您可以编写自己的类来包装列表,并覆盖调用方法以索引到列表中

class MyList(object):

    def __init__(self, alist):
        self._list = alist

    def __call__(self, index):
        return self._list[index]

>>> mylist = MyList(['a','b','c','d','e','f'])
>>> mylist(3)
'd'
>>> mylist(4)
'e'

您可以创建一个返回函数的函数:

def make_callable(some_list):
    return lambda x: some_list[x]

original_list = [ 1, 2, 3, 4 ]
callable_list = make_callable(original_list)

print(callable_list(1)) # Prints 2

您可以创建一个返回函数的函数:

def make_callable(some_list):
    return lambda x: some_list[x]

original_list = [ 1, 2, 3, 4 ]
callable_list = make_callable(original_list)

print(callable_list(1)) # Prints 2

你问的问题很好。我喜欢你的好奇心你可能会觉得有趣你问的问题很好。我喜欢你的好奇心你可能会觉得有趣。我们如何使用
我的矩阵(x)(y)
而不是
我的矩阵[x][y]
来访问2d列表?@Scorpion\u God:你将
可调用列表()
对象存储在
可调用列表()
中,就像你将一个常规列表存储在另一个列表中以获得矩阵一样。我们如何使用
my\u matrix(x)(y)
而不是
my\u matrix[x][y]
来访问2d列表?@Scorpion\u God:你将
CallableList()
对象存储在
CallableList()
中,就像你将常规列表存储在另一个列表中以获得矩阵一样。