Is arr.__len__() the preferred way to get the length of an array in Python?

前端 未结 8 1008
悲哀的现实
悲哀的现实 2020-12-04 05:18

In Python, is the following the only way to get the number of elements?

arr.__len__()

If so, why the strange syntax?

相关标签:
8条回答
  • 2020-12-04 05:21
    my_list = [1,2,3,4,5]
    len(my_list)
    # 5
    

    The same works for tuples:

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

    And strings, which are really just arrays of characters:

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

    It was intentionally done this way so that lists, tuples and other container types or iterables didn't all need to explicitly implement a public .length() method, instead you can just check the len() of anything that implements the 'magic' __len__() method.

    Sure, this may seem redundant, but length checking implementations can vary considerably, even within the same language. It's not uncommon to see one collection type use a .length() method while another type uses a .length property, while yet another uses .count(). Having a language-level keyword unifies the entry point for all these types. So even objects you may not consider to be lists of elements could still be length-checked. This includes strings, queues, trees, etc.

    The functional nature of len() also lends itself well to functional styles of programming.

    lengths = map(len, list_of_containers)
    
    0 讨论(0)
  • 2020-12-04 05:23

    Just use len(arr):

    >>> import array
    >>> arr = array.array('i')
    >>> arr.append('2')
    >>> arr.__len__()
    1
    >>> len(arr)
    1
    
    0 讨论(0)
  • 2020-12-04 05:30

    Python uses duck typing: it doesn't care about what an object is, as long as it has the appropriate interface for the situation at hand. When you call the built-in function len() on an object, you are actually calling its internal __len__ method. A custom object can implement this interface and len() will return the answer, even if the object is not conceptually a sequence.

    For a complete list of interfaces, have a look here: http://docs.python.org/reference/datamodel.html#basic-customization

    0 讨论(0)
  • 2020-12-04 05:30

    Python suggests users use len() instead of __len__() for consistency, just like other guys said. However, There're some other benefits:

    For some built-in types like list, str, bytearray and so on, the Cython implementation of len() takes a shortcut. It directly returns the ob_size in a C structure, which is faster than calling __len__().

    If you are interested in such details, you could read the book called "Fluent Python" by Luciano Ramalho. There're many interesting details in it, and may help you understand Python more deeply.

    0 讨论(0)
  • 2020-12-04 05:31

    len(list_name) function takes list as a parameter and it calls list's __len__() function.

    0 讨论(0)
  • 2020-12-04 05:37

    you can use len(arr) as suggested in previous answers to get the length of the array. In case you want the dimensions of a 2D array you could use arr.shape returns height and width

    0 讨论(0)
提交回复
热议问题