궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "f-string, format함수에서의 튜플 unpacking 정리"입니다.

 

파이썬에서는 문자열을 포메팅하는 몇 가지 방법들이 있습니다. 그중에서 제가 가장 자주 사용하는 방법은 f-string입니다. 예를 들어서,

 

a = 'hi welcome to python world'

print(f'{a} << a의문장이 이곳에 들어감')

위와 같은 형식으로 문장을 간편하게 포매팅할 수가 있다.

 

터미널 출력 장면

문제는 클래스 같은 데서 초기 매개변수를 *arg 형식으로 받았을 경우, tuple 그대로 출력하려고 할 때는 f-string이 안 먹힌다는 것이다.

 

 

 

 

 

 

예를 들어 위와 같은 코드에서, Score클래스를 통해 입력받은 점수 튜플을 f-string값으로 *tpl 형식으로 unpack 하려면

에러가 발생한다.

class Score :

    def __init__(self, name, *score) :
        self.name = name
        self.score = [*score] # tuple
        self.tot = sum(self.score)
        self.avg = self.tot / len(self.score)
        
    def view(self) :
        # if self.sw == 0 :
        #     print(f"{'이름':7}{'국어':7}{'영어':7}{'수학':7}{'총점':7}{'평균':7}")
        #     print('='*50)
        
        # print('{:7}{:10}{:7}{:7.0f}'.format(self.name,*self.score,self.tot,self.avg))
        print(f'{self.name:7}{*self.score:10}{self.tot:7}{self.avg:7.0f}')

def main() :
    lst = []

    lst.append(Score('이정후',50,90.70))
    lst.append(Score('신지환',100,50,90))
    lst.append(Score('이재올',90,90,60))
    lst.append(Score('김준우',90,90,60))

    for v in lst :
        v.view()

main()

에러메세지 발생

f-string에는 starred expression을 사용하지 못한다고 나온다.

 

따라서 이경우에는 또 다른 fomatting 방법인 format함수를 이용해야 한다.

 

class Score :

    def __init__(self, name, *score) :
        self.name = name
        self.score = [*score] # tuple
        self.tot = sum(self.score)
        self.avg = self.tot / len(self.score)
        
    def view(self) :
        # if self.sw == 0 :
        #     print(f"{'이름':7}{'국어':7}{'영어':7}{'수학':7}{'총점':7}{'평균':7}")
        #     print('='*50)
        
        print('{:7}{:10}{:7}{:7.0f}'.format(self.name,*self.score,self.tot,self.avg))

def main() :
    lst = []

    lst.append(Score('이정후',50,90.70))
    lst.append(Score('신지환',100,50,90))
    lst.append(Score('이재올',90,90,60))
    lst.append(Score('김준우',90,90,60))

    for v in lst :
        v.view()

main()

포매팅을 써서 위와 같이 unpack을 해주면 값을 바로 삽입할 수 있다. 

 

문제는 이렇게 하면 tuple의 첫 번째 값만 삽입된다는 점이다.

 

예시

위와 같이 tuple을 fomat함수에 값으로 unpack 하면 tpl 값 전체가 들어가는 게 아니라, 첫 번째 값이 7만 들어가서,

결과적으로 7만 출력이 된다. 모든 값을 출력해주려면, 값의 개수만큼 {}를 넣어주어야 한다.

 

tuple값 개수만큼 넣어주어야 한다.
값출력

 

이렇게 하면 4개 값이 정상적으로 잘 출력되는 것을 볼 수 있다.

 

정리

1. unpack을 하면서 포매팅 하려면 format함수를 이용한다.

2. 이때, 포메팅 삽입 강호는 삽입하려면 iterable객체의 객체값수만큼 넣어주어야 한다.(ex. tuple값이 3개면 갈호3개)

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading