소개
unpacking의 기본적인 제한 사항 중 하나는 unpacking하는 sequence의 길이를 미리 알고 있어야 한다는 것입니다.
그것을 하는 방법..
random_numbers = [0, 1, 5, 9, 17, 12, 7, 10, 3, 2] random_numbers_descending = sorted(random_numbers, reverse=True) print(f"Output \n*** {random_numbers_descending}")
출력
*** [17, 12, 10, 9, 7, 5, 3, 2, 1, 0]
이제 숫자에서 가장 큰 값과 두 번째로 큰 값을 찾으려면 "풀기할 값이 너무 많습니다"라는 예외가 발생합니다.
print(f"Output \n*** Getting the largest and second largest") largest, second_largest = random_numbers_descending
출력
*** Getting the largest and second largest
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 1 print(f"Output \n*** Getting the largest and second largest") ----> 2 largest, second_largest = random_numbers_descending ValueError: too many values to unpack (expected 2)
파이썬은 종종 인덱싱과 슬라이싱에 의존합니다. 예를 들어 아래 항목 목록에서 가장 큰 것, 두 번째로 큰 것을 추출하고 싶을 때 우리가 할 수 있는 방법입니다.
largest = random_numbers_descending[0] print(f"Output \n*** Getting the largest - {largest}")
출력
*** Getting the largest - 17
second_largest = random_numbers_descending[1] print(f"Output \n*** Getting the second largest - {second_largest}")
출력
*** Getting the second largest - 12
rest_of_numbers = random_numbers_descending[2:] print(f"Output \n*** Getting the rest of numbers - {rest_of_numbers}")
출력
*** Getting the rest of numbers - [10, 9, 7, 5, 3, 2, 1, 0]
이것이 작동하는 동안 모든 인덱싱 및 슬라이싱은 시각적으로 시끄럽습니다. 실제로 이러한 방식으로 시퀀스의 구성원을 다양한 하위 집합으로 나누는 것은 오류가 발생하기 쉽습니다.
이를 더 잘 수행하기 위해 Python은 별표 표시된 표현식을 통해 포괄적인 압축 풀기를 지원합니다.
이 별표 표시된 구문을 사용하면 압축 풀기 할당의 한 부분이 압축 풀기 패턴의 다른 부분과 일치하지 않는 모든 값을 받을 수 있습니다.
largest,second_largest, *rest_of_numbers = random_numbers_descending print(f"Output \n largest: {largest} \n second_largest:{second_largest} \n rest_of_numbers:{rest_of_numbers}")
출력
largest: 17 second_largest:12 rest_of_numbers:[10, 9, 7, 5, 3, 2, 1, 0]
위의 코드는 어떻게 생겼습니까? 읽기 쉬운 한 줄로 출력을 얻을 수 있습니다. 별표 표시된 표현식은 어느 위치에나 나타날 수 있으므로 한 조각을 추출해야 할 때마다 포괄적인 압축 풀기의 이점을 얻을 수 있습니다.
largest: 17 rest_of_numbers:[12, 10, 9, 7, 5, 3, 2, 1] smallest:0
*rest_of_numbers, second_smallest, smallest = random_numbers_descending print(f"Output \n rest_of_numbers:{rest_of_numbers} \n second_smallest: {second_smallest} \n smallest:{smallest}")
rest_of_numbers:[17, 12, 10, 9, 7, 5, 3, 2] second_smallest: 1 smallest:0
그러나 별표 표시된 표현식이 포함된 할당을 풀려면 최소한 하나의 필수 부분이 있어야 합니다. 그렇지 않으면 SyntaxError가 발생합니다. 포괄적인 표현은 단독으로 사용할 수 없습니다.
*rest_of_numbers = random_numbers_descending
File "", line 1 *rest_of_numbers = random_numbers_descending ^ SyntaxError: starred assignment target must be in a list or tuple
또한 단일 수준의 압축 풀기 패턴에서 여러 포괄 표현식을 사용할 수 없습니다. 이것은 고려해야 할 또 다른 중요한 참고 사항입니다.
*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
File "", line 1 *rest_of_numbers, *more_smallest, smallest = random_numbers_descending ^ SyntaxError: two starred expressions in assignment
그러나 압축을 풀고 있는 다단계 구조의 다른 부분에 대한 포괄적인 한, 압축 풀기 할당 문에서 여러 별표 표시된 표현식을 사용할 수 있습니다.
player_grandslame_and_atptitles = { 'Federer': (20, 103), 'Nadal': (20,84),} ((player1, (grandslam1, *atptitles1)), (player2, (grandslam2, *atptitles2))) = player_grandslame_and_atptitles.items() print(f'Output \nPlayer - {player1} Have acheived {grandslam1} grandslams and , {atptitles1} atp tour titles') print(f'Player - {player2} Have acheived {grandslam2} grandslams and , {atptitles2} atp tour titles')
출력
Player - Federer Have acheived 20 grandslams and , [103] atp tour titles Player - Nadal Have acheived 20 grandslams and , [84] atp tour titles
별표 표시된 표현식은 모든 경우에 목록 인스턴스가 됩니다. 압축을 풀고 있는 시퀀스에서 남은 항목이 없는 경우 포괄 부분은 빈 목록이 됩니다. 이것은 최소 N개의 요소가 있는 시퀀스를 미리 처리할 때 특히 유용합니다.
random_numbers = [0, 1] first, second, *rest = random_numbers print(f"Output \n{first, second, rest}")
출력
(0, 1, [])