如何返回值并且不要中断循环

时间:2018-02-09 09:04:05

标签: python python-2.7 loops recursion return

我想创建工具,它将解析并返回来自我的电子邮件的消息。您可以在下面看到我的部分代码。这是非常简单的部分,实际上代码要大得多。我在'for'循环中至少有2次迭代,我想返回每个操作结果,但是返回会中断循环。我可以将结果添加到列表中,但我只需要字符串,而不是列表。对我来说最好的方法是返回结果并继续循环,但这是不可能的。也许我需要定义新函数或使用lambda函数并递归获取结果?之前我没有使用过递归。 另外我知道这可以使用'yield',但是如何从生成器返回值呢?

def a(request_url):
output = getImap(request_url)

def getImap(request_url):
    #many code before.....
    mail = imaplib.IMAP4_SSL(output['hostname'], port=output['port'])
    typ, data = mail.fetch(output['parameter']['uid'], 'RFC822')
    msg = email.message_from_string(data[0][1])
    for part in msg.walk():
        res = part.get_payload(decode=True)
        return res

def AcceptDef(res):
    print res

1 个答案:

答案 0 :(得分:1)

希望我能够理解这个问题,这可以帮到你。根据您的最终设计,有两种方法可以解决您的尝试。

要么为每个项目调用所需的功能(在循环中):

for part in msg.walk():
    res = part.get_payload(decode=True)
    AcceptDef(res)

或者你可以yield而不是返回创建一个可以迭代的生成器。

def walker(amount):  # stands in for getting wanted items.
    for item in range(amount):
        yield item

def printer(text):   # stands in for your action
    print(text)

for i in walker(5):  # iterate over all items ...
    printer(i)       # ... calling a corresponding action

编辑:正如评论中指出的tobias_k。如果您需要对不同的迭代执行不同的操作,但仍然希望在循环内执行此操作,您当然可以将其作为参数传递并相应地执行。一个例子:

def rinseandrepeat(amount, fce):
    for item in range(amount):
        fce(item)

def printer1(text):
    print('P1:', text)

def printer2(text):
    print('P2:', text)

rinseandrepeat(2, printer1)  # calls printer1() for each item
rinseandrepeat(2, printer2)  # calls printer2() for each item