我是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)