[PyACC 8] Python - Những kiến thức cơ bản - P2.2

Cách tìm lỗi, xử lý lỗi, tìm kiếm giải pháp xử lý lỗi

Cách tìm lỗi trong một chương trình Python tương đối dễ dàng. Tuy nhiên vẫn cần nhiều kinh nghiệm để có thể phát hiện ra chính xác điểm quan trọng để fix lỗi.

Hãy nhìn các ví dụ dưới đây và tự rút ra nhận xét cho riêng mình.

Ví dụ 1

Lỗi này xảy ra ở file test.py, dòng 30 trong hàm on_click.
Dòng gây ra lỗi là print(int("string")).
Chi tiết lỗi là "ValueError: invalid literal for int() with base 10: 'string'"

Để tìm kiếm giải pháp để fix lỗi, bạn có thể search Google với từ khóa "ValueError: invalid literal for int() with base 10: 'string'" để hiểu thêm về lỗi này, sau đó đọc các giải pháp liên quan.

Ví dụ 2

Ví dụ này, trên ảnh đã giải thích hết mọi thứ. Các bạn chịu khó đọc tiếng Anh nhé!

Ví dụ 3

Hãy chú ý đến những mũi tên đỏ.
Chi tiết lỗi là "ImportError: libcudart.so.7.5.................... No such file or directoy". Đoạn này tương đối dài, mình sẽ không ghi đầy đủ.
File xuất hiện lỗi này là pycaffe.py ở dòng 13, lỗi này nằm trong một module ._caffe.

Một lần nữa bạn chỉ cần search đoạn chi tiết  lỗi trên Google, bạn sẽ tìm được những giải thích về lỗi bạn gặp, thậm chí cả giải pháp để xử lý chúng.

Notes:
- Nguyên tắc để xử lý lỗi là phải hiểu được lỗi này có nghĩa là gì? Xuất hiện ở đâu? Sau đó tìm lý do gây ra lỗi bằng cách suy đoán dựa trên những thông tin bạn có.

- Hãy nhớ rằng, không chỉ mỗi mình bạn gặp lỗi này. Luôn luôn có người mắc lỗi trước bạn. Trong mọi tình huống, Google luôn luôn là giải pháp tốt.

- Cứ thử - sai đến khi bạn tìm được giải pháp đúng. Khi bạn xử lý được vài lỗi, bạn sẽ thấy tự tin hơn về khả năng của mình.

JSON

Json (JavaScript Object Notation) là một chuẩn định dạng được dùng để lưu trữ và trao đổi dữ liệu giữa các tiến trình với nhau.  Json ban đầu là một phần của JavaScript, tuy nhiên hiện nay đã phát triển, có chuẩn riêng của mình, tồn tại độc lập không phụ thuộc JS hay bất kỳ ngôn ngữ lập trình nào cả.

Đặc trưng của định dạng JSON:

  • Chuỗi JSON được bao lại bởi dấu ngoặc nhọn {}
  • Các key, valuecủa JSON bắt buộc phải đặt trong dấu nháy kép "".
    Nếu trường hợp trong value của bạn có chứa dấu nháy kép " thì hãy dùng dấu (\) để đặt trước nó, ví dụ \"json là gì\".
  • Nếu có nhiều key:value thì dùng dấu phẩy , để ngăn cách.
  • Các key của JSON bạn nên đặt chữ cái không dấu hoặc số, dấu _ và không có khoảng trắng, ký tự đầu tiên không nên đặt là số.
{
	"name": "Guido van Rossum",
	"age": 65,
	"degree": ["mathematics", "computer science"],
	"retired": true,
	"carrer": {
		"google":{
			"from": 1999,
			"to": 2013
		},
		"dropbox": {
			"from": 2013,
			"to": 2019
		}
	}
}
example.json

Có 2 quá trình chính khi xử lý dữ liệu ở định dạng JSON:

  • Serialize là quá trình chuyển một object trong chương trình về dạng mà máy tính có thể lưu trữ hoặc truyền đi được. Trong python, để serialize dữ liệu, ta dùng json.dump() hoặc json.dumps()
  • Deserialize là quá trình khôi phục lại các object từ file json hoặc chuỗi các bit nhận được từ mạng(LAN, Internet).
    Trong python, để deserialize dữ liệu, ta dùng json.load() hoặc json.loads()

Ví dụ chương trình đọc và in nội dung trong file example.json.

Bước 1. Tạo file example.json với nội dung bên trên.

Bước 2.  Tạo file main.py, cùng trong một thư mục với file example.json

# main.py
import json
  
# Opening JSON file
f = open('example.json')
  
# returns JSON object as 
# a dictionary
data = json.load(f)
  
print(data)
  
# Closing file
f.close()

Bây giờ hãy chạy chương trình và xem kết quả in ra màn hình.

Bạn có thể thắc mắc về sự khác nhau giữa json.dump() và json.dumps(), hay sự khác nhau giữa json.load() và json loads(). Hãy thử search Google với những từ  khóa này xem.

Bài tập nho nhỏ:
Hãy viết một file my_profile.json, trong đó mô tả lại bản thân dưới dạng json. Sau đó viết một chương trình python đơn giản, in ra tên và sở thích mà bạn đã lưu trong file my_profile.json
{
   "name": "Bách Dương",
   "age": 20
   "gender": "male",
   "location": "Hà Nội, Việt Nam",
   "hobbies": ["playing game", "code", "write blog"]
}
my_profile.json

Regex

Regex là viết tắt của Regular Expression, tên thuần Việt là biểu thức chính quy.
Regex là các mẫu (pattern) thay vì các chuỗi cụ thể được sử dụng tìm kiếm, so khớp, thay thế chuỗi.
Regex là một công cụ cực mạnh cho xử lí chuỗi trong python, javascript, và nhiều ngôn ngữ khác.

Ví dụ: Bạn muốn tìm một chuỗi ký tự ngẫu nhiên bắt đầu bằng a kết thúc bằng z ở giữa có chữ số, bạn có thể viết một biểu thức Regex đơn giản như sau:

^a.*[0-9].*z$

Một trong những ứng dụng phổ biến của Regex là dùng để kiểm tra tính hợp lệ của email, số điện thoại hoặc mật khẩu.

#Biểu thức Regex so khớp số điện thoại ở Việt Nam

\+?(0|84)\d{9}
# Biểu thức Regex kiểm tra email có hợp lệ hay không

\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b

Sử dụng Regex trong Python như thế nào?

Để sử dụng Regex trong Python, chúng ta sẽ dùng thư viện re - đây là một thư viện được tích hợp sẵn - built-in đi theo ngôn ngữ Python, do đó bạn chỉ cần import và sử dụng luôn mà không cần cài đặt.

Ví dụ chương trình kiểm tra email có hợp lệ hay không?

# main.py
# Python program to validate an Email
 
import re
 
# Tạo biểu thức để kiểm tra Email
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
 
# Viết hàm check để kiểm tra Email
def check(email):
    # Dùng hàm re.fullmatch để kiểm tra xem Email có khớp hoàn toàn với biểu thức chính quy ở trên hay không?
    if(re.fullmatch(email_pattern, email)):
        print("Valid Email")
 
    else:
        print("Invalid Email")
 
 
# Hàm main
if __name__ == '__main__':
	# Kiểm tra email ankitrai326@gmail.com
    email = "ankitrai326@gmail.com"
    check(email)
    
    # Kiểm tra email my.ownsite@our-earth.org
    email = "my.ownsite@our-earth.org"
    check(email)
 
    # Kiểm tra email ankitrai326.com
    email = "ankitrai326.com"
    check(email)

Học sử dụng regex như thế nào?

Có một số công cụ để bạn học regex, bạn có thể tham khảo nhé:

# Series hướng dẫn cách sử dụng Regex từ cơ bản đến nâng cao
https://regexlearn.com/learn
https://github.com/ziishaned/learn-regex

# Công cụ để tạo ra các biểu thức chính quy, kiểm tra tính chính xác của những biểu thức bạn vừa tạo
https://regex101.com/

Quan điểm của cá nhân mình thì regex không cần phải học, chúng ta chỉ cần học cách tìm kiếm và kiểm chứng kết quả vừa tìm kiếm được. Nếu biểu thức chính quy tìm được thỏa mãn những yêu cầu mình đặt ra mình sẽ sử dụng.

Lưu ý:
Có học sẽ vẫn sẽ tốt hơn :D

Ví dụ khi mình kiểm tra độ chính xác của email_pattern mà mình đã tìm được ở phía trên:

\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b

Một số ví dụ khác, bạn có thể tìm kiếm như sau:

  • Regex để tìm tất cả các ký tự nằm giữa 2 ký tự.
Google: regex find string between two characters
  • Regex để tìm tất cả các số trong chuỗi
Google: regex find all numbers in string
  • Regex để kiểm tra xem chuỗi có chứa chuỗi con nào đó.
Google: regex check contains string

Và rất nhiều trường hợp khác. Sau khi tìm được các kết quả, bạn chỉ cần đem chúng lên regex101.com để kiểm tra với dữ liệu test.

Nếu kết quả ok thì cứ thể mà chiến thôi!!