这个python for循环中的三重下划线有什么意义吗?

时间:2017-03-24 12:04:55

标签: python python-3.x naming-conventions

Python中的三重下划线是否有任何意义?

这是一个用于获取目录中所有.txt个文件的脚本。

for ___,___,files in os.walk(some_folder):
    files[:]=[x for x in files if x.lower().endswith('txt')]
    for file in files:

在这里阅读其他问题单个下划线通常用于丢弃变量,这是使用三重下划线只是不好的做法还是有意义呢?

2 个答案:

答案 0 :(得分:5)

单,双,三,一般来说,脚本中任何数量的下划线名称都隐含地表示该值不会被使用(事实上它没有使用任何字母给出“名称”表示这个) 。

当然,这不是一成不变的(也就是说,Python不会像___那样对待foo,而是一个常规程序员通常理解和尊重的。

单个下划线仅在交互模式下有用,它是脚本中使用的而不是_____。使用_____只是看起来丑陋而且完全不必要;我不明白为什么有人决定在_上使用它;当您需要传递相同的消息时,请不要复制它们并选择_

答案 1 :(得分:3)

就像Jim所说,___语法通常意味着该名称所捕获的内容(___)不是有用的,或者是垃圾。为了完整起见,请查看以下示例:

我有一个文件夹test,其结构如下:

test
    subtest1
        file1.txt
        file2.txt
    subtest2
        file3.txt

看看我在os.walk上使用test时会发生什么:

>>> list(os.walk('test'))
[('test', ['subtest1', 'subtest2'], ['.DS_Store']), ('test/subtest1', [], ['file1.txt', 'file2.txt']), ('test/subtest2', [], ['file3.txt'])]
>>> len(list(os.walk('test')))
3

因此技术上在os.walk('test')返回的生成器中有三个元素。但是,每个元素中有多少个元素,因为我们清楚地看到了一些嵌套的数据结构?

>>> [len(x) for x in os.walk('test')]
[3, 3, 3]

好的,os.walk('test')的每个元素中有三个子元素。例如,在list(os.walk('test'))[0],有'test'(第一个元素),['subtest1', 'subtest2'](第二个元素)和['.DS_Store'](第三个也是最后一个元素)。最后一个元素包含由第一个元素表示的任何文件夹中的非目录文件(因此.DS_Store是test目录中的文件)。

让我们进入你的for循环,然后(我还没有使用下划线):

>>> for main_dir, sub_dirs, files in os.walk('test'):
...         print("Main directory: ", main_dir)
...         print("Sub-directories: ", ', '.join(sub_dirs))
...         print("Files: ", ', '.join(files))
... 
Main directory:  test
Sub-directories:  subtest1, subtest2
Files:  .DS_Store
Main directory:  test/subtest1
Sub-directories:  
Files:  file1.txt, file2.txt
Main directory:  test/subtest2
Sub-directories:  
Files:  file3.txt

所以for main_dir, sub_dirs, files in os.walk('test')语法就是我们所说的"解包。"我们将main_dir中的第一个元素分配给os.walk('test'),将第二个元素分配给sub_dirs等。___语法(实际上应该只是_) ,对读者说,"忘记这些价值观;我已经命名了我需要的那些。"在你的情况下,代码说,"忘记这些文件来自的目录;我只想要文件名。"