我正在阅读一些像这样的Python代码:
import glob
from os.path import *
...
files = glob.glob(prefix + '*') # list out pwd according to some @prefix
res = [f + ['', '/'][isdir(f)] for f in files] # append a `/` to fold
但我们可以更明确地进行追加:
res = [f + '/' for f in files if isdir(f)]
是第二个impl更多 pythonic ?或哪一个更有效?
无论如何,在提出问题之后,我知道原始的impl:
对于
的返回值附加'/'或''f
中的每个files
,如果if
是目录,那么isdir
将返回True
,并且是'/'的索引第一个列表,或False
和f
不附加任何内容,f
将根据isdir
恕我直言,我认为最初的impl乍一看让新手对[][]
感到困惑。
答案 0 :(得分:2)
如评论中所述,第二种实施方式并不等同。如果谓词为false,那么理解的[,if <filter>]
语法会过滤掉所有所包含的元素。
更易读的构造可能是
[f + '/' if isdir(f) else f for f in files]
利用conditional expression代替[a,b][some_boolean]
残障。
答案 1 :(得分:1)
您提供的两段代码不执行相同的任务。第一个列出所有匹配的对象,并将/
附加到目录。第二个列出了作为目录的所有匹配对象,所有这些对象都附加了/
。
所以这是一个不合理的事情。在执行不同的任务时,询问哪个更具Pythonic或更高效是没有意义的。
时
['', '/'][isdir(f)]
Python化?我不确定。在某些人看来,它可能是。我个人觉得很难读。在这个细节层面,很大程度上取决于个人选择。有些人会像这样写代码,有些则不会。你应该遵循自己的直觉。