我有这样的事情:
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
循环之外使用。怎么样?
答案 0 :(得分:3)
你很幸运,python范围是最好的,你会发现电子邮件在for循环范围之外可用,因为python范围规则规定如下:
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
块。它在这样的情况下非常有用,在这种情况下,你正在寻找第一个匹配,而没有找到一个是错误。