【问题标题】:write better code instead of 2 for loops编写更好的代码而不是 2 个 for 循环
【发布时间】:2012-04-26 11:13:48
【问题描述】:

我有 2 个 for 循环,我想让它变得更好,比如列表理解或 lambda 或其他。 我怎样才能达到同样的效果?

例如:

filename = ['a.txt', 'b.txt', 'c.txt']
for files in filename:
    for f in glob.glob(os.path.join(source_path, files)):
        print f
        ... some processing...

【问题讨论】:

  • 我建议首先确保您确实需要它。例如,谷歌 Python 风格指南建议你的代码很好(这里是关于 list comprehensions 的部分,下面是 lambda 函数)。

标签: python list for-loop


【解决方案1】:

您的代码完全没有问题。您只能通过引入不必要的复杂结构来使其不那么易读。

【讨论】:

  • @thebjom:你能解释一下哪些不必要的复杂结构吗?
  • 列表推导和 lambdas 都不会提高代码的清晰度,因此它们只会增加复杂性。当然,在某些情况下,他们可以让事情变得更清楚,但这不是那种情况。
  • +1。而且,Pythonic == 英语。有时您别无选择,只能使用 2、3 甚至 4 个嵌套循环来编写,因为很难使用理解或 lambda。样式问题可能会让您永远调试和编写文档。
  • @CppLearner 我不同意 4 个嵌套循环,通常如果你发现自己需要 4 个嵌套循环,这是一个引入函数和重构的好地方。但是,在这种情况下使用 2 个嵌套循环似乎非常好。
【解决方案2】:

您可以将两个for 循环压缩成一个generator expression*,并使用一个新的for 循环从中提取文件名。

for f in (f_ for files in filename
             for f_ in glob.glob(os.path.join(source_path, files))):
    print f
    # ...

正如另一个答案所说,这不是更好,这是更糟而你 不应该使用它(我不确定这是否足够强调!)。很难理解发生了什么,并且可能几乎没有性能优势(事实上,额外的间接层意味着它可能会更慢)。

(* 基本上等同于列表推导,但在这种情况下更好。)

【讨论】:

    【解决方案3】:

    当您必须向右扫描并向后四舍五入时,难以阅读长表达式。当有许多局部变量、lambdas 和 comprehensions 时,情况更糟,只是用括号和逗号分隔,只有几行。仅当您的代码不会变得更长和更复杂时才使用它们。
    对于你的情况,我更喜欢提取find 作为权衡。但正如最佳答案所说,您的代码已经足够好了。

    from itertools import chain
    
    find = lambda p: glob.glob(os.path.join(source_path, p))
    for file in chain(map(find, filename)):
        """
        =) I like one-level indentation here.
        =( I don't know which file pattern is used currently,
           unless I use longer expression...
        """
    

    【讨论】:

      【解决方案4】:

      我会像下面那样做。原因是现在您可以将搜索模式的形成、搜索和文件处理分开。如果它们不相关,则更容易扩展。

      如果您的系统有点奇特(例如分布式网络驱动器),则带有 glob 和 os.path.join 的行是一条讨厌的行。虽然正如其他人提到的,两个循环是完全可以的。

      filename = ['a.txt', 'b.txt', 'c.txt']
      
      searchPatterns = [os.path.join(source_path, files) for files in filename]
      
      searchResults = [glob.glob(pattern) for pattern in searchPatterns]
      
      fileListFlat = sum(searchResults,[])
      
      for file in fileListFlat:
          print file
      

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        相关资源
        最近更新 更多