嵌套python列表和字典问题



我是python的初学者。我有一个代码,但我只能理解其中的一部分。。你能详细解释一下针对这个问题调用命令的最后一行吗?还有,为什么我们在pop((函数中传递li:list作为参数?

def insert(ls,params):
ls.insert(int(params[0]), int(params[1]))
def print_list(ls, params):
print(ls)
def remove(ls, params):
ls.remove(int(params[0]))
def append(ls, params):
ls.append(int(params[0]))
def sort_list(ls, params):
ls.sort()
def pop(ls: list, params):
ls.pop()
def reverse(ls, params):
ls.reverse()
commands = {
'insert': insert,
'print': print_list,
'remove': remove,
'append': append,
'sort': sort_list,
'pop': pop,
'reverse': reverse
}
if __name__ == '__main__':
N = int(input())
ls = []
for _ in range(N):
cmd = input().split(' ')
commands[cmd[0]](ls, cmd[1:])

哦,好吧,我们开始吧。我首先要说的是,这不是惯用代码,也不是任何精通Python的程序员构建程序的方式。也就是说:分析它是有好处的。

逆向工作:让我们谈谈

为什么我们在pop((函数中传递li:list作为参数

你说的是我假设这里的函数声明

def pop(ls: list, params):
ls.pop()

这被称为函数注释,并在这里进行了记录。它们经常被用作类型提示,Python运行时会将它们完全去掉。使用或省略函数注释不会改变任何行为。

现在是肉和土豆:

你能给我解释一下的最后一行吗

cmd = input().split(' ')
commands[cmd[0]](ls, cmd[1:])

这两条线是不可分割的。第一个调用input询问用户要运行什么,然后将其拆分为空格以生成字符串列表。例如:

# user-input: append 3 4 5 6 7
cmd == ['append', '3', '4', '5', '6', '7']

然后下一行获取该列表的第一个元素,并按该名称查找命令,这是一个函数

commands[cmd[0]]

并调用它,将列表本身和用户输入中的其余参数作为参数传入

(ls, cmd[1:])

在我的例子中,这会导致一个调用,看起来像:

append(lst, ['3', '4', '5', '6', '7'])

如果我重写这篇文章,我会质疑它的相关性。用户似乎看到了很多内部信息。如果确信这是必要的,我会使用list.__getattribute__将方法名称与这些方法配对。

# replacing all the function definitions and the "commands" dict:
def get_method(lst: list, attrname: str):
try:
method = lst.__getattribute__(attrname)
except AttributeError:
return None

然后将命令名从内联参数中分离出来,并在调用该方法之前检查该方法是否存在

if __name__ == '__main__':
n = int(input())
lst = []
for _ in range(n):
cmd, *args = input().split(' ')
method = get_method(lst, cmd)
if method is not None:
method(*args)

最新更新