Là mảng .__ len __ () là cách ưa thích để lấy độ dài của một mảng trong Python?


727

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:


1228
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 .lengthtí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)

8
len () là một lệnh ngôn ngữ, __len __ () là một phương thức trên các loại container.
Soviut

33
len () là một hàm toàn cầu, dựng sẵn; __len __ () là một phương thức mà đối tượng có thể thực hiện. len (foo) thường kết thúc bằng cách gọi foo .__ len __ ().
Tim Lesher

13
Bạn đề cập rằng bằng cách cung cấp len () mỗi container không phải thực hiện phương thức .length (), nhưng nó khác nhau như thế nào, nếu mỗi loại vẫn thực hiện phương thức __len __ () được gọi bởi len () bằng mọi cách? Là các loại container khác nhau được xử lý khác nhau bởi len ()?
Simon B. Jensen

10
@Simon: bit về "không cần phải thực hiện .length ()" là khó hiểu. Các loại container vẫn cần thực hiện một phương thức trả về chiều dài của chúng; vấn đề là đó là một giao thức được tiêu chuẩn hóa, không phải là một phương pháp đặc biệt mà bạn phải tìm kiếm cho từng loại. Các dấu gạch dưới kép biểu thị điều này.
Carl Meyer

16
Tôi đồng ý với Carl Meyer - nói rằng "không cần phải thực hiện rõ ràng" một phương thức .length () công khai là sai lệch và ở ý nghĩa cốt lõi của nó, không chính xác. Bất cứ điều gì vẫn sẽ phải thực hiện len và luôn có thể thực hiện đơn giản phương thức độ dài của riêng chúng được đặt tên bất cứ thứ gì chúng muốn - phá vỡ hàm len. Vì vậy, thực sự tôi thấy điều này như một sự kỳ lạ tùy tiện phù hợp với cách Guido nhìn thế giới. Nó có lẽ không có gì để làm với bất kỳ lý luận phổ quát.
BT

52

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 lennó.

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 lencác trường hợp đó.


23

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


23

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 lenhà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.


22

Chỉ cần sử dụng len(arr):

>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1

10

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.shapetrả về chiều cao và chiều rộng


7

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 .


1

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, bytearrayvà 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_sizecấ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.