0

ユーザーが「いいえ」と入力した場合、プログラムが for ループを通過しないようにするにはどうすればよいですか。ユーザーが「いいえ」と入力した場合、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')
4

5 に答える 5

3

フラグ変数を設定し、while ループから抜け出します。次に、for ループで、フラグが設定されているかどうかを確認してから、ブレークします。

PS:ループでない場合

于 2012-07-08T07:12:48.487 に答える
2

これを行う最も簡単な方法は、ユーザー入力を取得する関数を作成することです。

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')
于 2012-07-08T07:35:05.570 に答える
1

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')

途中で例外が発生することに注意してください。

于 2012-07-08T07:37:53.537 に答える
0

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')
于 2012-07-08T07:29:58.177 に答える
0

break行をスキップするときに無限ループと ing を使用する代わりに、ループ条件でフラグを使用して 3 つのケース (スキップ、削除、および無効な回答) を区別します。フラグを設定して、スキップの場合はループを終了し、削除の場合は中断し、無効な回答の場合はフラグをそのままにします。これにより、 (条件が false になったために が終了した場合にトリガーされる)のelse句を使用して、スキップ ケースを検出できます。そこから、次を使用してループの次の反復にジャンプすることができます(または、残りの行をすべてスキップします- 意図した質問からは明確ではありませんが、違いはキーワードの変更です):whilewhileforcontinuebreak

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.'
于 2012-07-08T07:37:50.040 に答える