소프트웨어는 다른 수많은 소프트웨어들과의 협력을 통해서 효과적으로 기능을 수행하고있습니다. 간단한 프로젝트를 하나를 수행한다고 하더라도 수많은 패키지를 의존하게 되죠. 이러한 의존관계들이 평생 유지된다면 좋겠지만, 내가 사용하는 라이브러리가 업데이트되면서 여러 문제가 발생하기도 합니다. 지금까지 잘 작동하던 패키지가 업데이트를 진행하면서 사용법이나 동작 방식이 변해버리는 것이죠. 이런 문제를 효과적으로 해결하기 위해서 버전관리가 등장하게 되었습니다. 이제 우리는 버전을 보고 업데이트에 의한 의존성 문제를 예측하고 판단하며 대처할 수 있게 되었습니다.

 

이렇게 등장한 버전관리는 수많은 문제를 해결했지만 여전히 문제는 존재했습니다. 각 소프트웨어마다 사용하는 버전 이름짓기 방식이 달랐던 것이죠. 이러한 제각기의 버전명은 사용자가 버전의 변화를 직관적으로 해석하는데 어려움을 야기했습니다. 이를 해결하기 위해서 Github의 공동창업자인 Tom Preston-Werner가 기존의 버전관리 규칙들을 모아 Semantic Versioning를 제안입니다.

Seamantic Versioning


유의적 버전 명세

일반적인 규칙

  1. Seamantic Versioning을 사용하는 소프트웨어는 반드시 공개 API를 선언해야한다. 이 API는 코드 자체로 선언하거나 문서로 명시해야한다.
  2.  
  3. 버전 번호는 반드시 (주버전 번호).(부버전 번호).(수버전 번호)의 형태로 만들어야 하며, 각 번호는 항상 증가해야한다.
  1. (주버전 번호)가 바뀌면 (부버전 번호),(수버전 번호)을 0의로, (부버전 번호)가 바뀌면 (수버전 번호) 0으로 초기화한다.
  1. 특정 버전으로 패키지를 배포하고 나면, 그 내용은 절대 변하지 않아야 한다.
  1. 버전 번호 앞에 0을 붙이지 않는다.(버전 번호 자체가 0인 경우를 제외)

버전의 증가 기준

  1. 주버전 번호 증가 : 기존 API와 호환되지 않는 큰 변화가 있는 경우
  1. 부버전 번호 증가 : 기존 버전과 호환되는 새로운 기능을 추가하는 경우
  1. 수버전 번호 증가 : 기존 버전과 호환되는 버그 수정의 경우

pre-release버전 규칙

  1. pre-release버전은 기존의 버전 뒤에 수버전 바로 뒤에 붙임표(-)를 붙이고 마침표(.)로 구분된 식별자를 더해서 표시한다. 이때 pre-release버전 번호는 숫자, 알파벳, 붙임표로 구성된다. (예: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92.)

빌드 메타데이터

빌드 메타데이터란?
git commit 후 생기는 난수가 붙는 경우가 있는데, 그 상태로 그대로 배포하는 경우 build metadata가 그것이다.

  1. 빌드 메타데이터는 수버전이나 정식배포 전 식별자 뒤에 더하기(+) 기호를 붙인 뒤에 마침표로 구분된 식별자를 덧붙여서 표현한다.
    예) 1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85.

버전의 우선순위

  1. 우선순위는 주(major), 부(minor), 수(patch) 순서로 차례로 비교하면서, 차이가 나는 부분이 나타나면 결정된다.
  1. 주, 부, 수 버전이 같을 경우, pre-release 버전이 표기된 경우의 우선순위가 더 낮다.
  1. 주, 부 및 패치 버전이 동일한 두 가지 pre-release 버전의 우선 순위는 다음과 같이 차이점이 발견될 때까지 점으로 구분된 각 식별자를 왼쪽에서 오른쪽으로 비교하여 결정해야 한다.
    1. 숫자로만 구성된 식별자는 숫자로 비교한다.
    2. 문자나 하이픈이 있는 식별자는 ASCII 정렬 순서로 사전적으로 비교한다.
    3. 숫자 식별자는 항상 숫자가 아닌 식별자보다 우선 순위가 낮다.
    4. 이전의 모든 식별자가 동일한 경우 더 큰 시험판 필드 집합이 더 작은 집합보다 우선 순위가 높다.
      예: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0.

0.0.0과 1.0.0

  1. 주버전 0(0.y.z)은 초기 개발을 위해서 쓴다. 아무 때나 마음대로 바꿀 수 있다.
  1. 최초 개발 배포를 0.1.0으로 하고, 이후 배포마다 부버전을 올린다.
  1. 1.0.0 버전은 공개 API를 정의한다. 이후의 버전 번호는 이때 배포한 공개 API에서 어떻게 바뀌는지에 따라 올린다.

출처

https://velog.io/@i33w/semver
https://velog.io/@slaslaya/Semantic-Versioning-2.0.0-MAJOR-MINOR-PATCH%EC%99%80-%EB%AA%85%EC%84%B8%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC
https://semver.org/lang/ko/
https://kiwinam.com/posts/33/version-naming/

논문 ULR:https://www.dbpia.co.kr/pdf/pdfView.do?nodeId=NODE09414328&mark=0&useDate=&bookmarkCnt=1&ipRange=N&accessgl=Y&language=ko_KR

 

: 논문보기 - DBpia

비밀번호를 변경하신 지 90일 이상 지났습니다. 개인정보 보호를 위해 비밀번호를 변경해 주세요.

www.dbpia.co.kr

1. 서론

 개인화 추천시스템은 주로 협업 필터링과 내용 기반 필터링으로 나뉜다.

 협업 필터링 : 사용자 평가정보를 토대로 잠재 정보 추출, 유사한 사용자 평가를 반영하여 콘텐츠 추천

콜드 스타트 문제(평가이력이 얼마 없는 사용자 추천 불가)

초기평가자 문제(아무도 평가하지 않은 콘텐츠 추천 불가)

 내용기반 필터링: 콘텐츠 속성을 분석하여 콘텐츠 구분, 사용자 선호와 연결하여 추천

평가기반이 아닌 프로파일/정보분석 기반이므로, 콜드 스타트나 초기 평가자 문제에서 자유로움

과도한 특수화 문제(다양성이 상대적으로 제한된다.)

서로 다른 종류의 콘텐츠에 대한 추천이 힘들다.

2. 본론

 DataSet : IMDB, Mobielens

추천시스템은 데이터 수집, 전처리, 가공, 추천 과정으로 나누어진다. 데이터 수집과정은 생략하고 나머지 3가지 부분을 살펴보자.

전처리(Pre-processing)

 줄거리 : TF-IDF로 벡터화

-> TF-IDF로 전처리 하면 등장인물에 가중치가 높아서, BERT를 통해서 이름을 제거했다. 

 장르, 감독, 배우 : True/False 벡터화

 인지도 : 투표수/개봉기간으로 수치화

가공(Processing)

 가공 과정 부터는 추천의 런타임 과정에 포함된다.

 가공 과정에서는 전처리 과정에서 도출된 영화의 특징 벡터를 토대로 사용자의 선호 벡터(U)를 만든다.

V=(영화의 특징벡터), R=(영화 선호도 평가벡터)

인지도의 경우 (V5,M)의 단순평균으로 계산

일반적으로 U는 희소행렬(벡터의 크기에 비해 값이 희박)을 띄는데, 이는 빠른 처리를 위한 것

추천(Analysis/Recommendation)

U(사용자 선호 벡터)와 V(영화 특징 벡터)의 코사인 유사도 테이블을 구하고, 정규화한 뒤 개인의 메타 가중치를 적용해서 추천 결과를 제공한다.

 

검증

CTR(Click Through Rate)와 유사하게 그림 2와 같은 검증 프로세스 사용

 

메타 가중치를 통한 학습

위의 검증 과정을 메타가중치를 적용하지 않더라도 유의미한 결가가 나왔다.

하지만 여기서 경사 하강법(Gradient decent)를 활용해서 메타가중치를 학습하면

(200번 반복)

loss값이 32%, 평균편차가 20% 개선되었다.

메타가중치의 활용 

메타가중치는 용도에따라 다른의도로 사용할 수 있다.

예를들어, 특일이나 기상에 관한 데이터를 메타 가중치에 결합해서 집단의 단위로 선호 벡터를 만들고 메타 가중치에 대한 학습을 진행한다면 결합 된 외부요인과 어울리는 영화를 추천할 수 있을 것이다.

3. 결론

 대부분의 경우에서 장르의 메타가중치가 낮게 학습되는 경향을 보였다. 이는 장르가 실제로 다른 메타 데이터들 보다 낮은 영향을 미친다거나, 사용자의 기록 형태가 이미 선호하는 장르의 영화가 많은 상태로 저장되어 있던가 할 것이다. 

논문 URL:https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE09321282

 

1. 서론

뉴스 추천의 특징 

 - 실시간으로 생겨나는 기사를 모두 보여줄 수 없다.

 - 기사들간의 연관성이 높고, 사용자들의 선호도만 학습하는 것은 불충분하다.

 - 데이터 희소성(data sparsity problem) 문제가 심하다

 

이를 해결하기 위해서(이러한 특징을 고려해서) 해시태그를 이용하자.

 + 기존과 다르게 연관검색어태그, 이미지로부터 추출한 태그, 키워드 사용

 

선호 태그 추천방식은 협업필터링 방식 중에 절사형 SVD 추천 알고리즘 사용

 

태그를 추천함으로서 정보의 편향적 제공문제 해결

 

2. 관련연구

 협업필터링 방식 - 사용자기반 필터링과 아이템 기반 필터링으로 나뉜다.

  - 사용자 기반 필터링

   유사한 성향을 지닌 사람들을 구분하고, 해당 사람들의 선호도를 기반으로 추천

  - 아이템 기반 필터링

   아이템간의 유사도를 이용해 추천하는 방식

 

 아마존의 케이스 - 명시적 평점, 암묵적인 펴점으로 구분해서 추천

 넷플릭스 케이스 - 사용자의 성향을 파악하여 시작페이지에 띄워줌

 페이스북 케이스 - 친구추천(새로운 분야이다)

 

 뉴스추천 서비스 케이스분석

 구글 - MinHash와 PLSI(Probabilistic Latent Semantic Indexing)을 통해서 사용자 집단 클러스트링, 아이템간의 상호방문을 이용해 개인화된 뉴스 추천시스템 구축 -> 클릭기록을 분석해 뉴스 관심사를 파악 -> 사용자와 아이템 갯수 증가에 따른 사용아이템 비율 감소 -> RNN모델로 해결 시도 -> 점진적 SVD사용

 

3. 텍스트와 이미지 데이터를 활용한 뉴스 기사 추천시스템

 

3-2 텍스트로부터 태그 추출

 TF-IDF 알고리즘을 이용해서 Text에서 중요 테그를 추출했다. + 연관검색어를 추가로 사용

3-3 이미지로부터 태그 추출

 Google Inception(GoogLeNet)을 사용해서 이미지의 태그 추출

3-4 사용자 추천 알고리즘

 SVD알고리즘을 이용해서 예측 평점이 높은 순으로 추천해준다.

(행렬은 userName X tagCount) 

(tageCount = 태그에 해당하는 글을 읽은 횟수)

 

4. 시스템 구현

Lexrankr는 요약서비스를 제공한다.

 

서비스가 제공되면서, 사용자의 기사 클리게 따라 데이터베이스(TagDB) 지수평균으로 갱신되는데, 이 알고리즘은 아래와 같다.

(알파는 지수평균의 가중치를 의미한다 - 이전데이터 반영률) 

5. 성능비교

 

1급객체란?

일급객체(First-class object) 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.

출처 : 위키백과

 

 

1급객체의 조건

그렇다면 1급 객체가 되기 위한 구체적인 조건은 무엇일까?

이는  Robin Popplestone이 명확하게 게 정의했다.

  • 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
  • 모든 일급 객체는 함수의 반환값이 될 수 있다.
  • 모든 일급 객체는 할당의 대상이 될 수 있다.
  • 모든 일급 객체는 비교 연산(==, equal)을 적용할 수 있다.

이렇게만 봐서는 그림이 그려지지 않으니 예시를 통해서 확인해 보겠다. 

우리가 흔히 사용하는 C언어의 배열, Java의 객체, 모든 언어의 Int형을 생각해보자.

 

1급객체의 조건 예시

  • 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
    C언어의 배열 : C언어에서는 배열을 함수에 매개변수로 전달할 때 배열 그 자체가 아닌 포인터를 전달한다. 따라서 배열은 함수의 실질적인 매개변수가 될 수 없고, 1급객체의 조건에 어긋난다.
    Java의 객체 : 가능하다.(method(new MyObj()))
    Int : 가능하다.
  • 모든 일급 객체는 함수의 반환값이 될 수 있다.
    C언어의 배열 : C언어에서는 배열을 함수의 return값으로 전달 때 배열 그 자체가 아닌 포인터를 전달한다. 따라서 배열은 함수의 실질적인 return값이 될 수 없고, 1급객체의 조건에 어긋난다.
    Java의 객체 : 가능하다(return obj;)
    Int : 가능하다. (return 13;)
  • 모든 일급 객체는 할당의 대상이 될 수 있다.
    C언어의 배열 : 가능하다.(int a[] = [1,2,3,4,5])
    Java의 객체 : 가능하다. (Object obj = new MyObject();)
    Int : 가능하다. (int x = 3)
  • 모든 일급 객체는 비교 연산(==, equal)을 적용할 수 있다.
    C언어의 배열 : C언어의 배열은 주소값이 같은지는 비교연산으로 확인할 수 있지만, 다른 주소에 있는 두 배열의 값이 같은지는 확인할 수 없다. 따라서 1급객체의 조건에 어긋난다.
    Java의 객체 : 가능하다.(equal연산을 지원한다.)
    Int : 가능하다.(==연산을 지원한다.)

Map함수란?

 연속적인 자료형(배열, 튜플, 문자열 등등)의 각 원소에 동일한 함수를 적용한 결과값을 list로 반환함.

 

그 예시는 아래의 코드와 같다.

new_sequence_data = map(function_name, sequence_data)

 해당 코드를 실행하면 new_sequence_data에 sequence_data의 각 원소를 function_name에 해당하는 함수의 매개변수로 전달하고, 나온 결과값을 list형태로 반환한다.

 

 이 코드를 map함수 없이 사용하면 아래와 같은 코드가 필요하다.

new_sequence_data = []
for element in sequence_data:
	new_sequence_data.append(function_name(element))

 딱봐도 map함수를 쓰는편이 효과적이고, 보기쉽고, 이해하기편하고 좋다.

'Python' 카테고리의 다른 글

[Python] 문자열 포메팅 방법  (0) 2021.02.06

문제 홈페이지 : programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

문제 설명

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

나의 풀이

def solution(n, lost, reserve):
    reserve.sort()
    lost.sort()
    for j in lost:
        for i in reserve:
            if i == j:
                lost[lost.index(j)] = -2
                reserve[reserve.index(i)] = -2
                break
        reserve = list(set(reserve))
        if -2 in reserve:
            reserve.remove(-2)
    lost = list(set(lost))
    if -2 in lost:
        lost.remove(-2)
    for j in lost:
        for i in reserve:
            if (j - 1 == i) | (j + 1 == i):
                lost[lost.index(j)] = -2
                reserve[reserve.index(i)] = -2
                break
        reserve = list(set(reserve))
        if -2 in reserve:
            reserve.remove(-2)
    lost = list(set(lost))
    if -2 in lost:
        lost.remove(-2)
    return n-len(lost)

이 문제를 푸는동안 한가지 문제가 발생해서 꽤나 골머리를 썩었다. for (parameter) in (list): 와 같은 방식으로 반복문을 사용할 때는 for문 내부에서 (list)를 수정하면 문제가 생긴다는 것이다. for문 안에서 (list)값중 하나를 삭제하게 되면, 순서가 꼬여서 (list)안의 모든 값을 (parameter)로 가져오지 않는다. 이는 for문에서 list를 index기준으로 참조하기 때문인 것으로 보인다. 이를 해결하기 위해서, 특정값을 삭제하지 않고, 다른 값으로 대체한 후에 반복문이 끝나고 나서 제거해주는 형태로 문제를 해결했는데 언듯보기에도 지저분하고 파이썬스럽지 않다. 여기서 몇가지 공부해야 할 사항들을 확인할 수 있다.

 

추가적으로 공부해야할 사항

  • 적어도 파이썬 문법정도는 확실하게 알자. 아직 파이썬을 제대로 공부해본적 없는 것도 맞지만, 그래도 이런저런 핑계로 대충 넘어가면 실력은 언제느냐
  • 반복문이 내부적으로 어떻게 돌아가고 있는지 (in이라는 키워드에 대한 이야기도 포함이다.) 확인하자.
  • set자료형에 대해서 자세히 알아보자

Best답안

def solution(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

 

추가적으로 공부해야할 사항

  • _reserve = [r for r in reserve if r not in lost]와 같은 방법으로 list를 정의하는 것에대해서 자세히 확인해볼 필요가 있다.
  • 변수를 추가적으로 할당하는 것에 대해서 무서워하지 말자. 메모리 조금더 소비해도 코드 깔끔한 편이 훨신 낫다.

문제 홈페이지 : programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

 

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

나의 풀이

def solution(participant, completion):
    participant.sort()
    completion.sort()
    completion.append('just_append')
    dic = dict(zip(participant,completion))
    for name in participant:
        if name != dic[name]:
            return name

 

추가적으로 공부해야 할 사항

  • zip함수에 대해서 확실하게 공부하기

 

Best답안

 

import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 

추가적으로 공부해야 할 사항

  • collections 모듈

포메팅이란?

name1 = 'inhyeok'
name2 = 'songho'

print('Hi! my name is %s and this is my firend %s'%(name1, name2))
# Hi! my name is inhyeok and this is my firend songho

문자열을 더 자유롭게 수정할 수 있도록 하는 기술입니다. 문자열속에 특정한 값을 끼워넣을 수도 있고, 간격을 설정할 수도 있으며, 문자열속에 들어갈 값의 자료형을 제한할 수도 있습니다.

 

 

Python의 포메팅 방법

Python에서 문자열을 포메팅 하는 방법은 3가지가 있습니다.

1. %-formatting

2. '{}'.format()

3. f'{}'

1번 방식이 가장 오래된 방식이고, 3번이 가장 최근에 나온 방식입니다.

 

 

1. %-formatting

사실 c언어를 처음으로 배웠던 사람으로서 %-formatting이 가장 익숙합니다. 하지만 더 발전된 포메팅 방법을 확인하게 되면서, %-formatting방법은 잘 사용하지 않게 되었습니다.

 

%-formatting방법은 아래와 같이 사용됩니다.

name = 'inhyeok'
age = 24
print("hi! my name is %s and i'm %d years old"%(name, age))
#출력값 : hi! my name is inhyeok and i'm 24 years old

 

 

 

%표시(나누기표시)와 그 뒤에오는 변수의 형식 지정자(정수 : d, 문자열 : s, 16진수 정수 : X 등등)가 합쳐져서 

%d, %s, %X

와 같은 형태로 문자열속에 들어있습니다.

그리고 문자열 뒤에 %(변수1, 변수2)와 같은 형태로 문자열 속의 %d 값을 순서대로 포멧하는 것입니다.

"%d %d %s"%(3,5,'money')

이렇게 포멧이 완료되면 위의 문자열은

"3 5 money"라는 문자열과 같은 뜻을 가지게 됩니다..

 

그리고 물론 문자열 서식지정자를 사용해서 문자열을 꾸밀수도 있습니다.

int_ex = 52
float_ex = 0.123

#특정 칸에 출력하기
print("%5d"%(int_ex))  #출력값->   52

#빈칸을 0으로 채우기
print("%05d"%(int_ex)) #출력값->00052

#부호 붙이기
print("%+d"%(int_ex)) #출력값->+52

#부호 앞으로 밀기
print("%=+5d"%(int_ex)) #출력값->+0052

#소수점 이후 지정하기
print("%.5f"%(float_ex)) #출력값->0.12300
print("%.1f"%(float_ex)) #출력값->0.1

 

문자열 서식지정자는 언급한 것 이외에도 더 있으나 format에 대해서 설명하는 글이기에, 이정도로 마무리 하겠습니다.

 

2. "{}".format

"{}".format방식은 아래와 같이 사용합니다.

name = 'inhyeok'
age = 24
print("hi! my name is {} and i'm {} years old".format(name, age))
#출력값 : hi! my name is inhyeok and i'm 24 years old

 

이는 %-formatting방식과는 약간의 차이가 있는데, 그건 바로 순서를 지정해줄 수 있다는 점과, 이름을 지정해 줄 수 있다는 점입니다. 잘 이해가 안가신다고요? 아래의 예시를 보시면 됩니다.

#순서를 지정해 줄 수 있다(튜플이기 때문에 index로 접근이 가능한 것이다.)
print("{2}-{1}-{0}".format(21,31,41)) #출력값->41-31-21

#이름을 정해줄 수 있다.
print("{top}-{mid}-{bottom}".format(bottom="케이틀린과 레오나", mid="야스오", top="쉔"))
#출력값->쉔-야스오-케이틀린과 레오나

 

물론 "{}".format방식도 서식지정자를 사용할 수 있습니다. 바로 "{:=+05d}".format(15)와 같은 형태로요

#"{}".format() 방식의 서식지정자 사용법
print("{:=+05d}".format(15)) #출력값->+0015

 

 

3. f"{}"

f"{}"방식은 가장 최근에 파이썬에 등장한 방식으로, "{}".format()과 비슷한 형태로 사용되지만 더 간결해 진 방법입니다.

f"{}"방식은 아래와 같이 사용합니다.

 

name = 'inhyeok'
age = 24
print(f"hi! my name is {name} and i'm {age} years old")
#출력값 : hi! my name is inhyeok and i'm 24 years old

 

f"{}"방식의 서식지정자 사용법은 아래와 같습니다.

#"{}".format() 방식과 딱히 다르지 않습니다.
print(f"{5:=+5d}\n{0.32:.3f}\n{'안녕하세요'}") 
#출력값
#+   5
#0.320
#안녕하세요

 

 

이상으로 Python 문자열 포메팅 방법에 대한 포스팅을 마치겠습니다!

'Python' 카테고리의 다른 글

[Python] Map함수  (0) 2021.06.28

+ Recent posts