안녕하세요. 궁금증연구소입니다.
오늘 포스팅 주제는 "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만 출력이 된다. 모든 값을 출력해주려면, 값의 개수만큼 {}를 넣어주어야 한다.
이렇게 하면 4개 값이 정상적으로 잘 출력되는 것을 볼 수 있다.
정리
1. unpack을 하면서 포매팅 하려면 format함수를 이용한다.
2. 이때, 포메팅 삽입 강호는 삽입하려면 iterable객체의 객체값수만큼 넣어주어야 한다.(ex. tuple값이 3개면 갈호3개)
iterable 객체와 iterator 구분 (0) | 2022.07.21 |
---|---|
[c언어/c++] goto label 활용법 (0) | 2022.06.05 |
sqlite3 기능을 알아보자. (0) | 2022.03.12 |
Could not find a version that satisfies the requirement django==2.2 (파이썬 에러) (0) | 2022.01.15 |
[WSL: UBUNTU-18.04] Visual Studio Code에서 보이지 않을때 대처방법 (0) | 2022.01.10 |