Programing

파이썬에서 왜 튜플 이해가 없는가?

lottogame 2020. 3. 24. 07:59
반응형

파이썬에서 왜 튜플 이해가 없는가?


우리 모두 알고 있듯이 다음과 같은 목록 이해력이 있습니다.

[i for i in [1, 2, 3, 4]]

그리고 사전 이해력이 있습니다.

{i:j for i, j in {1: 'a', 2: 'b'}.items()}

그러나

(i for i in (1, 2, 3))

tuple이해력이 아닌 발전기로 끝납니다 . 왜 그런 겁니까?

내 생각에 a tuple는 변경할 수 없지만 이것이 대답이 아닌 것 같습니다.


생성기 표현식을 사용할 수 있습니다.

tuple(i for i in (1, 2, 3))

그러나 괄호는 이미 ... 발전기 표현에 사용되었습니다.


Raymond Hettinger (Python 핵심 개발자 중 하나)는 최근 트윗 에서 튜플에 대해 다음과 같이 말했습니다 .

#python tip : 일반적으로리스트는 루핑 용입니다. 구조체에 대한 튜플. 목록은 동종입니다. 이종 튜플. 가변 길이를 나열합니다.

이것은 (나에게) 시퀀스의 항목이 생성기에 의해 생성 될만큼 충분히 관련되어 있다면 목록이어야한다는 아이디어를 지원합니다. 튜플은 반복 가능하고 단순히 불변 목록처럼 보이지만 실제로는 C 구조체와 동등한 Python입니다.

struct {
    int a;
    char b;
    float c;
} foo;

struct foo x = { 3, 'g', 5.9 };

파이썬이된다

x = (3, 'g', 5.9)

Python 3.5부터 splat *unpacking 구문을 사용하여 생성기 expresion을 풀 수 있습니다 .

*(x for x in range(10)),

이해는 항목을 반복하거나 반복하여 컨테이너에 할당하여 작동합니다. Tuple은 할당을받을 수 없습니다.

튜플이 생성되면 추가, 확장 또는 할당 할 수 없습니다. 튜플을 수정하는 유일한 방법은 객체 중 하나를 할당 할 수있는 경우 (비 튜플 컨테이너)입니다. Tuple은 해당 종류의 객체에 대한 참조 만 보유하기 때문입니다.

또한 튜플에는 tuple()반복자를 제공 할 수있는 자체 생성자 가 있습니다. 튜플을 만들려면 다음을 수행 할 수 있습니다.

tuple(i for i in (1,2,3))

다른 포스터에서 macm언급했듯이 발전기에서 튜플을 만드는 가장 빠른 방법은 tuple([generator])입니다.


성능 비교

  • 목록 이해 :

    $ python3 -m timeit "a = [i for i in range(1000)]"
    10000 loops, best of 3: 27.4 usec per loop
    
  • 목록 이해에서 튜플 :

    $ python3 -m timeit "a = tuple([i for i in range(1000)])"
    10000 loops, best of 3: 30.2 usec per loop
    
  • 발전기에서 튜플 :

    $ python3 -m timeit "a = tuple(i for i in range(1000))"
    10000 loops, best of 3: 50.4 usec per loop
    
  • 포장 풀기에서 튜플 :

    $ python3 -m timeit "a = *(i for i in range(1000)),"
    10000 loops, best of 3: 52.7 usec per loop
    

내 파이썬 버전 :

$ python3 --version
Python 3.6.3

따라서 성능이 문제가되지 않는 한 목록 이해력에서 항상 튜플을 만들어야합니다.


내 최선의 추측은 대괄호가 부족하고 "추악한"구문을 추가하는 것이 유용 할 것이라고 생각하지 않았다는 것입니다 ...


튜플은 목록처럼 효율적으로 추가 할 수 없습니다.

따라서 튜플 이해력은 내부적으로 목록을 사용한 다음 튜플로 변환해야합니다.

그것은 당신이 지금하는 것과 똑같을 것입니다 : tuple ([comprehension])


괄호는 튜플을 만들지 않습니다. 일명 one = (two)는 튜플이 아닙니다. 유일한 방법은 one = (two,) 또는 one = tuple (two)입니다. 해결책은 다음과 같습니다.

tuple(i for i in myothertupleorlistordict) 

나는 그것이 명확성을 위해 단순히 있다고 생각합니다. 우리는 너무 많은 다른 기호로 언어를 어지럽히고 싶지 않습니다. 또한 tuple이해는 필요 하지 않습니다 .리스트 이해와 반대되는 dict 이해와 달리 무시할 수있는 속도 차이로리스트를 대신 사용할 수 있습니다.


리스트 이해에서 튜플을 생성 할 수 있습니다. 다음은 튜플에 두 개의 숫자를 순차적으로 추가하고 숫자 0-9의 목록을 제공합니다.

>>> print k
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> r= [tuple(k[i:i+2]) for i in xrange(10) if not i%2]
>>> print r
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]

참고 URL : https://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python

반응형