2017-02-21 6 views
0
def errorCheck(daySales): 
    while True: 
    try: 
     daySales = float(daySales) 

    except ValueError: 
     print('Please only enter a number - for example: 7') 
     print('Try again!') 
    except Exception as err: 
     print('Unknown error - please contact the programmer!') 
     print(type(err)) 

    return(float(daySales))  

counter=0 
day = ['Monday','Tuesday','Wednesday','Thursday', 
     'Friday','Saturday','Sunday'] 
daySales=() 
sales=[] 
totalsales=[] 

for i in range(len(day)): 
    print('Enter sales for ' + day[i] + ': ', end="") 
    daySales = input() 
    errorCheck(daySales) 
    sales = sales + [float(daySales)] 

for i in range(len(day)): 
    print('\nYour sales for ' + day[i] + ' were: $', sales[i], end="") 

print('\nWhich equates to a weekly sales total of: $' ,end="") 
sumOfList = sum(sales) 
print(sumOfList) 

このスクリプトは、ユーザーが数字を入力した場合に実行しますが、例外が発生した場合はそれをキャッチしますが、次の手順に進みます。たとえば、月曜日の売上に「foobar」と入力すると、スクリプトは数字だけを入力するように指示しますが、次の入力は火曜日です。 ユーザが有効な番号を入力するまで、ループは 'day'にとどまることができますか?Python3のエラー処理ループ

+1

あなたは 'while'ループを持っていますが、入力/例外に関係なく' return'を行っています。例外がない場合にのみ 'return'したいと思っています。また、ループ内で 'input()'を取得したいとします。それ以外の場合、ユーザーはどのように別の値を入力できますか? –

答えて

1

直接答えは、whileループ内の入力/チェックシーケンスをラップすることです:

unchecked = True 
while unchecked: 
    daySales = input() 
    errorCheck(daySales) 

あなたのコードは、現在構成されている方法、errorCheckで戻りfloat(daySales)は、例外が発生されることを保証することに注目してください。

ここで、あなたのコードにある他の非常に奇妙なことに取り組んでみましょう。上から読む:

  1. errorCheckにwhileループがあります。 returnが含まれているため、複数回実行されることはありません。
  2. errorCheckに戻ると、以前にキャッチされ報告された例外がトリガーされます。これは、例外の場合にはNoneの戻り値に置き換えることができます。上記のループは、このチェックに依存することができます。
  3. counterは使用されません。どちらもtotalSalesです。
  4. inputは、printを引数として受け取ります。
  5. for i in range(len(day)):は、for d in day:で置き換えることができます。これは、day[i]がループ内でdになることを意味します。
  6. 同じフォームの2番目のループはfor d, s in zip(day, sales):に変わります。
  7. 文字列は、+を追加するのではなく、書式設定によって作成する方が適切です。ここで

クリーンアップコードは次のようになります。

def errorCheck(daySales): 
    try: 
     return float(daySales) 
    except ValueError: 
     print('Please only enter a number - for example: 7') 
     print('Try again!') 
    except Exception as err: 
     print('Unknown error - please contact the programmer!') 
     print(type(err)) 
    return None 

day = ['Monday','Tuesday','Wednesday','Thursday', 
     'Friday','Saturday','Sunday'] 
sales=[] 

for d in day: 
    daySales = None 
    while daySales is None: 
     daySales = input('Enter sales for {}:'.format(d)) 
     daySales = errorCheck(daySales) 
    sales.append(daySales) 

for d, s in zip(day, sales): 
    print('\nYour sales for {} were: ${}'.format(d, s)) 

sumOfList = sum(sales) 
print('\nWhich equates to a weekly sales total of: ${}'.format(sumOfList)) 
+0

ありがとう!これは本当に助けになりました。カウンターとトータルセールスは私がやろうとしていたものから残されていました。私はちょうどPythonを学び始めているので、あなたが使ったことのいくつかはまだ説明していませんが、forループのwhileループの中にエラーチェックを入れることについてのポイントがあります。 –

+0

これを使って周りを回って、これは私がそれをやろうとしていたやり方よりもはるかに理にかなっています。この機能はかなりクールな機能です! –

+0

それはあなたのために働いてうれしい。練習を続ける –

-1

else文であなたのreturn(float(daySales))を入れてください。したがって、tryが成功した場合にのみ実行されます。

+0

本当のステートメントですが、回答に近い質問はありません。これはコメントでなければなりません。 –

+0

@MadPhysicist私はコメントとしてそれを投稿するために、当時の評判を持っていなかった、それについて申し訳ありません。 – jarcobi889