basit python hesaplayıcımı geliştirmek
python'da oldukça yeniyim ve bu benim kendim yaptığım ilk projem. Bunu daha iyi hale getirebileceğim veya bunu daha iyi hale getirmek için bana tavsiyelerde bulunabileceğim bir şey olup olmadığını merak ediyorum. teşekkür ederim
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()
Yanıtlar
Birkaç yorum satır satır ayrıntılara daha az, daha iyi komut satırı komut dosyalarının nasıl oluşturulacağına ve mantığı basitleştirmeye odaklandı.
Bu programı nasıl kullanırım ? Kişisel input()çağrılar neler söyleme. Yardım lütfen.
Kullanıcılar bilgisayarlarla sıkıcı etkileşimlerden hoşlanmazlar . Bir numara yazmayı, enter tuşuna basmayı, bir operatör yazmayı, enter tuşuna basmayı, bir numara yazmayı, enter tuşuna basmayı ... VEYA sadece yama denklemini mi girmeyi tercih edersiniz? Örneğin:
reply = input('Enter equation: INT OP INT: ')
Kullanıcılar bilgisayarlarla sıkıcı etkileşimlerden gerçekten hoşlanmazlar . Nadir istisnalar dışında, mantıklı komut satırı programları hiç kullanmaz input()- veya en azından varsayılan olarak kullanmaz. Öğrenin sys.argvve onların bilgisayar ile iyi arkadaşları olmaya zorlamadan, kullanıcıların doğrudan hesap çalıştırın. Komut satırı kullanımı şöyle görünebilir:
$ python simple-calculator.py 32 + 10
42
İstisna işleme hakkında bilgi edinin . Olası her kötü girişi tutan (çok zor, özellikle de akla gelebilecek tüm UTF-8 girişlerini düşünürseniz) bir veri yapısı oluştururken takılıp kalmak yerine, yapmak istediğiniz şeyi - bir güvenlik ağı ile yapmaya çalışın.
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')
Mantığı basitleştirmek için veri yapılarını kullanın . Bir yığın çekten kurtulmak if-elseve bunun yerine yapmak istediğiniz şeyi doğrudan yapmak harika olmaz mıydı? Bu tür durumlarda, bir veri yapısı genellikle yardımcı olabilir. İhtiyacımız olan şey, bir operatörü alıp sonra ihtiyacımız olan matematiği gerçekleştirecek 2 argümanlı bir fonksiyon elde etmek için kullanmanın bir yoludur. Başka bir deyişle, operatörler ve karşılık gelen matematik fonksiyonları arasında bir eşlemeye ihtiyacımız var. İşte bunu başarmanın 3 yolu:
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)
Öneri 1
Geçersiz karakterler ve inkontroller listeniz bir dizge kadar iyi çalışacak, ancak daha kısa ve daha okunaklı olacaktır.
invalid = 'abcdefghijklmnopqrstuvwxyz'
Aynısı validkarakter dizisi için de geçerlidir .
Öneri 2
for banned in a:
bannedbu kullanım için çok kafa karıştırıcı bir değişken adıdır. invalidKarakter listesiyle karşılaştırana kadar yasaklanıp yasaklanmadığını bilemezsiniz . Sen doğrusu kullanmalısınız characterveya letterveya benzeri daha kısa temel ad cveya x.
Öneri 3
a = input("").lower()
abize ne olduğunu söylemediği için burada da kötü bir isim. Aksine bunun adı input1ya da benzer bir şey ve tabii değişim biçin input2ya da açıklayıcı olduğu başka bir şey.
Öneri 4
for list in cal:
listsadece okuyucuyu yanlış yönlendiren kötü seçilmiş bir isim değil, aynı zamanda Python'da bir anahtar kelime / işlevdir ve hiçbir durumda değişken adı olarak kullanılmamalıdır. operatorHesaplamanız için bir operatör aldığınız için daha iyi bir isim olarak öneriyorum .
Öneri 5
Dışındaki start()her operasyondan sonra arıyorsun +. Bu bir hata gibi görünüyor. Neden olmasın +?
Öneri 6
total = sum1 * sum2
print(total)
Her işlem için, toplamı yeni bir değişkene kaydediyor ve ardından yazdırıyorsunuz. Ancak bunu yazdırma dışında başka bir şey için kullanmazsınız, bu nedenle sonucu bir değişkene kaydetmeden doğrudan yazdırabilirsiniz.
print(sum1 * sum2)