簡體   English   中英

如何結束while循環並跳過for循環?

[英]How can I end while loop and skip for loop?

如果用戶輸入“ no”,該怎么辦?程序也不會通過for循環。 如果用戶輸入“ no”,我不希望它發送到tmpfile.write(line)。

def remove():
    coname = raw_input('What company do you want to remove? ') # company name
    f = open('codilist.txt')
    tmpfile = open('codilist.tmp', 'w')
    for line in f:
        if coname.upper() in line:
            while True:
                answer = raw_input('Are you sure you want to remove ' + line.upper() + '?')
                if answer == 'yes':
                    print line.upper() + '...has been removed.'               
                elif answer == 'no':
                    break  # HERE IS WHERE I NEED HELP
                else:
                    print 'Please choose yes or no.'                   
        else:
            tmpfile.write(line)
    else:
        print 'Company name is not listed.'
    f.close()
    tmpfile.close()
    os.rename('codilist.tmp', 'codilist.txt')

設置一個標志變量,然后退出while循環。 然后在for循環中,檢查標志是否已設置,然后中斷。

PS:如果不是循環

最簡單的方法是創建一個獲取用戶輸入的函數:

def get_yes_or_no(message):
    while True:
        user_in = raw_input(message).lower()
        if user_in in ("yes", "no"):
            return user_in

並像這樣修改您的原始功能:

def remove():
    coname = raw_input('What company do you want to remove? ') # company name
    f = open('codilist.txt')
    tmpfile = open('codilist.tmp', 'w')
    for line in f:
        if coname.upper() in line:
            answer = get_yes_or_no('Are you sure you want to remove ' + line.upper() + '?')
            #answer logic goes here              
        else:
            tmpfile.write(line)
    else:
        print 'Company name is not listed.'
    f.close()
    tmpfile.close()
    os.rename('codilist.tmp', 'codilist.txt')

Python有例外,您可以使用它來代替GOTO類型的構造。

class Breakout(Exception):
    pass

def remove():
    coname = raw_input('What company do you want to remove? ') # company name
    f = open('codilist.txt')
    tmpfile = open('codilist.tmp', 'w')
    try:
        for line in f:
            if coname.upper() in line:
                while True:
                    answer = raw_input('Are you sure you want to remove ' + line.upper() + '?')
                    if answer == 'yes':
                        print line.upper() + '...has been removed.'
                    elif answer == 'no':
                        raise Breakout()
                    else:
                        print 'Please choose yes or no.'
            else:
                tmpfile.write(line)
        else:
            print 'Company name is not listed.'
    except Breakout:
        pass

    f.close()
    tmpfile.close()
    os.rename('codilist.tmp', 'codilist.txt')

注意中間的異常位置。

您必須將整個for循環放入函數中,並使用return退出該函數:

def find_and_remove(f,coname,tmpfile):
    for line in f:
        if coname.upper() in line:
            while True:
                answer = raw_input('Are you sure you want to remove ' + line.upper() + '?')
                if answer == 'yes':
                    print line.upper() + '...has been removed.'               
                elif answer == 'no':
                    return  # HERE IS WHERE I NEED HELP
                else:
                    print 'Please choose yes or no.'                   
        else:
            tmpfile.write(line)
    else:
        print 'Company name is not listed.'

def remove():
    coname = raw_input('What company do you want to remove? ') # company name
    f = open('codilist.txt')
    tmpfile = open('codilist.tmp', 'w')
    find_and_remove(f,coname,tmpfile)
    f.close()
    tmpfile.close()
    os.rename('codilist.tmp', 'codilist.txt')

跳過循環時,可以使用循環條件中的標志來區分這三種情況(跳過,刪除和無效答案),而不是使用無限循環和break 您可以將標志設置為在跳過情況下退出循環,在刪除情況下中斷,而在無效答案情況下將標志保持原樣。 這使您可以使用whileelse子句(如果因為條件變為假while退出while觸發)來檢測跳過情況。 從那里,您可以使用continue跳到for循環的下一個迭代(或使用break跳過所有其余行-從您想要的問題中並不清楚,但是區別是關鍵字change) :

for line in f:
    if coname.upper() in line:
        answered = False
        while not answered:
            answer = raw_input('Are you sure you want to remove ' + line.upper() + '?')
            if answer == 'yes':
                print line.upper() + '...has been removed.'
                break
            elif answer == 'no':
                answered = True  # HERE IS WHERE I NEED HELP
            else:
                print 'Please choose yes or no.'
        else:
            continue
    else:
        tmpfile.write(line)
else:
    print 'Company name is not listed.'

暫無
暫無

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

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