Python 这是什么;对于[…]中的“i”;循环代码是什么?

Python 这是什么;对于[…]中的“i”;循环代码是什么?,python,Python,我是python新手,谁能解释一下下面的语法 for i in [line.split('"') for line in open('a.txt')]: ...... ...... ...... 试着在如下部分运行块。打开文件a.txt,逐行读取 对于文件中的每一行,该行在“字符-->上拆分,我们称之为这些标记。 缩进块中的代码行可能以某种方式使

我是python新手,谁能解释一下下面的语法

               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
h"ijk"lmno"p
q
…程序将返回令牌:

ab
cdef
g\n
h
ijk
lmno
p\n
q\n

在这样一个难以理解的表达式中塞进这样一个简单的概念,实在没有什么好的理由。

好吧,首先,如果你用一个文件
a.txt
运行代码,你会得到什么

“这”,是一个“测试”
我们又“走”了
“引用行”
没有报价

['''This','是一个','测试','\n']
[“我们来了”,“又来了”\n']
['','引用行','\n']
['没有引号?\n']

因此,您将获得每行的列表,其中行列表由字符串内容除以引号
字符组成

因此,请尝试运行以下命令:

for line in open('a.txt'):
    print line
因此,它将迭代文件a.txt的行,该文件已通过open调用

for line in open("a.txt"):
    line_parts = [line.split('"') for line in open('a.txt')]
    print line_parts
第二行被称为a,它将在文件的每一行上运行split方法


所以,现在你看到了这些的输出,你有希望看到它为什么在做,它在做什么。让我知道这是否有意义。我喝了几杯:)

它将逐行读取文件“a.txt”,并使用分隔符“”对其进行拆分。拆分将生成一个列表。一旦读取完成,拆分结果将分配给“I”,即列表列表

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 例子: “个人防火墙”软件可能会警告连接空闲 个人防火墙“软件”可能会警告连接空闲 个人“防火墙”软件可能会警告“连接空闲” 输出: ['Personal firewall','software may Warning on the connection IDLE\n']['Personal firewall','software','may Warning on the connection IDLE\n']['Personal','firewall','software may Warning on 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()将获取文本文件的内容。 For line in open()捕获返回,并对其进行迭代,为每次迭代提供一行文件,这基本上就是示例的“x in originalList”部分

在列表理解中,迭代器的内容是一个字符串,有一个split方法,在那里使用

在方括号之间的那一段的末尾,有一个元素列表(来自split),这些元素最初以“.”分隔,每个元素都是列表中由列表创建的条目


然后,该列表理解的结果在“for i in[]”中再次迭代

将极为糟糕的
i
更改为
字段
,原始代码相当于:

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
h"ijk"lmno"p
q
那么我的“价值观”将是

['ab', 'cdef', 'g\n']
['h', 'ijk', 'lmno', 'p\n']
['q\n']

旁白:用引号分隔字段是很不寻常的,不是吗?

这不太正确。它将返回
[“ab”,“cdef”,“g”[“h”,…]…
…而且,重要的是,它将把整个文件读入内存,而不是一次只读一行。不要这样做。@John Machin:我已经添加了换行符,谢谢你指出了这一点out@JohnMachin:在这里,我还使用了令牌的概念,我知道它是在一个二维数据结构中;我为simplic将其展平ity-如果您只关心块中
i
的值,这就足够了。@bguiz:您需要修复“用换行符或引号字符分隔”。“为简单起见而展平”是错误的。