ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 포맷팅 Format (feat. %, {}, f-string) 알아보기
    ▶파공's 취미 생활/▷파이썬 공부 2021. 3. 9. 23:44

    안녕하세요

    파이어(F.I.R.E.)를 꿈꾸는 공룡

    '파공' 입니다.

     

     

     

    오늘은 파이썬을 사용하면서 굉장히 많이 접하게되고, 또 직접 사용할 일도 많은 포맷팅에 대해서 알아보고자 합니다.

     

    우선 포맷팅은 크게 3가지 방법이 있습니다. %, {} ,f-string 인데요. 하나씩 예제와 함께 알아보겠습니다.

     

     

     

     

    1. '%'를 사용한 포맷팅 _ 변수타입에 따라서 %s, %d, %f 구분해서 써줘야 함

    something = '볼펜'
    EA = 2
    one_length = 5.343
    scale = 'cm'
    
    print('%s %d개의 길이는 %f%s 입니다.' % (something, EA, one_length*EA, scale))
    
    #실수 소수점 자릿 수 맞추기
    print('%s %d개의 길이는 %.2f%s 입니다.' % (something, EA, one_length*EA, scale))

     

     

    기본적으로 %s는 문자열, %d는 정수, %f는 실수를 받아옵니다.

     

    위 예제에서 %f는 하나의 변수를 그대로 받아온 것이 아니라, one_length와 EA의 곱의 결과를 받아왔습니다. 즉, 포맷팅을 하면서 연산의 결과를 받아올 수도 있다는 말씀입니다.

     

    그리고 %f%.2f 의 차이가 보이시나요? %.2f는 실수를 받아올 때 소수점 둘째자리까지만 표현되도록 (반올림)하라는 의미 입니다. 즉, %.3f라고 되어있으면 소수점 셋째자리까지 표현이 되겠죠?

     

     

    한가지 예제를 더 살펴보겠습니다.

    print(1234567890) #자릿수를 표현하기 위해서 적음
    print('%6d'%(111)) # 6자리를 가진다.
    print('%06d'%(111)) # 6자리를 가지고, 빈자리를 0으로 채운다.
    print('%6.2f'%(11.123124))  # 총 6자리 가지고 소수점 이하 둘째자리까지 표현
    print('%06.2f'%(11.123124))  # 총 6자리 가지고 소수점 이하 둘째자리까지 표현, 빈자리는 0 채움

     

    위 예제 코드의 주석 부분도 함께 참고해주세요.

     

    %d 사이에 숫자는 포맷팅을 통해 표현되는 숫자나 문자의 자릿수를 의미합니다.

    즉, 위 예제에서 %6d는 111을 표현하되, 총 여섯 자리를 차지하라는 말입니다. 그리고 기본적으로 오른쪽 정렬이 됩니다.

     

    이 때 %06d 라고 적으면 총 6자리 중에 오른쪽 정렬로 포맷팅하는 숫자를 표현하고 남는 자리는 0을로 채웁니다. 그래서 위 예제 결과를 보시면 '000111' 이라고 표현이 되었습니다. 

     

    %6.2f 라고 하면, 총 6자리를 차지하되, 소수점 이하 둘째자리까지만 표현하라는 의미가 됩니다.

    이 때에도 %06.2f 라고 하면 총 6자리 중에 빈자리에 0을 채워넣습니다. 래서 위 예제 결과를 보시면 '011.12' 라고 표현이 되었습니다. 

     

     

    %를 사용한 포맷팅은 사실 개인적으로 잘 사용하지 않습니다. 이제 부터 말씀드릴 다른 방법들이 더 편하기 때문이죠.

    그럼 다음으로 {}포맷팅을 알아보겠습니다!

     

     

     

     

     

     

     

    2. '{}'를 이용한 포맷팅 _ 변수 타입 관계 없이 {} 해주면 된다

    something = '볼펜'
    EA = 2
    one_length = 5.343
    scale = 'cm'
    
    print('{} {}개의 길이는 {}{} 입니다.'.format(something, EA, one_length*EA, scale))
    
    #실수 포맷팅 소수점 반올림 하기
    print('{} {}개의 길이는 {:.2f}{} 입니다.'.format(something, EA, one_length*EA, scale))

    기본적으로 %포맷팅과 거의 유사합니다.

     

    하지만 {}을 사용해서 포맷팅 할 때는 위 예제와 같이, 포맷팅하는 값의 데이터 타입에 관계없이 그냥 {}을 써주기만 하면 됩니다. 문자열이든, 정수든, 실수든 다 그냥 {}을 써서 받아올 수 있습니다. 아주 큰 장점이죠. 이 특징 때문에 저는 여전히 {}를 많이 사용하고 있습니다.

     

    또한 {:.2f} 라고 표현함으로서 실수를 표현할 때 소수점 아래 둘째자리까지만 표현되도록 반올림을 합니다. {:.3f}라고 하면 소수점 아래 셋째자리까지 표현될 것입니다.

     

     

    추가적인 특징들을 더 살펴보겠씁니다.

    print(1234567890) #자릿 수 표현 위함
    print('{:>3}'.format('5')) # >는 오른쪽정렬
    print('{:<3}'.format('5')) # <는 왼쪽정렬
    print('{:^3}'.format('5')) # ^는 가운데정렬
    print('{:0>3}'.format(5)) # 빈자리를 0으로 채울수도 있음

    맨 윗 줄의 1234567890은 자릿수를 표현하기 위함입니다.

     

    {:>3} 이라고 적으면 포맷팅하는 데이터를 표현할 때 3자리를 차지하라는 의미가 되고, '>'가 있음으로써 오른쪽 정렬을 진행하게 됩니다. '<'은 왼쪽 정렬, '^'은 가운데 정렬을 해줍니다.

     

    {:0>3} 과 같이 :과 정렬기호(<, >, ^) 사이에 0을 넣어주면, 미리 차지해놓은 3자리 중에 빈자리를 0으로 채웁니다.

     

     

     

    print('{}'.format(1234567890))
    print('{:>10}'.format(5)) # >는 오른쪽정렬
    print('{:<10f}'.format(5)) # <는 왼쪽정렬, 실수는 기본적으로 소수점6자리까지 표현
    print('{:^10.2f}'.format(5)) # ^는 가운데정렬, 10을 썼으니 10자리 기준 가운데 정렬, 소수점 2자리 감안해서 가운데 정렬

     

    {:>10} 이라 함은 10자리를 차지하고 오른쪽 정렬을 해서 표현하라는 의미가 되겠죠?

     

    {:<10f} 와 같이 f를 넣어주면 정수 5를 표현할 때도 실수로 표현합니다. 그리고 기본적으로 소수점 6자리 까지 표현함을 확인하실 수 있습니다. '<'가 들어갔기 때문에 이번에는 왼쪽 정렬을 했습니다.

     

    {:^10.2f} 는 일단 '^'가 있으니 가운데 정렬이고, 10이 있으니 10자리를 차지할 겁니다. .2f가 있으니 소수점 둘째자리 까지만 표현 하겠군요. 이렇게 가운에 정렬을 할 때는 소수점과 소수점 아래 자릿수까지 다 고려해서 가운데 정렬을 진행한다는 것을 확인하실 수 있습니다.

     

    저는 개인적으로 익숙하기도하고 편하다고 느껴서 '{}'을 가장 많이 사용하고 있긴 합니다.

     

    마지막으로 f-string을 알아보겠습니다. 사실 이 방법이 가장 최근에 나온 방법이고, 가장 편하다고들 말씀하시더라구요.

     

     

     

     

     

     

     

    3. f-string 포맷팅 _ 직관적으로 알 수 있다

    something = '볼펜'
    EA = 2
    one_length = 5.343
    scale = 'cm'
    
    print(f'{something} {EA}개의 길이는 {one_length*EA}{scale} 입니다.')
    print(f'{something} {EA}개의 길이는 {one_length*EA:.1f}{scale} 입니다.')

     

    f-string 방법은 문자열 가장 앞에 f를 붙여주고 시작합니다.

    그리고 기존 {}포맷팅에서는 {}로 위치만 잡아주고, 각각의 {}에 어떤 값이 들어갈지는 맨 뒤에 순서대로 적어줬습니다.

    반면에 f-string은 바로바로 {}을 쓰고 그 안에 어떤 값을 이 자리에 표현할지 적어줍니다. 그래서 굉장히 직관적으로 어떤 값이 올지 바로 알 수 있죠.

     

    이러한 특징 때문에 남이 작성해놓은 코드를 분석하거나 내가 작성하고도 시간이 오래 지난 후에 다시 봤을 때 해석하기가 굉장히 용이합니다. 가독성이 매우 좋죠.

     

    그리고 문자열이 길어지거나 포맷팅해야되는 값이 많아지면 '{}' 포맷팅의 경우 문자열 뒤에 모아놓은 값들을 1대1 매칭하기가 쉽지 않을 수 있습니다. 하지만 f-string은 바로바로 적어주니까 문자열이 길어져도, 포맷팅하는 값이 많아져도 햇갈리지 않고 작성할 수 있다는 장점이 있습니다.

     

    다만 저같은 경우는 전공자가 아니기 때문에, 아직 엄청 많은 값을 포맷팅하거나 엄청나게 긴 문자열을 사용한 적이 없어서 '{}'포맷팅으로 충분히 커버가 되더라구요. 추후에는 f-string도 익숙해지도록 연습해봐야 될 것 같습니다.

     

    추가적인 특징들 더 살펴보겠습니다.

     

    char_a = '5'
    int_a = 5
    
    '''기본적으로 {} 포맷팅의 특성을 그대로 가짐'''
    print(1234567890)
    print(f'{char_a:>5}') # >는 오른쪽정렬
    print(f'{char_a:<5}') # <는 왼쪽정렬
    print(f'{char_a:^5}') # ^는 가운데정렬
    print(f'{int_a:0<5}')# <는 왼쪽정렬, 빈자리를 0으로 채울수도 있음

     

    기본적으로 '{}'포맷팅의 특성을 그대로 가진다고 생각하시면 됩니다. {}안에 받아올 변수명을 입력해주고 그 우측으로 여러 특성을 지정해줍니다.

     

    f'{char_a:>5}' : 이후에 >이 있으니 오른쪽 정렬이겠죠? 그리고 5가 있으니 5자리를 차지합니다.

     

    f'{int_a:0<5}' 의 경우 : < 사이에 0이 들어갔습니다. 그러면 미리 확보해놓은 5자리 중에서 왼쪽 정렬로 값을 표현하고 남은 빈자리를 0으로 채워주게 됩니다.

     

     

    int_a = 5
    print(1234567890)
    print(f'{int_a:>10f}') # >는 오른쪽정렬, 정수를 넣어도 f로 포맷팅하면 실수로 표현
    print(f'{int_a:^10.2f}')  # ^는 가운데정렬, 10을 썼으니 10자리 기준 가운데 정렬, 소수점 2자리 감안해서 가운데 정렬

    f'{int_a:>10f}' 와 같이 {} 안에 f라고 타입을 지정해주면 정수를 받아와도 실수로 표현을 해줍니다. 기본적으로 소수점 아래 6자리까지 표현합니다.

     

    f'{int_a:^10.2f}' 의 경우 포맷팅할 변수명 우측에 : 을 적고 ^이 있으니 가운데 정렬, 10이 있으니 총 10자리를 차지합니다. .2f가 있으니 실수로 표현하되 소수점 아래   둘째자리까지 표현하게 됩니다. 가운데 정렬을 할 때는 역시 소수점과 소수점 아래 자리들까지 함께 고려해서 표현합니다.

     

     

     

     

     

     

    오늘은 파이썬에서 굉장히 많이 사용하고 사실 필수적이라고 할 수 있는 포맷팅에 대해서 알아봤습니다.

    혹시 제 글에서 잘못된 것이 있다면 댓글로 말씀해주시면 감사하겠습니다! 확인하고 정정하도록 하겠습니다!^^

    저도 아직 많이 부족해서요.ㅠㅠ

     

    포맷팅은 반드시 직접 여러번, 이렇게 저렇게 실습해보시길 추천드립니다! 안그러면 햇갈리더라구요..

     

     

    오늘도 글 읽어 주셔서 감사합니다!

     

    Look Rich or Be Rich

    현명한 선택을 응원합니다.

    -파공-

     

    댓글

Designed by Tistory.