arr .__ len __ ()은 파이썬에서 배열의 길이를 얻는 데 선호되는 방법입니까?


727

에서 파이썬 , 요소의 수를 얻을 수있는 다음과 같은 유일한 방법은 무엇입니까?

arr.__len__()

그렇다면 왜 이상한 구문입니까?

답변:


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

튜플도 마찬가지입니다.

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

그리고 문자열은 실제로 문자 배열입니다.

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

목록, 튜플 및 기타 컨테이너 유형 또는 반복 가능 항목이 모두 공개 메소드 를 명시 적으로 구현할 필요가 없도록 의도적으로 이러한 방식으로 수행 되었습니다 .length(). 대신 len()'매직' __len__()메소드 를 구현하는 모든 항목을 확인할 수 있습니다 .

물론 이것은 중복되는 것처럼 보일 수 있지만 동일한 언어 내에서도 길이 검사 구현은 상당히 다를 수 있습니다. 한 컬렉션 유형이 .length()메서드를 사용하는 반면 다른 유형이 .length속성을 사용하는 반면 다른 유형이 속성을 사용하는 것을 보는 것은 드문 일이 아닙니다 .count(). 언어 수준의 키워드가 있으면 이러한 모든 유형의 진입 점이 통합됩니다. 따라서 요소 목록으로 간주되지 않는 개체도 여전히 길이를 확인할 수 있습니다. 여기에는 문자열, 대기열, 나무 등이 포함됩니다.

기능적 특성은 len()기능적 스타일의 프로그래밍에도 적합합니다.

lengths = map(len, list_of_containers)

8
len ()은 언어 명령이고 __len __ ()은 컨테이너 유형에 대한 메소드입니다.
Soviut

33
len ()은 전역 내장 함수입니다. __len __ ()은 객체가 구현할 수있는 메서드입니다. len (foo)는 보통 foo .__ len __ ()을 호출합니다.
Tim Lesher

13
len ()을 제공함으로써 각 컨테이너가 .length () 메소드를 구현할 필요는 없지만 각 유형이 여전히 len ()에 의해 호출되는 __len __ () 메소드를 구현하는 경우 어떻게 다른가? 다른 컨테이너 유형이 len ()에 의해 다르게 처리됩니까?
Simon B. Jensen

10
@Simon : ".length ()를 모두 구현할 필요는 없다"라는 부분이 혼란 스럽다. 컨테이너 유형은 여전히 ​​길이를 반환하는 메소드를 구현해야합니다. 요점은이 프로토콜이 표준화 된 프로토콜이며 각 유형에 대해 찾아야하는 임시 방법이 아니라는 것입니다. 이중 밑줄은 이것을 나타냅니다.
Carl Meyer

16
Carl Meyer에 동의합니다. 공개 .length () 메소드를 "명시 적으로 구현할 필요가 없다"고 오해의 소지가 있으며 핵심 의미가 올바르지 않습니다. 무엇이든 여전히 len 을 구현해야 하며 len 함수를 우회하여 원하는 이름의 길이 메소드를 항상 간단하게 구현할 수 있습니다. 그래서 저는 이것을 귀도가 세상을 보는 방식에 맞는 임의의 이상한 것으로보고 있습니다. 아마도 보편적 인 추론과는 아무런 관련이 없습니다.
BT

52

이해하기 쉬운 길이 (리스트, 딕셔너리, 튜플, 문자열 등)를 사용하는 방법이 len있습니다.

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

"이상한"구문의 이유는 내부적으로 파이썬이로 변환 len(object)되기 때문 object.__len__()입니다. 이것은 모든 객체에 적용됩니다. 따라서 클래스를 정의하고 길이를 갖는 것이 합리적이라면 __len__()메소드를 정의하면 len해당 인스턴스를 호출 할 수 있습니다 .


23

파이썬은 오리 타이핑을 사용합니다 : 상황에 맞는 적절한 인터페이스를 가지고 있다면 객체 무엇인지 신경 쓰지 않습니다 . 객체에서 내장 함수 len ()을 호출하면 실제로 내부 __len__ 메서드를 호출하게됩니다. 커스텀 객체는이 인터페이스를 구현할 수 있으며, 객체가 개념적으로 시퀀스가 ​​아니더라도 len ()은 응답을 반환합니다.

전체 인터페이스 목록을 보려면 여기를 참조 하십시오. http://docs.python.org/reference/datamodel.html#basic-customization


23

파이썬 객체의 길이를 얻는 가장 좋은 방법은 len함수에 인수로 전달하는 것입니다. 내부적으로 파이썬 __len__은 전달 된 객체 의 특수 메소드 를 호출하려고 시도합니다 .


22

그냥 사용하십시오 len(arr):

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

10

당신이 사용할 수있는 len(arr) 배열의 길이를 얻기 위해 이전 답변에서 제안. 2D 배열의 치수를 원할 경우 arr.shape높이와 너비를 반환 할 수 있습니다


7

len(list_name)function은 list를 매개 변수로 사용하고 list의 __len__()함수를 호출합니다 .


1

파이썬은 다른 사람들이 말한 것처럼 일관성 len()대신에 사용자가 사용하도록 제안합니다 __len__(). 그러나 몇 가지 다른 이점이 있습니다.

일부는 내장의 경우 같은 종류의 list, str, bytearray등의 사이 썬 구현은 len()바로 가기를합니다. ob_size호출하는 것보다 빠른 C 구조로 직접를 반환합니다 __len__().

이러한 세부 사항에 관심이 있다면 Luciano Ramalho의 "Fluent Python"이라는 책을 읽을 수 있습니다. 여기에는 많은 흥미로운 세부 사항이 있으며 파이썬을 더 깊이 이해하는 데 도움이 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.