Apakah arr .__ len __ () cara yang disukai untuk mendapatkan panjang array dalam Python?

727

Dalam Python , apakah ini satu-satunya cara untuk mendapatkan jumlah elemen?

arr.__len__()

Jika demikian, mengapa sintaks anehnya?

Joan Venge
sumber

Jawaban:

1229
my_list = [1,2,3,4,5]
len(my_list)
# 5

Pekerjaan yang sama untuk tuple:

my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

Dan string, yang sebenarnya hanya array karakter:

my_string = 'hello world'
len(my_string)
# 11

Itu sengaja dilakukan dengan cara ini sehingga daftar, tupel dan jenis wadah lainnya atau iterables tidak semua perlu secara eksplisit menerapkan .length()metode publik , sebagai gantinya Anda hanya dapat memeriksa len()apa pun yang menerapkan metode 'ajaib' __len__().

Tentu, ini mungkin tampak berlebihan, tetapi implementasi pengecekan panjang dapat sangat bervariasi, bahkan dalam bahasa yang sama. Ini tidak biasa untuk melihat satu tipe koleksi menggunakan .length()metode sementara tipe lain menggunakan .lengthproperti, sementara yang lain menggunakan .count(). Memiliki kata kunci tingkat bahasa menyatukan titik masuk untuk semua jenis ini. Jadi, bahkan objek yang mungkin tidak Anda pertimbangkan sebagai daftar elemen masih dapat diperiksa panjang. Ini termasuk string, antrian, pohon, dll.

Sifat fungsional len()juga cocok dengan gaya pemrograman fungsional.

lengths = map(len, list_of_containers)
Soviut
sumber
8
len () adalah perintah bahasa, __len __ () adalah metode pada tipe kontainer.
Soviut
33
len () adalah fungsi global, builtin; __len __ () adalah metode yang dapat diterapkan objek. len (foo) biasanya berakhir dengan memanggil foo .__ len __ ().
Tim Lesher
13
Anda menyebutkan bahwa dengan memasok len () setiap wadah tidak harus menerapkan metode .length (), tetapi bagaimana ini berbeda, jika masing-masing jenis masih menerapkan metode __len __ () yang dipanggil oleh len ()? Apakah berbagai jenis wadah ditangani secara berbeda oleh len ()?
Simon B. Jensen
10
@Simon: bit tentang "tidak semua harus mengimplementasikan .length ()" membingungkan. Jenis kontainer masih perlu menerapkan metode untuk mengembalikan panjangnya; intinya adalah protokol standar, bukan metode ad-hoc yang harus Anda cari untuk setiap jenis. Garis bawah-ganda menandakan ini.
Carl Meyer
16
Saya setuju dengan Carl Meyer - mengatakan bahwa tidak "perlu secara eksplisit menerapkan" metode .length () publik menyesatkan dan pada intinya-makna, salah. Apa pun masih harus menerapkan len , dan selalu dapat dengan mudah menerapkan metode panjang mereka sendiri bernama apa pun yang mereka inginkan - menghindari fungsi len. Jadi saya benar-benar melihat ini sebagai keanehan sewenang-wenang yang cocok dengan cara Guido melihat dunia. Mungkin tidak ada hubungannya dengan alasan universal.
BT
52

Cara Anda mengambil banyak hal yang masuk akal (daftar, kamus, tuple, string, ...) adalah memanggilnya len.

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

Alasan untuk sintaks "aneh" adalah bahwa secara internal python diterjemahkan len(object)menjadi object.__len__(). Ini berlaku untuk objek apa pun. Jadi, jika Anda mendefinisikan beberapa kelas dan masuk akal untuk memiliki panjang, cukup tentukan __len__()metode di atasnya dan kemudian seseorang dapat memanggil leninstance tersebut.

rz.
sumber
23

Python menggunakan mengetik bebek : tidak peduli tentang apa obyek yang , asalkan memiliki antarmuka yang sesuai untuk situasi yang dihadapi. Ketika Anda memanggil fungsi built-in len () pada suatu objek, Anda sebenarnya memanggil metode __len__ internalnya. Objek kustom dapat mengimplementasikan antarmuka ini dan len () akan mengembalikan jawabannya, meskipun objek tidak secara konseptual berurutan.

Untuk daftar lengkap antarmuka, silakan lihat di sini: http://docs.python.org/reference/datamodel.html#basic-customization

UncleZeiv
sumber
23

Cara yang disukai untuk mendapatkan panjang dari objek python adalah dengan mengirimkannya sebagai argumen ke lenfungsi. Secara internal, python kemudian akan mencoba memanggil __len__metode khusus dari objek yang dilewatkan.

David Locke
sumber
22

Cukup gunakan len(arr):

>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
Tim Lesher
sumber
10

Anda dapat menggunakan len(arr) seperti yang disarankan dalam jawaban sebelumnya untuk mendapatkan panjang array. Jika Anda menginginkan dimensi array 2D, Anda dapat menggunakan arr.shapetinggi dan lebar pengembalian

Ahmed Abobakr
sumber
7

len(list_name)fungsi mengambil daftar sebagai parameter dan memanggil __len__()fungsi daftar .

Harun ERGUL
sumber
1

Python menyarankan pengguna menggunakan len()alih-alih __len__()untuk konsistensi, seperti yang dikatakan orang lain. Namun, ada beberapa manfaat lain:

Untuk beberapa built-in jenis seperti list, str, bytearraydan sebagainya, pelaksanaan Cython dari len()mengambil jalan pintas. Secara langsung mengembalikan ob_sizedalam struktur C, yang lebih cepat daripada memanggil __len__().

Jika Anda tertarik pada detail seperti itu, Anda bisa membaca buku yang disebut "Fluent Python" oleh Luciano Ramalho. Ada banyak detail menarik di dalamnya, dan dapat membantu Anda memahami Python lebih dalam.

JOHNKYON
sumber