programing

Python에는 왜 태플 이해가 없습니까?

bestcode 2022. 11. 18. 21:37
반응형

Python에는 왜 태플 이해가 없습니까?

다들 알다시피, 리스트 이해라는 게 있죠.

[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))

will will will will will will will will will will will will a a a a a a a a a a a a a a a가 아닌 로 끝납니다.tuple 그럴까왜런그 일일?

내 추측으로는tuple불변하지만, 이것이 정답은 아닌 것 같습니다.

제너레이터 식을 사용할 수 있습니다.

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

생성기 식에는 괄호가 이미 사용되었습니다.

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

#python tip: 일반적으로 리스트는 루프용, tuples는 구조용입니다.리스트는 동종이며, 튜플은 이종입니다.가변 길이 목록입니다.

이는 시퀀스 내의 항목이 생성기에 의해 생성될 수 있을 만큼 관련성이 있다면 목록이 되어야 한다는 생각을 뒷받침합니다.태플은 반복 가능하고 단순히 불변의 목록처럼 보이지만 실제로는 C 구조와 동등한 Python입니다.

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

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

Python이 되다

x = (3, 'g', 5.9)

Python 3.5부터 splat을 사용할 수도 있습니다.*구문을 언팩하여 제너레이터 식을 언팩합니다.

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

포스터로 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★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
    

python 버전:

$ python3 --version
Python 3.6.3

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

이해는 항목을 루프 또는 반복하여 컨테이너에 할당하는 방식으로 작동하며, 태플은 할당을 받을 수 없습니다.

일단 생성된 태플은 추가, 확장 또는 할당할 수 없습니다.태플을 수정하는 유일한 방법은 오브젝트 중 하나를 (비태플 컨테이너)에 할당할 수 있는 경우입니다.왜냐하면 튜플은 그런 종류의 물건에 대한 참조만 가지고 있기 때문입니다.

또한 - 태플에는 자체 생성자가 있습니다.tuple()반복자라면 누구나 할 수 있습니다., 태플을 , , , , , , , , , , , , , , , , , , , , , , , 을 할 수

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

내 추측으로는 괄호가 다 떨어져서 "추악한" 구문을 추가하는 것이 충분히 유용하지 않다고 생각했을 것이다.

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

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

그것은 지금 하고 있는 것과 같습니다: tuple([이해력]).

괄호는 태플을 작성하지 않습니다.일명 one = (2)은 태플이 아닙니다.유일한 방법은 하나 = (2), 또는 하나 = 태플(2)입니다.해결책은 다음과 같습니다.

tuple(i for i in myothertupleorlistordict) 

단순히 명확성을 위해서라고 생각합니다.우리는 언어를 너무 많은 다른 기호로 혼란스럽게 하고 싶지 않습니다.또,tuple이해는 절대 필요하지 않습니다. 리스트 이해와는 달리 리스트는 무시해도 될 정도의 속도 차이로 대신 사용될 수 있습니다.

python (3.5)에서 generator를 사용하여deque부터collections를 사용하는 것보다 약간 더 빠릅니다.list이해:

>>> from collections import deque
>>> timeit.timeit(lambda: tuple([i for i in range(10000000)]),number=10)
9.294099200000005
>>> timeit.timeit(lambda: tuple(deque((i for i in range(10000000)))),number=10)
9.007653800000014

항목을 태플에 추가할 수 없기 때문입니다.이것이 간단한 목록 이해를 보다 기본적인 파이썬 코드로 변환할 수 있는 방법입니다.

_list = [1,2,3,4,5]
clist = [ i*i for i in _list ]
print(clist)

clist1 = []
for i in _list:
    clist1.append(i*i)
print(clist1)

위의 예에서 튜플 이해를 사용한다는 것은 허용되지 않는 튜플에 항목을 추가하는 것을 의미합니다.이 목록이 준비되면 를 사용하여 이 목록을 태플로 변환할 수 있습니다.tuple(clist1)

목록 이해에서 튜플을 생성할 수 있습니다.다음 예제에서는 두 개의 숫자를 차례로 태플에 추가하고 숫자 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

반응형