Trong Python , đây là cách duy nhất để có được số lượng phần tử?
arr.__len__()
Nếu vậy, tại sao cú pháp lạ?
Trong Python , đây là cách duy nhất để có được số lượng phần tử?
arr.__len__()
Nếu vậy, tại sao cú pháp lạ?
Câu trả lời:
my_list = [1,2,3,4,5]
len(my_list)
# 5
Các công việc tương tự cho các bộ dữ liệu:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
Và các chuỗi, thực sự chỉ là các mảng ký tự:
my_string = 'hello world'
len(my_string)
# 11
Nó đã được thực hiện một cách có chủ ý theo cách này để các danh sách, bộ dữ liệu và các loại bộ chứa hoặc lặp khác không cần phải thực hiện một cách rõ ràng một .length()
phương thức công khai , thay vào đó bạn chỉ cần kiểm tra len()
bất cứ thứ gì thực hiện __len__()
phương pháp 'ma thuật' .
Chắc chắn, điều này có vẻ dư thừa, nhưng việc triển khai kiểm tra độ dài có thể thay đổi đáng kể, ngay cả trong cùng một ngôn ngữ. Không có gì lạ khi thấy một loại bộ sưu tập sử dụng một .length()
phương thức trong khi một loại khác sử dụng một thuộc .length
tính, trong khi một loại khác sử dụng .count()
. Có một từ khóa cấp ngôn ngữ sẽ thống nhất điểm vào cho tất cả các loại này. Vì vậy, ngay cả các đối tượng bạn có thể không coi là danh sách các yếu tố vẫn có thể được kiểm tra độ dài. Điều này bao gồm chuỗi, hàng đợi, cây, vv
Bản chất chức năng len()
cũng cho vay chính nó cho các phong cách chức năng của lập trình.
lengths = map(len, list_of_containers)
Cách bạn sử dụng độ dài của bất kỳ thứ gì có ý nghĩa (danh sách, từ điển, tuple, chuỗi, ...) là để gọi len
nó.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
Lý do cho cú pháp "lạ" là python nội bộ chuyển len(object)
thành object.__len__()
. Điều này áp dụng cho bất kỳ đối tượng. Vì vậy, nếu bạn đang định nghĩa một số lớp và nó có ý nghĩa đối với nó có độ dài, chỉ cần định nghĩa một __len__()
phương thức trên nó và sau đó người ta có thể gọi len
các trường hợp đó.
Python sử dụng kiểu gõ vịt : nó không quan tâm đến đối tượng là gì , miễn là nó có giao diện phù hợp với tình huống hiện tại. Khi bạn gọi hàm tích hợp len () trên một đối tượng, bạn thực sự đang gọi phương thức __len__ bên trong của nó. Một đối tượng tùy chỉnh có thể thực hiện giao diện này và len () sẽ trả về câu trả lời, ngay cả khi đối tượng không phải là một chuỗi về mặt khái niệm.
Để có danh sách đầy đủ các giao diện, hãy xem tại đây: http://docs.python.org/reference/datamodel.html#basic-customization
Cách ưa thích để có được độ dài của bất kỳ đối tượng python nào là truyền nó làm đối số cho len
hàm. Trong nội bộ, python sau đó sẽ cố gắng gọi __len__
phương thức đặc biệt của đối tượng đã được thông qua.
Chỉ cần sử dụng len(arr)
:
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
bạn có thể sử dụng len(arr)
như được đề xuất trong các câu trả lời trước để có được độ dài của mảng. Trong trường hợp bạn muốn kích thước của mảng 2D, bạn có thể sử dụng arr.shape
trả về chiều cao và chiều rộng
len(list_name)
Hàm lấy danh sách làm tham số và nó gọi __len__()
hàm của danh sách .
Python đề nghị người dùng sử dụng len()
thay vì tính __len__()
nhất quán, giống như những người khác đã nói. Tuy nhiên, có một số lợi ích khác:
Đối với một số tích hợp sẵn trong các loại như list
, str
, bytearray
và như vậy, việc thực hiện Cython của len()
mất một phím tắt. Nó trực tiếp trả về ob_size
cấu trúc C, nhanh hơn gọi __len__()
.
Nếu bạn quan tâm đến những chi tiết như vậy, bạn có thể đọc cuốn sách có tên "Fluent Python" của Luciano Ramalho. Có nhiều chi tiết thú vị trong đó và có thể giúp bạn hiểu sâu hơn về Python.