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
'programing' 카테고리의 다른 글
python 추적 분할 결함 (0) | 2022.11.18 |
---|---|
Java에서는 상수 클래스를 어떻게 정의합니까? (0) | 2022.11.18 |
워치 핸들러 vuejs의 데이터 변수에 액세스할 수 없음 (0) | 2022.11.17 |
PHP: array_map 함수로 인덱스를 가져올 수 있습니까? (0) | 2022.11.17 |
__hash__()를 구현하는 올바르고 좋은 방법은 무엇입니까? (0) | 2022.11.17 |