2016-11-30 9 views
0

ユーザーは入力として名前を挿入し、3語の名前に中間の名前が含まれているかどうかを確認して、はいまたはいいえ(またはその派生語のいずれか)で確認する必要があります。これまでのところ、回答が「はい」の場合はループが機能しています。しかし、回答が「いいえ」であれば、質問を繰り返しています。なぜこのループの2番目の部分は機能しませんか?

目的:答えが「はい」の場合、プログラムは中間の名前を持つ3語の名前を理解し、したがって中間の名前で名前の組み合わせを実行します。それがnoの場合、プログラムは中間名の代わりに2番目の姓を持つ3語の名前を理解し、それに応じて名前の組み合わせを実行します。

私は共有目的で多くのコードを除外しています。

私は間違っていますか?私の質問は、ループのelif部分に関するものです。

print ('enter name') 
providedname = input() 
while providedname != 'quit': 
    if len(providedname.split())==4: 
    pass 

    elif len(providedname.split())==3: 
    print ('Does the name include a middle name or middle initial? Please type yes or no:') 
    userinput = input() 

    if userinput.startswith ('ye' or 'Ye' or 'YE' or 'ya' or 'Ya' or 'YA'): 
     firstname, middlename, lastname = providedname.split() 

    elif userinput.startswith ('no' or 'No' or 'NO' or 'na' or 'Na' or 'NA'): 
     firstname, lastname, secondlastname = providedname.split() 

    else: 
     pass 

    print ('enter name or type quit or q to exit') 
    providedname=input() 
    continue 
+2

。また、スペースが1つだけインデントされているため、読みにくいです。 **実際に問題を再現する[mcve]を与えてください**。 – jonrsharpe

+0

ヒント: '{'ye'、 'ya'}のuserinput [:2] .lower()の場合: –

+0

ジョンさん、長いコードなので、私はそれを削除しなければなりませんでした。私は読みやすいようにインデントとして二重スペースを追加しました。私は3つの言葉の名前の入力をどのように分割するつもりかを追加しました。 – adriaanbd

答えて

0

だから、単に通訳

>>> 'ye' or 'Ye' or 'YE' or 'ya' or 'Ya' or 'YA' 
'ye' 

あなたstartswithでこれを実行しますあなたが思うように働いていません。

それ以外の場合は、文字列を小文字にすると、その文を短くすることができます。コードが構文的に有効でないことを

Runnableを例

while True: 
    providedname = input ('enter name or type quit or q to exit: ') 

    if providedname in {'quit', 'q'}: 
    break 

    names = providedname.split() 

    if len(names) == 4: 
    pass 
    elif len(names) == 3: 
    userinput = input('Does the name include a middle name or middle initial? Please type yes or no:') 

    if userinput[:2].lower() in {'ye', 'ya'}: 
     firstname, middlename, lastname = names 
    elif userinput[:2].lower() in {'no' , 'na'}: 
     firstname, lastname, secondlastname = names 
    else: 
     pass 

    print(firstname, lastname) 
+0

ありがとう、@ cricket_007、私は通訳を走らせて、 "or"と "startswith"を完全に誤解していたことに気付きました。あなたのソリューションは現実的なものです。 – adriaanbd

0

あなたはそれの残りの部分は複数のテキスト入力として採用されるように引き起こして、「あなたのELIF内部のプリントコマンドに(」名前が....含まれています)の終了が欠落しているかのように見えます。それを追加して、それが役立つかどうか確認してください!

+0

私はOPの実際のコードではなく、単に質問の誤植であると推測します。 –

+0

あなたはそうです、私は私のポストにそれを入力するのを忘れました、ありがとう。 – adriaanbd

0

名前が長さ= 4であるためスキップするより複雑な名前を持つことができます。「難しい名前」を無視すると、次はクリーンアップユーザの入力。私はユーザーの入力を次のようにきれいにします。

userinput = input().lower().strip() 

このようにすれば、あなた自身が簡単になり、読みやすくなります。

今、あなたが行うことができます(他の回答の状態として)最後に

if userinput == 'yes': 
    firstname, middlename, lastname = providedname.split() 
else: 
    firstname, lastname, secondlastname = providedname.split() 

を「有効」入力が与えられた場合、あなたはbreakとwhileループから抜け出すことになるでしょう。

+0

ありがとうございます@ David542、私はそれらを理解し、彼らに試してみるためにこれらのソリューションについてお読みになるつもりです。このプログラムを通して私はPythonを学んでいます。 – adriaanbd

0

あなたは決してwhileループを抜け出していません

まず(彼らはあなたの質問にちょうどここにあるが、あなたの実際のコードがOKであると仮定すると、すべての構文エラーを無視して)2つの主要な問題を持って、あなたが使用する必要があります。 breakステートメントは、ループを終了したい場所にします。

ループの最後にprovidednameを上書きすると、実際の名前が残ってしまいます。正しい名前が入力されても変数は終了します。

+0

ありがとう@Dalvenjia、私は実際にbreakステートメントの使用を実際に理解したことはありません。私はそれを試してみましょう。 – adriaanbd

1

このようなorは使用できません。英語では理にかなっていますが、Pythonでは動作しません。何をやっている表現する一つの方法は、any機能と一緒にミニforループであり、そのように:あなたは少し周り語順をシャッフルした場合

if any(userinput.startswith(string) for string in ['ye', 'Ye', 'YE', 'ya', 'Ya', 'YA']): 

それはほとんど英語のように読み取ります

ユーザ入力がこのリスト内の文字列のいずれかで始まる場合...

さらに良いことには、最初の入力文字列を小文字にあります。そうすれば、たくさんの組み合わせをチェックする必要はありません。

userinput = input().casefold() # Python 3.3+ 
userinput = input().lower()  # Earlier 

if any(userinput.startswith(string) for string in ['ye', 'ya']): 

このように、startswithは文字列のリストを受け入れることもできます。あなたは、実際にすべてのany()機械を捨てて、単に持つことができます(。おかげ@kindallにその先端のために)

if userinput.startswith(('ye', 'ya')): 

+0

'startswith()'は選択肢のタプルを取るので、ジェネレータ式は必要ありません。 'startswith((" "ye"、 "ya")) 'は後でやる。 – kindall

関連する問題