我迷上了这个python程序

时间:2019-03-17 06:16:06

标签: python list

import sys
import pathlib
import os
def GetAndSplitCommand(line, file):
    if line is 1:
        line = 0
    f=open(file)
    lines=f.readlines()
    unsplit=lines[line]
    split=unsplit.split()
    return split

def ExecuteCode(*args):
    lists = [item for item in args]
    print(lists)
    parameters = args
    if lists[0] == "hi":
        HelloWorld()
        return
    elif lists[0] == "bye":
        GoodbyeWorld()
        return

def HelloWorld():
    print(" Hello World!")
    return
def GoodbyeWorld():
    print(" Bye World!")
    return
command = GetAndSplitCommand(1, "food.txt")
ExecuteCode(command)

在food.txt中,我有一个单词“ hi”,因此,使用此代码,它应该打印出“ Hello World!”,但是它只是打印出[['hi']]。我已经尝试过很多次以重新格式化代码,并且我需要我做些什么的建议。

而且,这不是缩进问题,stackoverflow不适用于我的代码。

另一个说明,该程序实质上是要读取文件的行,将行拆分为单独的“参数”,然后使用ExecuteCode()函数在第一个参数为X的情况下执行某些操作。

1 个答案:

答案 0 :(得分:0)

在我看来,您似乎误解了*args在函数声明中的作用。

编写def ExecuteCode(*args):时,您就想保留允许使用可变数量的参数来调用ExecuteCode的功能。例如,其他代码可以调用ExecuteCode("foo", "bar", "baz")(三个参数)或ExecuteCode()(零参数)。函数中的args变量将是这些参数值的列表(因此,我的两个示例调用为["foo", "bar", "baz"][]

在您的代码中,您正在使用一个参数ExecuteCode(command)调用该函数。如果command是列表['hi'],则在ExecuteCode内,args将是[['hi']],因为它总是将参数放在列表中,因为可能存在其中几个。

您可能不需要在这里使用*args。相反,只需使用:

def ExecuteCode(lists):
    if lists[0] == "hi":
        ...

请注意,您的代码还存在其他一些样式问题(这不会阻止代码运行,但确实会使它变得更加复杂或令人困惑)。一个问题是命名。常见的Python约定是对大多数函数使用lowercase_names_with_underscores,对类保留CapitalizedNames。另一个问题是选择清楚其作用的名称。 lists中的ExecuteCode变量就是一个例子。在您当前的错误代码中,它是一个列表列表,因此名称​​可能很有道理(如果您想要的话),但是如果您按照我上面的建议将其更改为字符串列表,您应该将其重命名,因为它不再是列表列表。