我是新来的蟒蛇,任何人可以请解释下面的语法,这对于“我在”[...]“循环代码中有什么作用?
for i in [line.split('"') for line in open('a.txt')]:
......
......
......
我是新来的蟒蛇,任何人可以请解释下面的语法,这对于“我在”[...]“循环代码中有什么作用?
for i in [line.split('"') for line in open('a.txt')]:
......
......
......
文件a.txt
打开和读取线
线对于从文件中的每一行,行分裂的"
字符 - >我们会打电话给这些令牌。
在缩进块的代码行可能使用这些令牌不知何故
概括地说,将TIS一个文件的内容解析成与任一新行字符或引号字符分隔令牌。
如果输入文件是:
ab"cdef"g
h"ijk"lmno"p
q
..程序都将将返回令牌:
ab
cdef
g\n
h
ijk
lmno
p\n
q\n
afile = open('a.txt')
for line in afile:
for field in line.split('"'):
# do something
真的是不拥挤这样一个简单的多好的理由在这样一个难以阅读的表达中的概念。
感谢您的解释 – Rajeev 2010-06-23 05:23:10
嗯,首先,做,如果你有一个文件a.txt
为运行代码,你会得到什么说:
“本”,是一个“测试”
在这里,我们“GO”再次
“援引行“
并没有引号?
[ '', '这', '是一个', '测试', '\ n']
[ '在这里,我们', 'GO', '再次的\ n']
[ '' ,''Quoted Line','\ n']
['且没有引号?\ n']
因此,您将得到每行的列表,其中行列表包含字符串划分的内容由报价"
字符。
因此,尝试运行这些:
for line in open('a.txt'):
print line
因此,它会遍历文件a.txt中,这被称为开放的线路。
for line in open("a.txt"):
line_parts = [line.split('"') for line in open('a.txt')]
print line_parts
即第二行是什么被称为一个List Comprehension和将运行在所述文件的每行分裂的方法。
所以,现在你看到了这些输出,你可以希望看到它为什么在做什么。让我知道这是否有道理。我有几杯饮料:)
它会逐行读取文件'a.txt',并使用分隔符'''进行分割,分割会产生一个列表,一旦读取结果分裂被分配给'我'即列表的列表。
Example: Personal firewall "software may warn about the connection IDLE Personal firewall "software" may warn about the connection IDLE Personal "firewall" "software may warn about the" connection IDLE
Output: ['Personal firewall ', 'software may warn about the connection IDLE\n'] ['Personal firewall ', 'software', ' may warn about the connection IDLE\n'] ['Personal ', 'firewall', ' ', 'software may warn about the', ' connection IDLE\n']
除了是否是混淆或不主观判断,要了解它,你需要查找列表理解Python中,并用那里的功能。
列表理解是一种创建列表的方式,既可以提高性能又可以提高字符占用空间,但代价是可读性。
IE:你有一个列表[1,2,3],你想一个包含相同的元素与1添加到每个,你可以不喜欢
originalList = [1,2,3,4]
newList = [x+1 for x in originalList]
print newList
这会变得更加有趣(偶尔不可读)当你引入lambdas和多维度时。
考虑到这一点,为了解开这行代码,你必须向后看。 open()会在这种情况下得到文本文件的内容。 因此,对于open()中的行来说,它会捕获返回值并对其进行迭代,从而为每次迭代提供一行文件,这就是示例中的“x in originalList”部分。
你的迭代器的内容在列表理解中是一个字符串,它有一个split方法,在那里使用它。
在方括号之间的段的末尾,您有一个由'''分隔的元素列表(来自split),它们中的每一个都是由列表理解创建的列表中的条目。 。
该列表理解的结果,然后再迭代,在“为我在[]”
改变极其严重命名i
到fields
后,原来的代码就相当于:
file_handle = open('a.txt') # open the file
for line in file_handle: # iterate over lines in the file
fields = line.split('"') # split line into fields
# === End of equivalent code ===
# Now do something with fields, for example:
for field in fields:
# Now do something with field
以原始代码的方式使用列表理解是混淆的和效率低下。如上面的等效代码所示,根本不需要列表理解。原始代码构建了一个临时列表,该列表立即迭代并最终丢弃,可能在长时间占用大量内存之后。
注意:目前接受的答案不正确。 (1)原始代码一次不会产生字段/标记;每个i
将指代列表的字段(2)字段不是被换行符分隔;实际上每一行的最后一个字段(除了最后一行)都包含换行符。见下文。
如果输入文件是:
ab"cdef"g
h"ijk"lmno"p
q
那么我的“价值”将是
['ab', 'cdef', 'g\n']
['h', 'ijk', 'lmno', 'p\n']
['q\n']
旁白:用双引号分隔的有田是相当不寻常的,不是吗?
感谢您的解释 – Rajeev 2010-06-23 05:21:57
这是不完全正确的。它会返回'[“ab”,“cdef”,“g”] [“h”,...] ...' – cobbal 2010-06-23 05:39:01
......重要的是,它会将整个文件读入内存而不是读取一次一行。不要这样做。 – 2010-06-23 06:10:18