Python中的三重下划线是否有任何意义?
这是一个用于获取目录中所有.txt
个文件的脚本。
for ___,___,files in os.walk(some_folder):
files[:]=[x for x in files if x.lower().endswith('txt')]
for file in files:
在这里阅读其他问题单个下划线通常用于丢弃变量,这是使用三重下划线只是不好的做法还是有意义呢?
答案 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
等。___
语法(实际上应该只是_
) ,对读者说,"忘记这些价值观;我已经命名了我需要的那些。"在你的情况下,代码说,"忘记这些文件来自的目录;我只想要文件名。"