Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套python列表和字典问题_Python_Python 3.x_List - Fatal编程技术网

嵌套python列表和字典问题

嵌套python列表和字典问题,python,python-3.x,list,Python,Python 3.x,List,我是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(par

我是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(“”)
命令[cmd[0]](ls,cmd[1:]
这两条线是不可分割的。第一个调用
input
,询问用户要运行什么,然后在空格上拆分它以生成字符串列表。例如,这可能是:

#用户输入:追加3 4 5 6 7
cmd==['append','3','4','5','6','7']
然后,下一行获取该列表的第一个元素,并按该名称查找命令,这是一个函数

命令[cmd[0]]
并调用它,将列表本身和用户输入的其余参数作为参数传入

(ls,cmd[1:]
在我的示例中,这将导致一个如下所示的调用:

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

如果我重写这篇文章,我会质疑它的相关性。看起来很多内部构件都暴露给了用户。如果确信这是必要的,我会使用
list.\uuuu getattribute\uuuu
将方法名与这些方法配对

#替换所有函数定义和“命令”指令:
def get_方法(lst:list,attrname:str):
尝试:
method=lst.\uuuu getattribute\uuuu(属性名)
除属性错误外:
一无所获
然后将命令名从参数中拆分出来,并在调用该方法之前检查该方法是否存在

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
n=int(输入())
lst=[]
对于范围内的u(n):
cmd,*args=input().split(“”)
方法=获取方法(lst,cmd)
如果方法不是无:
方法(*args)

@geekypraveen这是有效的语法,但几乎肯定不是您想要的。这将把
命令['append']
重新定义为元组
(lst,['3','4','5','6','7'])
而不是函数
append