首页 文章

Pythonic方式返回函数中初始化的列表?

提问于
浏览
0

我正在编写一个函数来解析文件并构建一个列表 . 我可以想到两种方法来做到这一点,我想知道其中一个是否被认为更像Pythonic .

在第一种方法中,函数返回列表 .

def initList(fname):
   mylist = []
   # process fname & build list
   return mylist

if __name__ == "__main__":
   list_a = initList('someFile')

在第二种方式中,知道列表是可变对象,因此如果作为参数传递给函数,则函数中所做的任何更改都会更改实际列表,这样做:

def initList(fname, mylist):
   # process fname & build list

if __name__ == "__main__":
   list_a = []
   initList('someFile', list_a)

我倾向于第一种方式,因为它使读者清楚该函数正在初始化列表 . 但是第二种方式在某种意义上似乎更为通用,如果initList()使用mylist.append()调用添加到列表中,则可以重用它来将元素添加到已存在的列表中,而第一种方法则不能 .

关于最佳实践在这里会有什么共识?

3 回答

  • 0

    这取决于您的需求 .

    如果你应该总是从一个空列表开始,那么将它作为参数是没有意义的 .

    另一方面,如果您可能想要将项目添加到已定义的列表中,则应将其作为参数 .

    如果你想支持两者,你可以这样做:

    def initList(fname, mylist = None):
        if mylist is None:
            mylist = []
        # process fname and build list
        return mylist
    

    这支持两者

    list_a = initList('someFile')
    

    list_a = []
    initList('someFile', list_a)
    

    请注意,您也可以这样做:

    list_a = []
    list_a.extend(initList('someFile'))
    
  • 0

    我认为这是完全主观的:)但由于你的函数被称为 initList ,因此在传递要初始化的列表时使用第二种方法是有意义的 .

  • 5

    我实际上认为最Pythonic的解决方案是将您的函数编写为生成器,将特定于包含数据类型的逻辑与生成元素的逻辑分开,并使客户端代码更加明确集合的类型(同时也更灵活) .

    总的来说,我认为人们应该尽可能地将数据结构视为不可变的 . 始终更清晰,更不容易出错 . 我能想到的可变列表方法的唯一理由是效率,在这种情况下a)生成器方法更合适b)你可能不应该用Python编写代码 .

相关问题