cải thiện máy tính python đơn giản của tôi
tôi còn khá mới mẻ với python và đây là dự án đầu tiên tôi tự làm. Tôi đang tự hỏi liệu có cách nào tôi có thể cải thiện điều này hoặc cho tôi lời khuyên để làm cho điều này tốt hơn. cảm ơn bạn
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()
Trả lời
Một số nhận xét tập trung ít hơn vào chi tiết từng dòng và nhiều hơn vào cách xây dựng các tập lệnh dòng lệnh tốt hơn và đơn giản hóa logic.
Làm cách nào để sử dụng chương trình này ? Các input()cuộc gọi của bạn không cho tôi biết chuyện gì đang xảy ra. Giúp tôi với.
Người dùng không thích những tương tác tẻ nhạt với máy tính . Bạn muốn nhập một số, nhấn enter, nhập một toán tử, nhấn enter, nhập một số, nhấn enter ... HAY chỉ nhập phương trình darn? Ví dụ:
reply = input('Enter equation: INT OP INT: ')
Người dùng thực sự không thích những tương tác tẻ nhạt với máy tính . Với những ngoại lệ hiếm hoi, các chương trình dòng lệnh hợp lý hoàn toàn không sử dụng input()- hoặc ít nhất là không theo mặc định. Tìm hiểu về sys.argvvà cho phép người dùng của bạn chạy máy tính của bạn trực tiếp mà không buộc họ trở thành bạn thân với máy tính của họ. Đây là cách sử dụng dòng lệnh có thể trông như thế nào:
$ python simple-calculator.py 32 + 10
42
Tìm hiểu về xử lý ngoại lệ . Thay vì sa lầy vào việc tạo cấu trúc dữ liệu chứa mọi đầu vào xấu có thể xảy ra (rất khó, đặc biệt nếu bạn xem xét tất cả các đầu vào UTF-8 có thể hình dung được), chỉ cần cố gắng làm điều bạn muốn - với mạng an toà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')
Sử dụng cấu trúc dữ liệu để đơn giản hóa logic . Sẽ không hay ho gì khi loại bỏ một đống if-elseséc và thay vào đó chỉ làm những việc bạn muốn trực tiếp? Trong những tình huống như vậy, cấu trúc dữ liệu thường có thể hữu ích. Những gì chúng ta cần là một cách để lấy một toán tử và sau đó sử dụng nó để nhận một hàm 2 đối số sẽ thực hiện phép toán chúng ta cần. Nói cách khác, chúng ta cần một ánh xạ giữa các toán tử và các hàm toán học tương ứng. Dưới đây là 3 cách để đạt được điều đó:
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)
Đề xuất 1
Danh sách các ký tự và inséc không hợp lệ của bạn sẽ hoạt động giống như một chuỗi, nhưng ngắn hơn và dễ đọc hơn.
invalid = 'abcdefghijklmnopqrstuvwxyz'
Tương tự cũng áp dụng cho validmảng ký tự.
Đề xuất 2
for banned in a:
bannedlà một tên biến rất khó hiểu cho việc sử dụng này. Bạn không biết liệu nó có bị cấm hay không cho đến khi bạn so sánh nó với invaliddanh sách các ký tự. Bạn nên sử dụng characterhoặc letterhoặc một tên cơ bản ngắn hơn như choặc x.
Đề xuất 3
a = input("").lower()
acũng là một cái tên nghèo nàn ở đây vì nó không cho chúng ta biết nó là gì. Thay vì đặt tên cho nó input1hoặc một cái gì đó tương tự, và tất nhiên là thay đổi bthành input2hoặc một cái gì đó khác mang tính mô tả.
Đề xuất 4
for list in cal:
listkhông chỉ là một cái tên được lựa chọn sơ sài gây hiểu lầm cho người đọc, nó còn là một từ khóa / hàm trong Python và không nên được sử dụng làm tên biến trong bất kỳ tình huống nào. Tôi đề xuất operatorlà một cái tên tốt hơn vì bạn đang sử dụng một toán tử để tính toán của mình.
Đề xuất 5
Bạn đang gọi start()sau mỗi hoạt động ngoại trừ +. Đây có vẻ như là một sai lầm. Tại sao không cho +?
Đề xuất 6
total = sum1 * sum2
print(total)
Đối với mọi hoạt động, bạn đang lưu tổng số trong một biến mới và sau đó in nó. Nhưng bạn không sử dụng nó cho bất kỳ việc gì khác ngoài in, vì vậy bạn cũng có thể in kết quả trực tiếp mà không cần lưu trữ nó trong một biến.
print(sum1 * sum2)