【问题标题】:Modify list using multiple def functions使用多个 def 函数修改列表
【发布时间】:2020-05-14 12:20:30
【问题描述】:

您好,希望有人能引导我朝着正确的方向前进。

我试图弄清楚如何使用 def 函数根据用户输入修改列表中的文本行。例如,如果用户输入“a”,它会在列表中添加一行,“d” = 删除行等等......

我已经定义了函数并且知道它们必须做什么,这里是其中的一些:

lineList = []
lines = ""

##Add Line
def addLine ():
    while lines != "#":
        lines = input ("Add a line: ")
        lineList.append(lines)
    for (i, item) in enumerate(lineList, start=1):
        print(str(i)+":", item)            


##Delete Line
def deleteLine ():
    lineNum = int(input("Enter line: ")    )
    del lineList[(lineNum)]
    for (i, item) in enumerate(lineList, start=1):
        print(str(i)+":", item)

##Find and replace string
def findReplace ():
    findString = input("Find string: ")
    replaceString = input ("Replace with: ")
    for n, i in enumerate(lineList):
        if i == findString:
            lineList[n] = replaceString
    for (i, item) in enumerate(lineList, start=1):
        print(str(i)+":", item)

所以我想弄清楚:初始列表应该在 addLine() 内部还是外部?我应该使用 addLine() 来追加列表吗?另外其他函数如何访问列表进行更改?

【问题讨论】:

    标签: python list user-defined-functions


    【解决方案1】:

    您可以使函数接受当前的lineList 作为参数,并在更改后将其返回。例如:

    ##Add Line
    def addLine(lineList):
        lines = ""
        while lines != "#":
            lines = input ("Add a line: ")
            lineList.append(lines)
        for (i, item) in enumerate(lineList, start=1):
            print(str(i)+":", item)  
    
        return lineList
    
    
    ##Delete Line
    def deleteLine(lineList):
        lineNum = int(input("Enter line: "))
        del lineList[(lineNum)]
        for (i, item) in enumerate(lineList, start=1):
            print(str(i)+":", item)
    
        return lineList
    
    ##Find and replace string
    def findReplace(lineList):
        findString = input("Find string: ")
        replaceString = input ("Replace with: ")
        for n, i in enumerate(lineList):
            if i == findString:
                lineList[n] = replaceString
        for (i, item) in enumerate(lineList, start=1):
            print(str(i)+":", item)
    
        return lineList
    
    
    lineList = []
    while True:
        command = input("Enter command (a, d, f): ")
        if command == "a":
            lineList = addLine(lineList)
        elif command == "d":
            lineList = deleteLine(lineList)
        elif command == "f":
            lineList = findReplace(lineList)
    

    【讨论】:

      【解决方案2】:

      据我了解,您需要在函数外部使用 linelist 变量,因此它是一个全局变量,然后您可以从任何地方访问它,甚至可以在函数内部访问它。如果您在函数 add 中声明该变量,则需要在 add 函数的开头添加:

      def addLine ():
          global linelist
          linelist = []
          while lines != "#":
              lines = input ("Add a line: ")
              lineList.append(lines)
          for (i, item) in enumerate(lineList, start=1):
               print(str(i)+":", item)          
      

      这样变量也是全局的,但在函数外部使用它更容易。

      希望这会有所帮助:D

      【讨论】:

        【解决方案3】:

        最好让你的函数将列表作为函数参数。使用全局变量通常是不好的做法,您应该尽可能避免使用它们。这样一来,您的功能可以是独立的和独立的,这是一个很好的设计特征。因此,只需将其作为参数即可。

        此外,以下代码块在您的每个函数中都是多余的。如果你也将它封装在一个函数中会更好。

        for (i, item) in enumerate(lineList, start=1):
                print(str(i)+":", item)
        

        例如:

        def print_lines(line_list):
            for (i, item) in enumerate(lineList, start=1):
                print(str(i)+":", item)
        

        这样,您不必每次都担心 for 循环,而只需在函数中使用 print_lines(line_list)

        Protip:看看PEP-8 Style Guide。本 PEP 将让您深入了解如何设置代码样式。

        希望答案有所帮助:)

        【讨论】:

          猜你喜欢
          • 2018-08-29
          • 2014-06-18
          • 2023-01-12
          • 2020-05-10
          • 2018-11-22
          • 2011-04-13
          • 2015-01-31
          • 2014-03-30
          相关资源
          最近更新 更多