Hãy cùng xem cách hoạt động của đoạn mã trên. Chúng ta sẽ xây dựng từng phần chức năng trên bằng cách xem qua các nguyên tắc chính giúp nó hoạt động
Để làm theo, bạn phải là một lập trình viên Python trung cấp/cao cấp. Đối với người mới bắt đầu, tôi khuyên bạn nên bỏ qua phần trình tạo ở cuối
Hàm ord[] trong Python
Trong Python, mỗi ký tự Unicode, chẳng hạn như “a”, “b” hoặc “c” là một số nguyên bên trong
Ví dụ, đây là bảng Unicode cho bảng chữ cái tiếng Anh
UnicodeCharacterUnicodeCharacterUnicodeCharacterUnicodeCharacter64@80P96`112p65A81Q97a113q66B82R98b114r67C83S99c115s68D84T100d116t69E85U101e117u70F86V102f118v71G87W103g119w72H88X104h120x73I89Y105i121y74J90Z106j122z75K91[107k123{76L92\108l124. 77M93]109m125}78N94^110n126~79O95_111oTrong Python, bạn có thể kiểm tra giá trị nguyên của bất kỳ ký tự nào bằng hàm ord[] tích hợp
Chẳng hạn, hãy kiểm tra các giá trị Unicode cho “a”, “b” và “c”
ord["a"] # 97 ord["b"] # 98 ord["c"] # 99
Như bạn có thể thấy, điều này trả về các giá trị giống như trong bảng Unicode ở trên
Hàm chr[] trong Python
Trong Python, bạn có thể biến [một số] số nguyên thành ký tự
Điều này là tự nhiên vì như bạn đã học, mỗi ký tự là một con số ngầm
Trong Python, có một chức năng chr[] tích hợp sẵn. Điều này chuyển đổi một số nguyên thành một giá trị ký tự tương ứng
Chẳng hạn, hãy biến các số 110, 111 và 112 thành các ký tự
print[chr[110]] print[chr[111]] print[chr[112]]
đầu ra
n o p
Bây giờ bạn đã hiểu cách chuyển đổi một ký tự thành số nguyên và số nguyên trở lại ký tự
Điều này đưa chúng ta đến một điểm chính liên quan đến phạm vi ký tự trong Python. Một dải ký tự thực sự được tạo bằng cách sử dụng một dải số. Có thể chỉ vì chúng ta biết cách chuyển đổi các ký tự thành số nguyên và ngược lại
Ví dụ: bạn có thể tạo một dãy ký tự bằng cách sử dụng hàm range[] tích hợp sẵn và hàm ord[]
for number in range[ord["a"], ord["h"]]: print[number]
đầu ra
97 98 99 100 101 102 103
Nếu bạn muốn chuyển các số này về ký tự, hãy gọi hàm chr[] trên các giá trị số
for number in range[ord["a"], ord["h"]]: print[chr[number]]
đầu ra
a b c d e f g
Phạm vi bao gồm
Bây giờ bạn đã có một triển khai ngây thơ cho một loạt các ký tự trong Python
Nhưng trong ví dụ trên, phạm vi kết thúc ở “g” mặc dù nó phải kết thúc ở “h”. Điều này là do tính chất độc quyền của hàm range[], nghĩa là giá trị cuối cùng không được bao gồm trong phạm vi
Để khắc phục điều này, hãy thêm 1 vào cuối phạm vi. Nói cách khác, hãy mở rộng phạm vi thêm một để bao gồm giá trị "cuối cùng"
Ví dụ: hãy tạo một dãy ký tự từ “a” đến “h” sao cho có cả chữ “h”
for number in range[ord["a"], ord["h"] + 1]: print[chr[number]]
đầu ra
a b c d e f g0
Chuyển vòng lặp For thành hàm
Bây giờ bạn có một vòng lặp for đơn giản để in các ký tự từ “a” đến “h”
Nhưng bạn rõ ràng muốn trở nên tổng quát hơn
Hãy sử dụng logic từ ví dụ trước để tạo một hàm trả về một dãy ký tự dưới dạng danh sách. Thay vì mã hóa cứng các chuỗi “a” và “h”, hãy làm cho hàm chấp nhận các đầu vào chung start và stop
a b c d e f g1
Bây giờ, hãy gọi hàm này để tạo danh sách các ký tự giữa “a” và “l”
a b c d e f g2
đầu ra
a b c d e f g3
Và có cách triển khai ngây thơ của bạn cho hàm phạm vi ký tự
Trong khi đó, phương pháp này đã đáp ứng nhu cầu của bạn, hãy tiến thêm một bước nữa bằng cách sử dụng máy phát điện
Phương pháp tiếp cận máy phát điện
Cho đến nay, bạn đã triển khai một phạm vi ký tự bao gồm dưới dạng một hàm trả về danh sách các ký tự
Tuy nhiên, chức năng này lưu trữ tất cả các ký tự vào một danh sách trong bộ nhớ. Nhưng chúng ta có thực sự cần lưu trữ chúng không?
Không
Các nhân vật độc lập với nhau. Nghĩa là, giá trị của “a” không phụ thuộc vào giá trị của “b” hoặc bất kỳ ký tự nào khác trong phạm vi
Điều này có nghĩa là bạn có thể sử dụng trình tạo thay vì hàm để tạo phạm vi. Nói cách khác, bạn không lưu trữ toàn bộ chuỗi ký tự. Thay vào đó, bạn tạo từng cái một với chức năng tạo
Nếu bạn không quen thuộc với máy phát điện, vui lòng kiểm tra bài viết này
Nói tóm lại, hàm tạo không trả về giá trị. Thay vào đó, nó cung cấp cho bạn một đối tượng trình vòng lặp mang lại từng giá trị một mà không cần lưu trữ chúng. Điều này giúp tiết kiệm bộ nhớ khi chuỗi các mục có kích thước lớn. Phần tốt nhất của trình tạo là chúng cho phép cú pháp giống như vòng lặp. Điều này làm cho có vẻ như trình tạo đã lưu trữ các giá trị ngay cả khi nó không
Hãy chuyển đổi phạm vi chức năng ký tự thành trình tạo
a b c d e f g4
Trình tạo này mang lại từng ký tự một
Như đã đề cập, bạn có thể sử dụng trình tạo này trong vòng lặp for giống như cách bạn làm với bất kỳ trình lặp nào khác trong Python
a b c d e f g5
đầu ra
a b c d e f g0
Thật tuyệt, chúng tôi gần như ở đó
biểu thức trình tạo
Để hoàn thành việc triển khai phạm vi ký tự, hãy thực hiện một chỉnh sửa nhỏ cuối cùng cho chức năng
Tương tự như khả năng hiểu danh sách, trình tạo Python hỗ trợ khả năng hiểu trình tạo [được gọi là biểu thức trình tạo]. Điều này cho phép bạn nén việc triển khai trình tạo thành tốc ký một dòng
Cú pháp chung cho một biểu thức trình tạo là
a b c d e f g7
Biểu thức này tương đương với việc gọi trình tạo này
a b c d e f g8
Như bạn có thể thấy, bạn tiết kiệm một số dòng mã và hoàn toàn không cần sử dụng câu lệnh năng suất. Đôi khi điều này có thể làm cho mã dễ đọc hơn và cải thiện chất lượng mã
Hãy áp dụng kiến thức này vào trình tạo của chúng tôi để tạo phạm vi ký tự
Điều này biến máy phát điện hiện có
a b c d e f g4
Thành một phiên bản tốc ký của nó
ord["a"] # 97 ord["b"] # 98 ord["c"] # 990
Đừng để câu lệnh return làm bạn bối rối ở đây. Hàm này vẫn trả về một trình vòng lặp mang lại từng ký tự trong phạm vi
Nếu phần máy phát điện nghe có vẻ ngớ ngẩn với bạn, vui lòng tự làm quen với máy phát điện. Phải mất một lúc để quấn đầu bạn xung quanh họ
Ngoài ra, hãy nhớ rằng phần cuối cùng này là tùy chọn. Tùy thuộc vào cuộc tranh luận liệu tốc ký có thực sự cải thiện chất lượng mã hay không