簡體   English   中英

如何返回值並且不中斷循環

[英]How to return value and don't break loop

我想創建一個工具,它將解析並從我的電子郵件中返回消息。 你可以在下面看到我的部分代碼。 這是非常簡單的部分,實際上代碼要大得多。 我在 '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

希望我對這個問題有足夠的理解,這可以幫助你。 根據您的最終設計,有兩種方法可以完成您的工作。

要么為每個項目調用所需的函數(在循環中):

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

或者您可以使用yield而不是 return 創建一個可以迭代的生成器。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM