본문 바로가기
언어/PYTHON

[Python]임의 순환체의 요소 나누기 / 언패킹(Unpacking) 심화 / 별 표현식 '*'

by 만결숭이 2022. 11. 21.
반응형

문제 : 

순환체를 언패킹(unpacking)하려는데, 요소가 너무 많아 예외가 발생하고 일일이 작성할 필요가 없을 때

 

 

 

 

해결 :

별 표현식 (*) 을 사용한다.

 

 

 

 

예시 1 (처음과 끝을 제외한 모든 값)

def drop_first_last(grades):
    first, *middle, last = grades
    return sum(middle)

첫번째와 마지막번째 성적을 무시하고 나머지의 총 합을 구하는 함수이다.

요소가 단순히 네 개였으면 네 개를 모두 언패킹해도 되겠지만, grades의 값이 97개라면(...) 이 '*'를 사용하여 편리하게 구현이 가능하다.

 

 

 

예시 2 (n번째 이후의 모든 값)

record = ('hanlim', 'hanlim@naver.com', '010-1234-5678', '010-0000-0000')
name, email, *phone_numbers = record
print(name, email, phone_numbers)

name, email이 언패킹 된 이후의 모든 값들이 phone_number에 리스트 형태로 들어간다.

전화번호가 하나이든 아예 없든 상관 없다. 그렇기 때문에 phone_numbers를 사용하는 코드에서 이 값이 리스트에서 빠져 있거나 타입을 검사하는 등의 작업을 하지 않아도 된다.

 

코드 실행 결과

 

 

 

예시 3 (n번째까지의 모든 값)

*trailing, current = [10, 8, 7, 1, 9, 5, 10, 3]
print(trailing, current)

비슷한 예제로, 마지막 값만 current에 들어가게 되고 나머지 요소는 모두 trailing에 리스트 형태로 들어간다.

이와 같이 별표가 맨 앞에 올 수도 있다.

 

코드 실행 결과

 

 

 

예시 4 (길이가 일정하지 않은 튜플에 사용하는 예제)

records = [
    ('foo', 1, 2),
    ('bar', 'hello'),
    ('foo', 3, 4, 5, 6, 7)
]

def do_foo(*n):
    print('foo', *n)

def do_bar(s):
    print('bar', s)

for tag, *args in records:
    if tag == 'foo':
        do_foo(*args)
    elif tag =='bar':
        do_bar(*args)

마지막 for문을 보자. 각 records의 원소에서 첫 문자열은 tag에 들어가고, 그 이후의 나머지들은 모두 args에 들어간다.

기똥차지 않은가? 그래서 한 번 더 적용을 시켜보았다.

do_foo() 함수를 보면 문자열이 'foo'일 경우에 사용이 되는데 그 뒤에 숫자들또한 몇 개가 올지 모르기 때문에 별표(*)를 사용하였다.

별 거다 정말.

 

코드 실행 결과

 

 

 

예시 5 (문자열 프로세싱에 사용)

line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
uname, *fields, homedir, sh = line.split(':')
print(uname, homedir, sh)

위 예제들을 충분히 이해하였다면, 이 예시는 설명이 필요가 없다.

 

코드 실행 결과

반응형

댓글