반응형
문제 :
순환체를 언패킹(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)
위 예제들을 충분히 이해하였다면, 이 예시는 설명이 필요가 없다.
반응형
'언어 > PYTHON' 카테고리의 다른 글
[Python] 시퀀스를 개별 변수로 나누기 / 언패킹(unpacking) (0) | 2022.11.16 |
---|---|
[Python] pass의 역할 | 널 연산 Null Operation | IndentationError (0) | 2022.09.26 |
[Python 오류] ImportError: cannot import name (0) | 2022.08.24 |
[Python 오류] TypeError: 'str' object is not callable | selenium 구글 검색 매크로 프로그램 (2) | 2022.08.22 |
[Python/초보를위한] 파이썬 패키지와 모듈 만들기, 임포트하는 방법(import, from import, import as) (0) | 2022.06.24 |
댓글