如何从该循环之外的for循环中获得结果?

时间:2014-11-28 17:14:39

标签: python loops for-loop

我有这样的事情:

for line in handle:
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    if words[0] != 'From' : continue
    email=words[1]
    print email

我希望电子邮件结果也可以在for循环之外使用。怎么样?

3 个答案:

答案 0 :(得分:3)

你很幸运,python范围是最好的,你会发现电子邮件在for循环范围之外可用,因为python范围规则规定如下:

引自Rizwan Kassim's answer

  

LEGB规则。

     

L。本地。 (在函数(def或lambda)中以任何方式分配的名称),并且未在该函数中声明为全局。

     

E。封闭功能本地人。 (任何和所有封闭函数(def或lambda)的局部范围中的名称,从内到外形成。

     

G。全球(模块)。在模块文件的顶级分配的名称,或在文件中的def中声明为全局的名称。

     

B。内置(Python)。在内置名称模块中预先指定的名称:open,range,SyntaxError,...

其中for关键字不是任何成员。在for循环中声明的任何变量都将作用于其最外层范围。在这种情况下封闭功能。

def some_func():
    for line in handle:
        line = line.rstrip()
        if not line.startswith('From') : continue
        words = line.split()
        if words[0] != 'From' : continue
        email=words[1]

    print email

将打印电子邮件的价值。

答案 1 :(得分:0)

如果您想存储所有电子邮件并在循环外访问所有电子邮件,请考虑使用以下列表:

emailsList = []
for line in handle:
    line = line.rstrip()
    if not line.startswith('From') : continue
    words = line.split()
    if words[0] != 'From' : continue
    email=words[1]
    print email
    emailsList.append (email)
print emailsList

并按索引访问列表的每个元素,如:

print emailsList [0]

答案 2 :(得分:0)

Mike McMahon的回答是正确的,分配给email变量的值将在循环外可用。但是,他所展示的功能相当脆弱。如果您的文件没有以"From"开头的任何行,则永远不会分配该变量,并且在您尝试打印时会出现异常。此外,如果多行符合条件(例如以"From"开头),您将只看到最后一行。如果你想要第一个,你需要改变一切。

这是一个更好的结构:

emails = []
for line in handle:
    line = line.rstrip()
    if line.startswith('From'):
        words = line.split()
        if words[0] == 'From':
            emails.append(words[1])

我发现嵌套的if块比重复的continue语句更容易理解,尽管这是一种风格选择。此版本列出了它找到的所有值。该列表可能为空(如果没有以From开头的行,或者它可能有一个或多个结果。

如果你只想要第一个结果,而没有找到任何错误,这是另一种方法:

for line in handle:
    line = line.rstrip()
    if line.startswith('From'):
        words = line.split()
        if words[0] == 'From':
            emails = words[1]
            break
else:
    raise ValueError("No 'From' line found!")

# you can use the email variable here!

仅当循环运行完成时,才会运行附加到else循环的for块。如果在循环体中命中break语句,则将跳过else块。它在这样的情况下非常有用,在这种情况下,你正在寻找第一个匹配,而没有找到一个是错误。