【问题标题】:Can I turn these two almost identical functions into one in python?我可以在python中将这两个几乎相同的函数合二为一吗?
【发布时间】:2020-01-10 16:37:52
【问题描述】:

除了 search_genre 中的 if 语句之外,我有这两个函数几乎相同,有什么方法可以将它们合并为一个吗?

books 变量是一个字典,其中每个值都是一个字典列表,即:

books = {'Genre1':[{name:value, author:value}, {dict}], 'Genre2':[{dict}], 等等}

view_library() 打印所有书籍和 search_genre() 接受用户输入来打印特定类型的所有书籍

def view_library():
    for genre in books:
        print(f'Genre: {genre}')
        for book in books[genre]:
            for key, value in book.items():
                print(f"{key.title()} : {value.title()}")
            print()


def search_genre(genre_type):
    for genre in books:
        if genre_type == genre:
            print(f'{genre_type}:')
            for book in books[genre_type]:
                for key, value in book.items():
                    print(f"{key.title()} : {value.title()}")
                print()

【问题讨论】:

    标签: python function if-statement


    【解决方案1】:

    试试:

    def search_genre(genre_type=None):
        for genre in books:
            if genre_type is None or genre_type == genre:
                print(f'{genre_type}:')
                for book in books[genre_type]:
                    for key, value in book.items():
                        print(f"{key.title()} : {value.title()}")
                    print()
    

    【讨论】:

      【解决方案2】:

      这两个函数的区别在于,第一个函数处理所有的流派,而第二个函数只处理选择的on。

      关键是if 语句,它确定是否打印流派:现在,只有当流派与提供的流派匹配时才会触发。我们可以添加一个or,这样如果没有提供genre_type,它会触发。现在,如果我们在没有 genre_type 参数的情况下调用该函数,它将打印所有流派:

      def search_genre(genre_type=None):
          for genre in books:
              if not genre_type or genre_type == genre:
                  print(f'{genre_type}:')
                  for book in books[genre_type]:
                      for key, value in book.items():
                          print(f"{key.title()} : {value.title()}")
                      print()
      

      由于您没有提供数据的 MCVE,因此这里有一个简化的示例,其中包含数据来展示其工作原理:

      def test(x=None):
          for y in z:
              if not x or x == y:
                  print(y)
      
      z = [1,2,3,4,5,6]
      
      test()
      1
      2
      3
      4
      5
      6
      
      test(5)
      5
      

      【讨论】:

        【解决方案3】:

        首先使用过滤器实现filter_by_genre。和search_genre基本一样。

        def filter_by_genre(genre_type):
            for genre in filter(lambda x: x == genre_type, books):
                print(f'{genre_type}:')
                for book in books[genre]:
                    for key, value in book.items():
                        print(f"{key.title()} : {value.title()}")
                    print()
        
        filter_by_genre("mystery")
        

        现在,不要将流派作为参数传递,而是传递谓词:

        def filter_by_genre(p):
            for genre in filter(p, books):
                print(f'{genre_type}:')
                for book in books[genre]:
                    for key, value in book.items():
                        print(f"{key.title()} : {value.title()}")
                    print()
        
        filter_by_genre(lambda x: x == "mystery")
        

        然后view_librarysearch_genre 都可以用filter_by_genre 来实现:

        def view_library():
            return filter_by_genre(lambda x: True)
        
        
        def search_genre(genre_type):
            return filter_by_genre(lambda x: x == genre_type)
        

        【讨论】:

          猜你喜欢
          • 2017-01-06
          • 2022-06-27
          • 2013-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 1970-01-01
          • 2021-10-11
          相关资源
          最近更新 更多