• 티스토리 홈
  • 프로필사진
    31514
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
31514
  • 프로필사진
    31514
    • 분류 전체보기 (108) N
      • Book (66)
        • Learning SQL (9)
        • SQL 레벨업 (8)
        • 견고한 데이터 엔지니어링 (5)
        • 운영체제 (2)
        • 스파크 완벽 가이드 (9)
        • 파이썬 코딩의 기술 (29)
        • 분산 컴퓨팅 (4)
      • 개발 (25)
      • 기타 (10)
        • 출퇴근 공부 간단 정리 (7)
      • ELK (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
      • 31514의 이전 블로그는 여기로!
      등록된 공지가 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • [BW 4] f-문자열을 통한 인터폴레이션
      2024년 10월 22일
      • 31514
      • 작성자
      • 2024.10.22.:58

      💡 형식화 : 미리 정의된 문자열에 데이터 값을 끼워 넣어서 사람이 보기 좋은 문자열로 저장하는 과정

       

      % 형식화 연산자 사용과 문제점

      a = 12345
      b = 6789
      
      print('a의 값: %d, b의 값: %d' % (a, b))
      
      >>>
      a의 값: 12345, b의 값: 6789
      

      형식 지정자 : %s, %x, %f, %d 등을 말하며, 해당 위치에 지정한 문자를 형식화한다.

       

      첫 번째 문제점

      오른쪽에 있는 tuple 내 데이터의 순서를 바꾸거나 값의 타입을 바꾸면 오류가 발생할 수 있다.

      key = "outer"
      value = 8.23
      
      miss_ordered_tuple = '%-10s = %.2f' % (value, key)
      
      print(miss_ordered_tuple)
      
      >>>
      TypeError: must be real number, not str
      

      두 번째 문제점

      형식화를 하기 전에 값을 변경해야 한다면 식을 읽기가 매우 어려워질 수 있다.

      # 수정 전
      family = [
          ('아빠', 55),
          ('엄마', 54),
          ('동생', 26),
          ('아들', 7),
          ('짱구', 9)
      ]
      
      for idx, (fam, age) in enumerate(family):
          print('#%d: %s의 나이는 %d 살' %(idx, fam, age))
      
      # 수정 후
      family = [
          ('아빠', 55),
          ('엄마', 54),
          ('동생', 26),
          ('아들', 7),
          ('짱구', 9)
      ]
      
      for idx, (fam, age) in enumerate(family):
          print('#%d: %s의 나이는 %d 살' %(idx + 1, fam.title(), age))
      

      → 만약 바꿔야할 내용이 많다면 튜플이 길어져서 읽기 복잡해진다.

      세 번째 문제점

      형식화 문자열에서 같은 값을 여러 번 사용하고 싶다면 튜플에서 반복해야 한다.

      # 수정 전
      template = "%s는 음식을 좋아해. %s가 요리하는 모습을 봐요."
      name = '짱구'
      formatted = template % (name, name)
      
      print(formatted)
      
      # 수정 후
      template = "%s는 음식을 좋아해. %s가 요리하는 모습을 봐요."
      name = '짱구'
      formatted = template % (name, name.title())
      
      print(formatted)
      

      → 반복적으로 사용하다 보면 메서드 호출을 빼먹을 수 있다.

      네 번째 문제점

      첫 번째 문제점(순서 오류), 세 번째 문제점(반복으로 인한 실수)는 딕셔너리를 사용하면 해결할 수 있다.

      key = "outer"
      value = 8.23
      
      new = '%(key)s = %(value).2f' % {
          'key' : key,
          'value' : value
      }
      
      print(new)
      

      하지만 두 번째 문제점(가독성 저하)는 더 심각해진다.


      내장 함수 format과 str.format

      %d, %s와 같은 형식 지정자 대신 위치 지정자 {}를 사용한다.

      key = "outer"
      value = 8.23
      
      formatted = '{}의 생일은 {}다.'.format(key, value)
      
      print(formatted)
      
      >>>
      outer의 생일은 8.23다.
      

      첫 번째 문제 해결(순서 오류)

      위치 지정자 {} 안에 인덱스를 넣어 순서를 지정할 수 있다.

      key = "outer"
      value = 8.23
      
      formatted = '{1}의 생일은 {0}다.'.format(value, key)
      
      print(formatted)
      
      >>>
      outer의 생일은 8.23다.
      

      세 번째 문제 해결(반복으로 인한 실수)

      name = "수달"
      
      formatted = '{0}은 음식을 좋아해. {0}이 연어를 먹는다.'.format(name)
      print(formatted)
      
      >>>
      수달은 음식을 좋아해. 수달이 연어를 먹는다.
      

      인터폴레이션을 통한 형식 문자열(f-문자열)

      f-문자열은 형식 문자열의 표현력을 극대화하고, 네 번째 문제점(딕셔너리 사용으로 인한 가독성 저하)도 없애준다.

      key = "outer"
      value = 8.23
      
      formatted = f'{key} = {value}'
      print(formatted)
      
      >>>
      outer = 8.23
      

      두 번째 문제점(가독성 저하)도 아래와 같이 해결할 수 있다.

      family = [
          ('아빠', 55),
          ('엄마', 54),
          ('동생', 26),
          ('아들', 7),
          ('짱구', 9)
      ]
      
      for idx, (fam, age) in enumerate(family):
          f_string = f'#{idx + 1}: {fam.title()}은(는) {age}살 이다.'
          print(f_string)
      

      결론

      f-문자열은 간결하고 강력하다.

      'Book > 파이썬 코딩의 기술' 카테고리의 다른 글

      [BW 8] 여러 이터레이터에 대해 나란히 루프를 수행하려면 zip을 사용하라  (0) 2024.10.22
      [BW 7] range보다는 enumerate를 사용하라  (3) 2024.10.22
      [BW 6] 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹하라  (0) 2024.10.22
      [BW 5] 복잡한 식을 쓰는 대신 도우미 함수를 작성하라  (0) 2024.10.22
      [BW 2] PEP 8 스타일 가이드를 따르라  (0) 2024.10.22
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바