항상 input을 받아서 객체에 할당하고자 할 때 코드를 이런 식으로 썼었다.
class Student:
def __init__(self, height, weight):
self.height = height
self.weight = weight
N = int(input())
students = []
for i in range(N):
h, w = input().split()
students.append(Student(h, w))
N을 받고, 객체를 저장할 리스트를 선언 및 초기화하고, for문을 통해 input을 받은 후 리스트에 객체를 추가하는 방식이었다.
아무리 생각해도 간단히 쓸 수 있을 거 같은데, 파이썬에 익숙하지 않아서 알고리즘 문제들을 풀면서 관성적으로 이렇게 긴 코드를 쓰다가 오늘 드디어 간략히 쓰는 법을 찾아봤다.
생각보다 더 간단했다.
N = int(input())
students = [Student(*input().split()) for _ in range(N)]
이렇게 쓸 수 있다.
여기서 * 연산자는 Python에서 unpacking 연산자로 사용된다.
함수에 인자를 전달할 때, 이 연산자를 사용하면 시퀀스(예: 리스트, 튜플 등)의 각 항목을 개별적인 인자로 분리하여 전달할 수 있다.
*를 사용하면, 리스트나 튜플 내의 요소들이 함수의 파라미터로 하나씩 풀어져서 전달되는 것이다.
예를 들어, input().split()은 사용자 입력을 받아 공백을 기준으로 분리하여 리스트를 생성한다.
만약 사용자가 "170 60"이라고 입력하면, input().split()은 ["170", "60"]이라는 리스트를 반환한다.
이 리스트를 Student 클래스의 생성자에 직접 전달하려면 각 요소를 개별 인자로 분리해야 하는데, 여기서 * 연산자가 사용된다.
Student(*input().split())라고 작성하면,
input().split()으로 생성된 리스트의 요소들이 Student 클래스 생성자의 height와 weight 파라미터로 각각 풀려서 전달된다.
즉, Student("170", "60")으로 호출되는 것과 동일한 효과를 가진다.
아래는 int로 캐스팅, id까지 추가된 최종적으로 문제 푸는 데 사용한 버전
class Student:
def __init__(self, height, weight, id):
self.height = height
self.weight = weight
self.id = id
N = int(input())
students = [Student(*map(int, input().split()), i+1) for i in range(N)]
'개발 잡기술' 카테고리의 다른 글
[Udemy 강의 후기] Spring Boot 3 & Spring Framework 6 마스터하기! (0) | 2024.04.14 |
---|---|
svg에 호스팅 된 image url를 넣기 위한 사투 (용량과의 전쟁) (2) | 2024.03.24 |
이젠 진짜 알고리즘 공부 해야지..! 코드트리 사용기 (0) | 2024.02.29 |
[Udemy 강의 리뷰] 옆집 개발자와 같이 진짜 이해하며 만들어보는 첫 Spring Boot 프로젝트 (1) | 2024.02.18 |
Metabase 필터 사용법 (날짜 필터 설정하기) (0) | 2024.01.20 |