포장 풀기, 확장 포장 풀기 및 중첩 확장 포장 풀기
다음 식을 고려해 보십시오.일부 식을 반복하여 "컨텍스트"를 표시합니다.
(긴 목록입니다)
a, b = 1, 2 # simple sequence assignment
a, b = ['green', 'blue'] # list asqignment
a, b = 'XY' # string assignment
a, b = range(1,5,2) # any iterable will do
# nested sequence assignment
(a,b), c = "XY", "Z" # a = 'X', b = 'Y', c = 'Z'
(a,b), c = "XYZ" # ERROR -- too many values to unpack
(a,b), c = "XY" # ERROR -- need more than 1 value to unpack
(a,b), c, = [1,2],'this' # a = '1', b = '2', c = 'this'
(a,b), (c,) = [1,2],'this' # ERROR -- too many values to unpack
# extended sequence unpacking
a, *b = 1,2,3,4,5 # a = 1, b = [2,3,4,5]
*a, b = 1,2,3,4,5 # a = [1,2,3,4], b = 5
a, *b, c = 1,2,3,4,5 # a = 1, b = [2,3,4], c = 5
a, *b = 'X' # a = 'X', b = []
*a, b = 'X' # a = [], b = 'X'
a, *b, c = "XY" # a = 'X', b = [], c = 'Y'
a, *b, c = "X...Y" # a = 'X', b = ['.','.','.'], c = 'Y'
a, b, *c = 1,2,3 # a = 1, b = 2, c = [3]
a, b, c, *d = 1,2,3 # a = 1, b = 2, c = 3, d = []
a, *b, c, *d = 1,2,3,4,5 # ERROR -- two starred expressions in assignment
(a,b), c = [1,2],'this' # a = '1', b = '2', c = 'this'
(a,b), *c = [1,2],'this' # a = '1', b = '2', c = ['this']
(a,b), c, *d = [1,2],'this' # a = '1', b = '2', c = 'this', d = []
(a,b), *c, d = [1,2],'this' # a = '1', b = '2', c = [], d = 'this'
(a,b), (c, *d) = [1,2],'this' # a = '1', b = '2', c = 't', d = ['h', 'i', 's']
*a = 1 # ERROR -- target must be in a list or tuple
*a = (1,2) # ERROR -- target must be in a list or tuple
*a, = (1,2) # a = [1,2]
*a, = 1 # ERROR -- 'int' object is not iterable
*a, = [1] # a = [1]
*a = [1] # ERROR -- target must be in a list or tuple
*a, = (1,) # a = [1]
*a, = (1) # ERROR -- 'int' object is not iterable
*a, b = [1] # a = [], b = 1
*a, b = (1,) # a = [], b = 1
(a,b),c = 1,2,3 # ERROR -- too many values to unpack
(a,b), *c = 1,2,3 # ERROR - 'int' object is not iterable
(a,b), *c = 'XY', 2, 3 # a = 'X', b = 'Y', c = [2,3]
# extended sequence unpacking -- NESTED
(a,b),c = 1,2,3 # ERROR -- too many values to unpack
*(a,b), c = 1,2,3 # a = 1, b = 2, c = 3
*(a,b) = 1,2 # ERROR -- target must be in a list or tuple
*(a,b), = 1,2 # a = 1, b = 2
*(a,b) = 'XY' # ERROR -- target must be in a list or tuple
*(a,b), = 'XY' # a = 'X', b = 'Y'
*(a, b) = 'this' # ERROR -- target must be in a list or tuple
*(a, b), = 'this' # ERROR -- too many values to unpack
*(a, *b), = 'this' # a = 't', b = ['h', 'i', 's']
*(a, *b), c = 'this' # a = 't', b = ['h', 'i'], c = 's'
*(a,*b), = 1,2,3,3,4,5,6,7 # a = 1, b = [2, 3, 3, 4, 5, 6, 7]
*(a,*b), *c = 1,2,3,3,4,5,6,7 # ERROR -- two starred expressions in assignment
*(a,*b), (*c,) = 1,2,3,3,4,5,6,7 # ERROR -- 'int' object is not iterable
*(a,*b), c = 1,2,3,3,4,5,6,7 # a = 1, b = [2, 3, 3, 4, 5, 6], c = 7
*(a,*b), (*c,) = 1,2,3,4,5,'XY' # a = 1, b = [2, 3, 4, 5], c = ['X', 'Y']
*(a,*b), c, d = 1,2,3,3,4,5,6,7 # a = 1, b = [2, 3, 3, 4, 5], c = 6, d = 7
*(a,*b), (c, d) = 1,2,3,3,4,5,6,7 # ERROR -- 'int' object is not iterable
*(a,*b), (*c, d) = 1,2,3,3,4,5,6,7 # ERROR -- 'int' object is not iterable
*(a,*b), *(c, d) = 1,2,3,3,4,5,6,7 # ERROR -- two starred expressions in assignment
*(a,b), c = 'XY', 3 # ERROR -- need more than 1 value to unpack
*(*a,b), c = 'XY', 3 # a = [], b = 'XY', c = 3
(a,b), c = 'XY', 3 # a = 'X', b = 'Y', c = 3
*(a,b), c = 'XY', 3, 4 # a = 'XY', b = 3, c = 4
*(*a,b), c = 'XY', 3, 4 # a = ['XY'], b = 3, c = 4
(a,b), c = 'XY', 3, 4 # ERROR -- too many values to unpack
어떻게 손으로 그러한 표현의 결과를 정확하게 추론할 수 있습니까?
이 게시물의 길이가 길어져 죄송합니다만, 저는 완전성을 선택하기로 결정했습니다.
몇 가지 기본적인 규칙을 알고 나면 일반화하는 것은 어렵지 않습니다.몇 가지 예를 들어 설명하도록 최선을 다하겠습니다.당신이 이러한 "손으로" 평가하는 것에 대해 이야기하고 있기 때문에, 저는 몇 가지 간단한 대체 규칙을 제안하겠습니다.기본적으로 반복 가능한 모든 항목의 형식이 동일하면 식을 더 쉽게 이해할 수 있습니다.
포장을 풀 때만 다음과 같은 대체품이 오른쪽에서 사용됩니다.=
(즉, r값의 경우):
'XY' -> ('X', 'Y')
['X', 'Y'] -> ('X', 'Y')
값이 압축 해제되지 않으면 대체를 실행 취소합니다.(자세한 내용은 아래를 참조하십시오.)
또한 "벌거벗은" 쉼표가 표시되면 최상위 튜플이 있는 것으로 가정합니다.왼쪽과 오른쪽 모두에서 이 작업을 수행합니다(예: l 값 및 r 값).
'X', 'Y' -> ('X', 'Y')
a, b -> (a, b)
이러한 간단한 규칙을 염두에 두고 몇 가지 예를 들어 보겠습니다.
(a,b), c = "XY", "Z" # a = 'X', b = 'Y', c = 'Z'
위의 규칙을 적용하여 변환합니다."XY"
('X', 'Y')
벌거벗은 쉼표를 괄호 안에 넣습니다.
((a, b), c) = (('X', 'Y'), 'Z')
여기서 시각적 대응은 과제가 어떻게 작동하는지를 꽤 분명하게 만듭니다.
다음은 잘못된 예입니다.
(a,b), c = "XYZ"
위의 대체 규칙에 따라 다음과 같은 결과를 얻을 수 있습니다.
((a, b), c) = ('X', 'Y', 'Z')
이것은 분명히 잘못된 것입니다. 중첩된 구조가 일치하지 않습니다.이제 좀 더 복잡한 예에서 어떻게 작동하는지 살펴보겠습니다.
(a,b), c, = [1,2],'this' # a = '1', b = '2', c = 'this'
위의 규칙을 적용하면, 우리는 다음을 얻습니다.
((a, b), c) = ((1, 2), ('t', 'h', 'i', 's'))
볼 때 확실합니다.'this'
풀지 압을풀않직할당됩다니접에축에 됩니다.c
그래서 우리는 대체를 취소합니다.
((a, b), c) = ((1, 2), 'this')
이제 마무리할 때 어떤 일이 일어나는지 봅시다.c
투플로:
(a,b), (c,) = [1,2],'this' # ERROR -- too many values to unpack
된다
((a, b), (c,)) = ((1, 2), ('t', 'h', 'i', 's'))
다시 말하지만, 오류는 명백합니다. c
더 변수가 는 더이상벌변아시내변부수오퀀의로이른있다해압는해시니됩제축가로 압축이 풀립니다.(c,)
하지만 시퀀스의 길이가 달라서 오류가 있습니다.
이제다사확여포해장제다니합장을용을 포장 .*
. 은 좀 더꽤 .이것은 좀 더 복잡하지만, 여전히 꽤 간단합니다. 다에음표다니시됩이수▁by 앞에 오는 입니다.*
변수 이름에 할당되지 않은 해당 시퀀스의 항목을 포함하는 목록이 됩니다.아주 간단한 예로 시작합니다.
a, *b, c = "X...Y" # a = 'X', b = ['.','.','.'], c = 'Y'
이것은
(a, *b, c) = ('X', '.', '.', '.', 'Y')
이것을 분석하는 가장 간단한 방법은 끝에서부터 작업하는 것입니다. 'X'
a
그리고.'Y'
c
시퀀스의 나머지 값은 목록에 저장되고 다음에 할당됩니다.b
.
L 값은 다음과 같습니다.(*a, b)
그리고.(a, *b)
위의 특별한 경우일 뿐입니다.두 개를 가질 수 없습니다.*
모호하기 때문에 하나의 l값 시퀀스 내의 연산자입니다.와 같은 요?(a, *b, *c, d)
b
또는c
제가 잠시 후에 중첩된 사례를 고려해 보겠습니다.
*a = 1 # ERROR -- target must be in a list or tuple
여기서 오류는 상당히 자명합니다.대상)*a
는 튜플 는 튜플 상태여야 합니다.
*a, = (1,2) # a = [1,2]
이것은 쉼표가 없기 때문에 작동합니다.규칙을 적용하는 중...
(*a,) = (1, 2)
가 없기 *a
,*a
sequence.rvalue의 에 빠트립니다.만약 당신이 그것을 교체한다면?(1, 2)
하나의 값으로?
*a, = 1 # ERROR -- 'int' object is not iterable
된다
(*a,) = 1
다시 말하지만, 여기의 오류는 자명합니다.풀 수 시스가아포풀장없수다습니을은것닌퀀▁you▁something다▁that없,니▁and습'.*a
짐을 풀 무언가가 필요합니다.그래서 우리는 그것을 순서대로 배열했습니다.
*a, = [1] # a = [1]
이에 해당하는 것은
(*a,) = (1,)
의 흔한입니다: 마막으로일, 이것반로혼점동는입다니되으적은지다▁finally점.(1)
는 와동합다니와 .1
튜플과 산술 문을 구분하려면 쉼표가 필요합니다.
*a, = (1) # ERROR -- 'int' object is not
이제 둥지를 틀겠습니다.실제로 이 예제는 "NESTED" 섹션에 있지 않았습니다. 아마도 중첩된 것을 깨닫지 못하셨습니까?
(a,b), *c = 'XY', 2, 3 # a = 'X', b = 'Y', c = [2,3]
된다
((a, b), *c) = (('X', 'Y'), 2, 3)
첫이 할당됩니다.2
그리고.3
에됩니다.c
우리가 예상한 대로
(a,b),c = 1,2,3 # ERROR -- too many values to unpack
*(a,b), c = 1,2,3 # a = 1, b = 2, c = 3
첫 번째 줄에 오류가 발생하는 이유는 이미 위에서 설명했습니다.두 번째 줄은 어리석지만 작동하는 이유는 다음과 같습니다.
(*(a, b), c) = (1, 2, 3)
앞에서 설명한 바와 같이, 우리는 끝에서 끝까지 일합니다. 3
c
할 때 변수가 할당됩니다.*
앞에, 에는, 그전에이, 는에경우에,,(a, b)
그래서 그것은 다음과 같습니다.(a, b) = (1, 2)
적절한 수의 요소가 있기 때문에 작동하게 됩니다.저는 이것이 작동 코드에 나타날 어떤 이유도 생각할 수 없습니다.유하게사,
*(a, *b), c = 'this' # a = 't', b = ['h', 'i'], c = 's'
된다
(*(a, *b), c) = ('t', 'h', 'i', 's')
일을 , 서끝지일것은는하까끝,'s'
c
,그리고.('t', 'h', 'i')
(a, *b)
끝서다시하서면일을에▁working끝,.'t'
a
,그리고.('h', 'i')
목록으로 b에 할당됩니다.이것은 작동 코드에서 절대로 나타나지 말아야 할 또 다른 어리석은 예입니다.
저는 파이썬 2 튜플이 꽤 쉽게 풀린다고 생각합니다.왼쪽의 각 이름은 전체 시퀀스 또는 오른쪽의 시퀀스에 있는 단일 항목과 일치합니다.이름이 시퀀스의 단일 항목에 해당하는 경우 모든 항목을 포함할 수 있는 충분한 이름이 있어야 합니다.
그러나 확장 포장 풀기는 매우 강력하기 때문에 확실히 혼란스러울 수 있습니다.현실은 당신이 제시한 마지막 10개 혹은 그 이상의 유효한 예들을 절대 하지 말아야 한다는 것입니다. 만약 데이터가 그렇게 구조화되었다면, 그것은 다음과 같아야 합니다.dict
또는 목록과 같은 비정형 형식이 아닌 클래스 인스턴스입니다.
분명히, 새로운 구문이 남용될 수 있습니다.당신의 질문에 대한 대답은 당신이 그런 표현들을 읽을 필요가 없다는 것입니다. 그것들은 나쁜 관행이고 저는 그것들이 사용될지 의심스럽습니다.
당신이 임의로 복잡한 표현을 쓸 수 있다고 해서 당신이 해야 한다는 것을 의미하지는 않습니다.다음과 같은 코드를 작성할 수 있습니다.map(map, iterable_of_transformations, map(map, iterable_of_transformations, iterable_of_iterables_of_iterables))
하지만 당신은 그렇지 않습니다.
당신의 코드가 그것을 표현하기 위해 다른 형태를 사용하는 것은 오해를 불러일으킬 수 있다고 생각합니다.
연산자 우선 순위에 대한 질문을 피하기 위해 식에 추가 대괄호를 사용하는 것과 같습니다.코드를 읽기 쉽게 만드는 데는 항상 좋은 투자가 아닙니다.
저는 스왑과 같은 간단한 작업에만 압축 풀기를 사용하는 것을 선호합니다.
lhs에서 별표로 표시된 표현의 원래 아이디어는 아래와 같이 가독성을 향상시키는 것입니다.
first_param, rest_param, third_param = param[0], param[1:-1], param[-1]
이 진술은 다음과 같습니다.
first_param, *rest_param, third_param = param
위의은 '대상에 되지 않은 요소를 데 됩니다.first_param
&third_param
에서는)
lhs에서 별표 표현식을 사용하는 방법은 다음과 같은 규칙이 있습니다.
- lhs에서 최대 하나의 별이 붙은 표현식, 그렇지 않으면 언팩이 고유하지 않을 것입니다.
*a,b,*c = range(5) # wrong
*a,b,c = range(5) # right
a,*b,c = range(5) # right
- '휴식' 요소를 수집하려면 별표 식을 필수 대상과 함께 사용해야 합니다.필수 대상이 존재하지 않음을 나타내는 데 후행 쉼표가 사용됩니다.
*a = range(5) # wrong
*a, = range(5) # right
만약 당신이 이 두 규칙을 마스터한다면, 당신은 lhs에서 별표가 붙은 표현의 결과를 추론할 수 있다고 믿습니다.
언급URL : https://stackoverflow.com/questions/6967632/unpacking-extended-unpacking-and-nested-extended-unpacking
'it-source' 카테고리의 다른 글
MVVM 모델에서 모델은 INOTIFY를 구현해야 합니다.속성 변경된 인터페이스? (0) | 2023.05.16 |
---|---|
우리는 언제 조개 변수 주변에 곱슬곱슬한 중괄호가 필요합니까? (0) | 2023.05.16 |
제가 다른 사람의 개인 Github repo를 제 계정으로 포크하면 제 계정에 공용 repo로 표시되나요? (0) | 2023.05.16 |
Postgre의 일부로 정수를 문자열로 변환하는 방법SQL 쿼리? (0) | 2023.05.16 |
C# 또는 에서 본 것 중 가장 이상한 코너 케이스는 무엇입니까?NET? (0) | 2023.05.16 |