Python cung cap tinh linh hoat dang ké trong việc định dạng các biểu thức số học;
vi du: gia sử một chương trình đang sử dụng các biến x và y đề lưu giữ đữ liệu và chúng ta muốn sử dụng các biến đó trong một biểu thức toán học như sau trong đại số:
3x12y-5
Không giống như đại số, Python không có phép nhân ân. Điều này có nghĩa là chúng ta phải viết 3x là 3*x. Chúng ta không được bỏ qua toán tử *.
Chúng ta cé thé in giá trị của biêu thức đầy đủ ở trên như sau:
m(3*x + 2*y 5)
Định dạng này được ưa thích hơn vi no tuân theo phong cách được sử dụng trong toán học. Những điều sau đây đều được trình thông dịch Python chấp nhận:
in(3*x+2*y- 3)
Lưu ý việc thiếu không gian. Hầu hết đều đồng ý rằng định dạng nay, mac du la Python hợp pháp, nhưng con người lại khó đọc hơn. Vì con người phát triển và đọc mã nguôn nên khả năng đọc của con người là rất quan trọng. Một số gợi ý rằng các khoảng trắng nên được sử dụng xung quanh tất cả các toán tử nhị phân, như sau:
imn(3 * x + 2y - 5)
Trong trường hợp này, cách thực hành như vậy làm giảm khả năng đọc, vì nó làm cho nó có vẻ như các toán tử có mức ưu tiên bằng nhau (việc chủng không giãn cách trong biêu thức không ảnh hưởng đến mức độ ưu tiên của toán tử). Cách đầu tiên chúng ta viết biểu thức nhóm các thừa số lại với nhau một cách tự nhiên, giống như cách thông thường trong đại số. Phần sau đây tương đương về mặt tính toán trong Python nhưng gây hiểu nhầm và nên tránh: print(3 *x+2 * y-5)
Một lần nữa, khoảng cách không ảnh hưởng đến độ ưu tiên của toán tử, nhưng định dạng này làm cho có vẻ như phép cộng và phép trừ sẽ diễn ra trước phép nhân. Về mặt tâm lý, việc thiêu không gian khiến cho các toán hạng + và "liên kết" của chúng có vẻ chặt chẽ hơn so với *. Điều này không đúng và tuyên bồ này đễ bị người đọc hiểu sai.
Điểm mắu chốt là bạn nên cố gắng định dạng mã nguồn Python của mình theo cách nâng cao khả năng đọc của con người. Sao no lại quan trọng? Nhóm lập trình viên phát triên phần mềm thương mại. Họ phải có khả năng xem xét và sửa lại mã do người khác viết. Bất kỳ kỹ thuật mã hóa nào giúp mọi người đọc và hiệu mã của nhau đễ dàng hơn đều tạo điều kiện thuận lợi rất nhiều cho quá trình phát triển.
Nếu bạn thực sự cần cộng và trừ trong biều thức trên trước khi thực hiện phép nhân, bạn có thể sử dụng dấu ngoặc đơn đề ghi đè các quy tắc ưu tiên thông thường, như trong: print(3* (x + 2) * (y-5)) trình bày biêu thức tốt hơn như bạn sẽ tìm thay trong sách đại số.
3.5. Bình luận
40
Bat ky van ban nào có trong nhận xét đều bị trình thông dịch Python bỏ qua. Biéu tuong # bat dau nhan xét trong ma nguồn. Nhận xét có hiệu lực cho đến hết dòng mã.
Vi dụ:
# Tính giá trị trung bình của các giá trị tong trung bình / số =
Dòng. đầu tiên ở đây là chú thích giải thích ý nghĩa của câu lệnh tiếp theo. Chú thích bắt đầu bằng ký hiệu # và tiếp tục cho đến hết dòng đó. Trình thông dịch sẽ bỏ qua ký hiệu
# và nội dung còn lại của đòng. Bạn cũng có thể thêm một nhận xét ngắn vào cuối câu lệnh:
tổng trung bình / số # Tính trung bình của các giá trị =
Ở đây, câu lệnh thực thi va nhận xét xuất hiện trên cùng một dòng. Trình thông dịch sẽ đọc câu lệnh gán nhưng sẽ bỏ qua chủ thích.
Binh luận được sử dụng tốt nhật như thế nào? Tránh đưa ra nhận xét về những điều hiển nhiên
vi du: result = 0 # Gan gia tri 0 cho bién có tén result
Hiệu quả của tuyên bó này là rõ ràng đôi với bất kỳ ai có kinh nghiệm lập trinh Python dù là tối thiêu. Vì vậy, đối tượng của các bình luận cần được tính đến; nói chung, các hoạt động "thường lệ" không cần nhận xét. Mặc dù tác dụng của tuyên bồ trên là rõ ràng nhưng mục đích của nó có thể cần được bình luận. Ví dụ:
result = 0 # Đảm bảo 'kết quả' có giá trị tối thiểu được xác định rõ ràng
result = 0 # Đảm bảo 'kết quả! có giá trị tối thiêu được xác định rõ ràng. Nhận xét này có thê rat quan trọng đề người đọc hiệu hoàn toàn cách thức hoạt động của một phần cụ thê của chương trình. Nhìn chung, các lập trình viên không có xu hướng đưa ra quá nhiều bình luận. Khi nghi ngờ, hãy thêm một nhận xét.
3.6. Lỗi
Những lập trình viên mới bắt đầu mắc lỗi khi viết chương trình vỉ thiếu kinh nghiệm lập trình nói chưng hoặc do không quen với ngôn ngữ lập trình. dày dạn người lập trình mắc lỗi do bất cân hoặc do giải pháp đề xuất cho một vấn đề nào đó bi lỗi và việc thực hiện đúng giải pháp không chính xác sẽ không tạo ra một chương trình chính xác.
Trong Python, có ba loại lỗi chung: lỗi cú pháp, ngoại lệ trong thời gian chạy và lỗi logic.
3.6.1 Lỗi cú pháp
Trình thông dịch được thiết kế đề thực thi tất cả các chương trình Python hợp lệ.
Trình thông dịch đọc tệp nguồn Python va dich no sang dang thực thi được. Đây là giai đoạn dịch Nếu trình thông dịch phát hiện một câu lệnh chương trình không hợp lệ trong giai đoạn dịch, nó sẽ châm dứt việc thực thi chương trình và báo lỗi. Những lỗi như vậy là do người lập trình sử dụng sai ngôn ngữ. Lỗi cú pháp là lỗi phô biến mà trình thông dịch có thê phát hiện khi cô gắng dịch câu lệnh Python sang ngôn ngữ máy.
câu lệnh Python x=yt2
41
đúng về mặt cú pháp vì nó tuân theo các quy tắc vẻ cầu trúc của câu lệnh gán. Tuy nhiên, hãy xem xét thay thế câu lệnh gán này bằng một phiên bản được sửa đổi một chút:
v+r2=x
Nếu một câu lệnh như thế này xuất hiện trong một chương trình, trình thông dịch sé đưa ra thông báo lỗi; Hãy thử thực hiện phép gán như vậy.
>>>v =5
>>>x=y +2
>>>y†2=x
Khi chạy chương trình trên, trình thông dịch hiển thị FElle”error.py”, Lìne 3
yrt2=x
SyntaxError: can’t assign to operator 3.6.2 Ngoai lé trong thoi gian chay
Một chương trình Python dung cu phap van có thê gặp sự cố. Một số lỗi ngôn ngữ phụ thuộc vào ngữ cánh thực thi chương trình. Những lỗi như vậy được gọi là ngoại lệ trong thời gian chạy hoặc lỗi thời gian chạy. Chúng ta nói trình thông dịch đưa ra một ngoại lệ. Các ngoại lệ về thời gian chạy phát sinh sau giai đoạn dịch của trình thông địch và trong giai đoạn thực thi chương trình.
Trỉnh thông dịch có thé dua ra một ngoại lệ cho một câu lệnh đúng vé mat cu pháp như x=yt2
nêu biến y chưa được gán; ví dụ: nếu câu lệnh xuất hiện ở dong 12 va đến thời điểm đó y chưa được chỉ đính sẽ thông báo:
Traceback (most recent call last):
File “error.py”, line 1, in<module>
NameError: name”y” is not defined DD
# File dividedanger .py
divisor = int(input('Please enter the divisor
# Divide them and report the result
print(dividend, , divisor, “=" d1V1dend/d1V1SoFr
Cách diễn đạt:
Hãy nhập hai số chia:
Vui lòng nhập số bị chia: 32 Vui lòng nhập số chia: 4
42
32/4 =8
Thay vao do, néu người dùng gõ số 32 và 0, chương trình sẽ báo lỗi va cham đứt:
Hãy nhập hai SỐ, can chia.
Vưi lòng nhập số bị chia: 32 Vui lòng nhập số chia: 0 TracBack (most recent call last):
File: "C:\Users\rick\Desktop\changeable.py", dong 3, in <module>
print(dividend, '/', divisor, "=", S6 bi chia/sé6 chia) ZeroDivisionError: division by 0
Chia cho 0 không được xác định trong toán hoc va chia cho 0 trong Python là không đúng quy tắc.
Trình thông dịch phát hiện lỗi cú pháp ngay lập tức. Lỗi cú pháp không bao giờ thoát khỏi giai đoạn địch thuật. Đôi khi các ngoại lệ trong thời gian chạy không hiên thị ngay lập tức. Trình thông dịch chi đưa ra một ngoại lệ trong thời gian chạy khi nó cô gắng thực thi câu lệnh bị lỗi. Nếu những điều kiện đó không phát sinh trong quá trình thử nghiệm, mã bị lỗi sẽ không có cơ hội thực thi. Điều này có nghĩa là lỗi có thê không bị phát hiện cho đến khi người dùng tình cờ phát, hiện ra lỗi sau khi triển khai phần mềm.
Do đó, các ngoại lệ trong thời gian chạy còn rắc rối hơn lỗi cú pháp.
3.6.3. Lỗi logic
Trình thông dịch có thể phát hiện lỗi cú pháp trong giai đoạn dịch và phát hiện các ngoại lệ trong thời gian chạy trong giai đoạn thực thị. Cả hai loại vấn đề đều thê hiện sự vi phạm ngôn ngữ Python. Những lỗi như vậy là dễ sửa nhất vì trình thông địch chỉ ra vị trí chính xác trong mã nguôn nơi nó phát hiện ra vấn đề.
Hãy xem xét tác động của việc thay thế biểu thức số bị chia/số chia
số chia/số bị chia
Chương trình chạy và trừ khi người dùng nhập giá trị 0 cho số bị chia, trình thông địch sẽ không báo cáo 161. Tuy nhiên, câu trả lời mà nó tính toán nói chung là không chính xác. Lần duy nhất chương trình ín ra câu trả lời đúng là khi số bị chia bằng số chia.
Chương trình có lỗi nhưng trình thông địch không thé phát hiện ra vấn đề. Lỗi thuộc loại này được gọi là lỗi logic.
Những lập trình viên mới bắt đầu có xu hướng gặp khó khăn ngay từ đầu với các lỗi cú pháp và thời gian chạy do họ không quen với ngôn ngữ này. Các thông báo lỗi của trình thông dịch thực sự là người bạn tốt nhất của lập trình viên. Khi lập trình viên có được kinh nghiệm với ngôn ngữ này và các chương trình được viết trở nên phức tạp hơn, số lượng lỗi phi logic giảm đi hoặc được sửa chữa một cách tầm thường và số lượng lỗi logic tăng lên. Thật không may, trình thông dịch không có khả năng cung cấp bất kỳ thông tin chỉ tiết nào về bán chất và vị trí của các lỗi logic. Do đó, các lỗi logic có xu hướng khó tìm và sửa chữa nhất. Các lập trình viên thường xuyên sử dụng các công cụ như trình gỡ lỗi đề giúp họ xác định và sửa các lỗi logic, nhưng những công cụ này không hề tự động trong hoạt động.
43
Các lỗi thời gian chạy chưa được phát hiện và các lỗi logic ân trong phần mềm thường được gọi là lỗi. Trình thông dịch chỉ báo cáo các lỗi thực thi (ngoại lệ) khi có điều kiện phù hợp đề phát hiện ra các lỗi đó. Trình thông dịch không giúp ích được gì cho các lỗi logic. Những lỗi như vậy là nguyên nhân chính gây thất vọng cho các nhà phát triển. Sự thật vọng thường nay sinh vì trong các chương trình phức tạp, lỗi đôi khi chỉ xuất hiện trong một sô tình huong nhất định và khó tái tạo chính xác trong quá trình thử nghiệm.
Bạn sẽ phát hiện ra điều phiền toái này khi chương trình của bạn trở nên phức tạp hơn.
Tin tốt là kinh nghiệm lập trình và việc áp dụng kỷ luật. các kỹ thuật lập trình tốt có thê giúp giảm số lượng lỗi logic. Tin xấu là vì việc phát triển phân mềm vốn là mục đích theo đuôi trí tuệ của con người nên các lỗi logic là không thê tránh khỏi. Việc vô tình đưa vào và sau này tìm và loại bỏ các lỗi logic là một phần không thể thiếu trong quá trình lập trình.