Python:プログラマー思考

同じ問題をいくつかの方法で解決する方法に関する短い記事。 Pythonおよびプログラミングの初心者向けに設計されています。


例として、単純なケース-任意の操作の確認ダイアログの実装を取り上げます。 プログラムはユーザーに質問 ? [/ (Y/n)]: ? [/ (Y/n)]: 8つの有効な値( YyNn )のいずれかを入力することにより、応答します。


メソッド番号1

最初に頭に浮かぶのは、次のように各条件の一致の検証を実装することです。


  #!/usr/bin/env python # -*- coding: utf-8 -*- def are_you_sure1(): while True: print(" ? [/ (Y/n)]: ") response = input() if response == "" or response == "": print(" : {}".format(response)) elif response == "Y" or response == "y": print(" : {}".format(response)) elif response == "" or response == "": print(" : {}".format(response)) elif response == "N" or response == "n": print(" : {}".format(response)) else: print("  : {}".format(response) are_you_sure1() 

8個のif/elifブロックすべてをペイントすることができましたが、簡潔にするために、可能な値の各ペアに対して論理演算子or (OR)が使用されます。


この決定には何の問題もありません。それは正しいことであり、「単純であるほど良い」という原則をよく特徴付けています。 これは、ほとんどの初心者のpythonistsが来る決定です。


ただし、プログラマーは入力文字数を削減しようとするため、これは「繰り返し禁止」の原則と矛盾します。


メソッド番号2

2番目の方法は、余分なエンティティをカットすることです( OccamのRazor )。 プログラムの質問に応答してキャラクターがどのレジスターに入力されるかは重要ではありません。 したがって、文字列メソッドupper()またはlower()を使用して、文字を大文字または小文字にキャストします。


  #!/usr/bin/env python # -*- coding: utf-8 -*- def are_you_sure2(): while True: print(" ? [/ (Y/n)]: ") #  ,    #      response = input().upper() if response == "" or response == "Y": print(" : {}".format(response)) elif response == "" or response == "N": print(" : {}".format(response)) else: print("  : {}".format(response)) are_you_sure2() 

ユーザーが入力した値はすぐに1つのレジスターに変換され、チェックされます。 結果として-入力文字の数を減らし、コードのブロックを繰り返します。


メソッド番号3

別の方法は、入力された値が有効な値のリストにあるかどうかを確認することです。


  #!/usr/bin/env python # -*- coding: utf-8 -*- def are_you_sure3(): while True: print(" ? [/ (Y/n)]: ") response = input() if response in ["", "", "Y", "y"]: print(" : {}".format(response)) elif response in ["", "", "N", "n"]: print(" : {}".format(response)) else: print("  : {}".format(response)) are_you_sure3() 

検証はin演算子を使用して実行されます。 代替思考の例。


メソッド番号4

別の考え方の別の例は、正規表現の使用です。 これを行うには、 re式とre.match()メソッドを操作するための標準モジュールを使用します。


  #!/usr/bin/env python # -*- coding: utf-8 -*- import re #        def are_you_sure4(): while True: print(" ? [/ (Y/n)]: ") response = input() if re.match("[yY]", response): print(" : {}".format(response)) elif re.match("[nN]", response): print(" : {}".format(response)) else: print("  : {}".format(response)) are_you_sure4() 

re.match(, )メソッドre.match(, )re.match(, )の先頭で指定されたパターンで検索します。 正規表現[yY]および[nN]はテンプレートとして使用されます(角括弧グループ文字)。 正規表現のトピックについては、最後に引用した記事で詳しく説明しています。 また、 「独自の正規表現をマスターする」という本をお勧めします。 レッスンあたり10分ベンフォート


この方法では、 upper()メソッドを使用して、余分な部分を切り捨て、正規表現を[Y]および[N]形式に減らすという原則を使用することもできます。


また、この場合、 re.match()の先頭からのみ一致を検索するため、許可された文字で始まる値、たとえばYumなどは正しいと見なされることにも注意してください。 他の方法とは異なり、完全に一致する必要があり、余分な文字があるとエラーメッセージが表示されます。 これは利点と見なすことができますが、この動作の修正を妨げるものは何もありません。


後者の方法は、このような単純な例では冗長ですが、正規表現ではより複雑なチェック( 電子メールのチェックなど)が可能になるため、汎用性と拡張性には適しています。


メソッド番号5

コメントでは、 random1stは別のきちんとした 方法を提供しました:


  #!/usr/bin/env python # -*- coding: utf-8 -*- def check_answer(): while True: response = input(' ? [/ (Y/n)]: ') try: print( 0 <= "YyNn".index(response) <=3 and "True" or "False") except ValueError: print ("Incorrect") check_answer() 

saboteur_kievが正しく指摘したように 、この方法はエレガントですが、コードサポートの点ではあまり美しくありません。 新しい値を追加する必要がある場合、別の開発者が存在します。肯定的な回答と否定的な回答が明確に分離されている前のコメントからのソリューションよりも悪い結果が読み取られ、解析されます。


発言

@datacompboyとMamOnは別の興味深い点を指摘しました。 ロシア語キーボードの記号Yは同じボタン上にあり、ユーザーが注意を払わないと、まったく逆の結果になる可能性があります。 開発時には、同様の点も考慮する必要があります。 したがって、選択エラーが不可逆的な結果につながる可能性があるアプリケーションでは、エラーの可能性がおそらく排除されるように、 Yes / No確認を要求することをお勧めします。


参照資料



Source: https://habr.com/ru/post/J301344/


All Articles