私の単純なPython計算機を改善する

Sep 11 2020

私はPythonがかなり新しいので、これは私が自分で行った最初のプロジェクトです。とにかくこれを改善できるか、これを改善するためのアドバイスをくれるかどうか疑問に思っています。ありがとうございました

import sys
valid = ["+", "-", "*", "/"]
invalid = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def start():
    while True:
        a = input("").lower()
        for banned in a:
            if banned in invalid:
                print("error")
            else:
                sum1 = int(a)
        cal = input("")
        b = input("").lower()
        for banned in b:
            if banned in invalid:
                print("Error")
                start()
            else:
                sum2 = int(b)
        break;
    for list in cal:
        if list in valid:
            if list == "+":
                total = sum1 + sum2
                print("=" + total)
            if list == "-":
                total = sum1 - sum2
                print(total)
                start()
            if list == "*":
                total = sum1 * sum2
                print(total)
                start()
            if list == "/":
                total = sum1 / sum2
                print(total)
                start()
        else:
            print("Wrong Format")
            start()
start()

回答

3 FMc Sep 11 2020 at 05:48

いくつかのコメントは、行ごとの詳細ではなく、より優れたコマンドラインスクリプトを作成する方法とロジックの簡素化に焦点を当てていました。

このプログラムを使用するにはどうすればよいですか?あなたのinput()電話は何が起こっているのか教えてくれません。助けてください。

ユーザーは、コンピューターとの面倒なやり取りを楽しみません。数値を入力し、Enterキーを押し、演算子を入力し、Enterキーを押し、数値を入力し、Enterキーを押します...または単にダーン方程式を入力しますか?例えば:

reply = input('Enter equation: INT OP INT: ')

ユーザーは、コンピューターとの面倒なやり取りを本当に楽しんでいません。まれな例外を除いて、賢明なコマンドラインプログラムはまったく使用input()しません-または少なくともデフォルトでは使用しません。sys.argvユーザーが自分のコンピューターで最高の仲間になることを強制することなく、ユーザーが電卓について学び、直接実行できるようにします。コマンドラインの使用法は次のようになります。

$ python simple-calculator.py 32 + 10
42

例外処理について学びます。考えられるすべての不正な入力(特に考えられるすべてのUTF-8入力を考慮する場合は非常に難しい)を保持するデータ構造の作成に行き詰まるのではなく、セーフティネットを使用してやりたいことを実行してみてください。

while True:
    try:
        # Each of these lines could fail. That's OK. Be optimistic!
        s1, op, s2 = reply.split()
        a = int(s1)
        b = int(s2)
        assert op in '+-*/'
        break                  # Success.
    except Exception as e:
        # The safety net.
        print('Invalid input')

データ構造を使用してロジックを簡素化します。if-else小切手の山を取り除き、代わりにあなたが直接やりたいことをするのはクールではないでしょうか?このような状況では、データ構造が役立つことがよくあります。必要なのは、演算子を取得し、それを使用して、必要な数学を実行する2つの引数関数を取得する方法です。言い換えれば、演算子と対応する数学関数の間のマッピングが必要です。これを実現する3つの方法は次のとおりです。

import operator

def add(a, b):
    return a + b

ops = {
    '+': add,                    # Define your own functions.
    '-': lambda a, b: a - b,     # Or lambdas.
    '*': operator.mul,           # Or get them from a library.
    '/': operator.truediv,
}

# With that data structure, our code would reduce to this.
answer = ops[op](a, b)     # Wrap in try-except to catch divide by 0.
print(answer)
1 user985366 Sep 11 2020 at 00:55

提案1

無効な文字とinチェックのリストは文字列と同じように機能しますが、短くて読みやすくなります。

invalid = 'abcdefghijklmnopqrstuvwxyz'

同じことvalidが文字の配列にも当てはまります。

提案2

for banned in a:

bannedこの用途では非常に紛らわしい変数名です。invalidキャラクターのリストと比較するまで、禁止されているかどうかはわかりません。あなたは、むしろ使うべきcharacterか、letterなど短い基本名cまたはx。

提案3

a = input("").lower()

aそれが何であるかを教えてくれないので、ここでも悪い名前です。むしろinput1、それに類似した名前を付け、もちろん、説明的な名前に変更bしinput2ます。

提案4

for list in cal:

list読者を誤解させるような不適切な名前であるだけでなく、Pythonのキーワード/関数でもあるため、どのような状況でも変数名として使用しないでください。operator計算に演算子を使用しているので、より適切な名前としてお勧めします。

提案5

start()を除くすべての操作の後に呼び出しています+。これは間違いのようです。なぜ+ですか?

提案6

total = sum1 * sum2
print(total)

すべての操作について、合計を新しい変数に保存してから出力します。ただし、印刷以外の目的には使用しないため、変数に格納せずに結果を直接印刷することをお勧めします。

print(sum1 * sum2)