<p>这里有很多概念上的问题。为了实际教学,我已经彻底地复习了代码:</p>
<ul>
<li><p>在一个无条件的<code>return</code>之后的<code>print</code>无法访问;我想您已经将这些用于调试,但是将它们保留在周围没有任何意义。(我假设<code>print li</code>来自<code>dir</code>的<code>print li</code>也不需要。)</p></li>
<li><p>函数名应该能更好地指示函数的实际功能。<code>open_file</code>是一个无用的名称,因为函数实际上对文件的内容做了一些事情。</p></li>
<li><p>同样,变量名也应该表示变量内容的含义。如果你找不到一个好名字,那说明这个变量是不必要的。另一个标志是存储一次值,然后使用一次;这里涉及变量的唯一原因是分解一个表达式并给某个对象起一个名称,但是这里的表达式很简单,没有好的名称。所以只要写出一个表达式。</p></li>
<li><p>你大概想把目录列表写成一个行列表,所以用新行连接它们,而不是逗号。</p></li>
<li><p>有比读取整个文件并拆分结果字符串更简单的方法来获取文件中的行列表。他们通常也会更有效率。实际上,您不需要构造列表,然后从列表构建集合;您可以直接创建集合。</p></li>
<li><p><code>open_file</code>和{<cd7>}执行相同的任务,因此是冗余的。只需传入一个文件名并使用它。</p></li>
<li><p>尝试将功能的职责划分为逻辑块。特别是,不要在进行计算的同一位置处理I/O。</p></li>
<li><p>在现代Python中,我们使用<code>with</code>块来处理完成后自动关闭文件。</p></li>
<li><p><code>os.listdir</code>已经创建了一个列表,因此没有理由进行循环以将列表项附加到另一个列表中。例如,您可以使用<code>+</code>一次附加整个内容;但是您的明显意图是附加到一个空列表中,所以您可以直接赋值。实际上,不需要全局变量或赋值,所以我们直接使用<code>os.listdir</code>结果。</p></li>
</ul>
<p>你的程序可以这么简单:</p>
<pre><code>import os
def make_dirfile(directory):
with open('temp.txt', 'w') as dirfile:
dirfile.write('\n'.join(os.listdir(directory)))
def unique_lines_of(filename):
with open(filename) as input_file:
return set(input_file)
make_dirfile(raw_input("Enter directory > "))
print unique_lines_of('temp.txt') & unique_lines_of('t.txt')
</code></pre>
<p>(这假设创建目录文件实际上是一项要求…)</p>