연결에 % s가 +보다 좋은 이유는 무엇입니까?


88

파이썬 %s보다는 문자열을 연결하는 데 사용해야한다는 것을 이해합니다 +.

나는 다음 중 하나를 수행 할 수 있습니다.

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])

그러나 왜 내가 아닌 다른 것을 사용해야 +합니까? 간단한 연결을 작성하는 것이 더 빠릅니다 +. 당신은 형식 문자열 보면 그런 다음, 유형 등을 지정 %s하고 %d등을. 유형에 대해 명시 적으로 작성하는 것이 좋습니다.

그러나 +입력하기가 쉽지만 연결에 사용 하지 않아야 한다는 것을 읽었습니다 . 문자열을 다른 방법 중 하나로 연결해야하는 분명한 이유가 있습니까?


29
누가 더 낫다고 했어?
yannis

3
%s연결 용이 아니라 C 's에서 파생 된 문자열 형식의 변환 사양입니다 printf(3). 그 또는 연결 연산자를 사용하는 경우가 있습니다. 사용하는 것은 교리가 아니라 상황의 판단에 근거해야합니다. 코드를 작성하는 것이 얼마나 쉬운지는 한 번만 할 것이기 때문에 전혀 관련이 없습니다.
Blrfl

나는에 대한 질문 재 집중 한 단지 (내가 파이썬 사람을 사용하고 있지 않은 코드에 결함이있을 수 있지만) 파이썬. C 또는 Java에 관심이있는 경우이 질문이 귀하가 묻는 질문인지 확인하고, 적절한 업데이트를하고 다른 질문을 고려하십시오 .

12
그리고 지금 우리는 우수한 f- 문자열을 가지고 있습니다 ! print(f"{hello} {world}")변수는 문자열에서 발생하는 위치에서 볼 수 있고보다 빠릅니다 str.format.
Enrico Borba

답변:


88
  1. 가독성. 형식 문자열 구문은 데이터와 스타일을 구분하므로 더 읽기 쉽습니다. 또한 파이썬에서 %s문법은 자동적으로 모든 str타입이 아닌 str; 잠시 연결에만 작동 str, 당신은 연결할 수 없습니다 str와 함께 int.

  2. 공연. 파이썬 str에서는 변경할 수 없으므로 모든 연결 쌍에 대해 왼쪽 및 오른쪽 문자열을 새 문자열로 복사해야합니다. 길이가 10 인 4 개의 문자열을 연결하면 40이 아닌 (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90자를 복사하게됩니다. 문자. 그리고 문자열의 수와 크기가 증가함에 따라 상황이 이차적으로 악화됩니다. Java는 일련의 연결을으로 변환하여이 경우를 일부 최적화 StringBuilder하지만 CPython은 그렇지 않습니다.

  3. 일부 사용 사례의 경우 로깅 라이브러리는 형식 문자열을 사용하여 로그 항목 문자열을 느리게 만드는 API를 제공합니다 ( logging.info("blah: %s", 4)). 로깅 라이브러리가 현재 로그 항목을 로그 필터에 의해 삭제하기로 결정한 경우 문자열의 형식을 지정할 필요가없는 경우 성능이 향상됩니다.


31
# 1에 대한 과학적 또는 경험적 자료가 있습니까? 나는 그것이 훨씬 덜 읽기 쉽다고 생각하기 때문에 (특히 2 개 또는 3 개 이상의 인수로)
Lovis

4
@ L.Möller : 궁극적 인 주관적 경험 (읽기 쉬움)에서 어떤 종류의 소스를 기대하는지 잘 모르겠지만 내 추론을 원한다면 : 1) 자리 표시 자당 2 개의 추가 문자가 필요합니다 + + 요구 최소 4 (또는 PEP8을 따르는 경우 8, 강제하는 경우 13), 2) % s는 단일 문자열로 묶여 있으므로 +를 사용하면 시각적으로 더 쉽게 구문 분석 할 수 있습니다. +를 사용하면 닫기 문자열, 연산자, 변수 , 연산자, 열린 문자열, 3) 구문 채색 % s는 각 함수마다 문자열과 자리 표시 자, 색, 문자열, 연산자 및 변수 채색의 세 가지 색을 갖습니다.
Lie Ryan

4
@ L.Möller : 4) 형식화가 필요한 곳을 제외하고 더 긴 형식 문자열을 변수 또는 사전에 넣을 수있는 옵션이 있습니다 .5) 형식 문자열은 구성 파일, 명령 인수 또는 데이터베이스에서 사용자가 지정할 수 있습니다 연결로도 마찬가지입니다. 그러나 네, 보간해야 할 항목이 4-5 개 이상인 경우 % s를 사용하지 않고 대신 파이썬에서 % (varname) s 변형 또는 "{foo}". format ()을 사용합니다. 명시 적 이름은 보간 변수가 많은 긴 형식 문자열의 가독성을 향상시킵니다.
Lie Ryan

2
나는 "참"이 무엇인지 모른다. 그래서 당신이 증거가 있는지 물어 보는 것이다. :-). 두 번째 의견에 정말 동의
Lovis

6
# 2가 의심되는 것 같습니다. 증거를 문서화 했습니까? Java에 익숙하지 않지만 C # 에서는 문자열 보간보다 속도가 빠릅니다 . 나는 # 1에 완전히 동의하고 어느 것을 사용 해야하는지 결정할 때 실제로 의존하지만 보간에는 많은 양의 문자열 파싱과 복잡성이 필요하다는 점을 기억해야합니다.
Jimmy Hoffa

48

내가 왼쪽에서 오른쪽으로 읽는 유일한 사람입니까?

나에게 사용하는 %s것은 독일어 스피커를 듣는 것과 같습니다. 여기서 동사가 무엇인지 듣기 위해 매우 긴 문장이 끝날 때까지 기다려야합니다.

이 중 어느 것이 한 눈에 더 분명합니까?

"your %s is in the %s" % (object, location)

또는

"your " + object + " is in the " + location  

17
분명히 첫 번째 것이 더 읽기 쉽고 쓰기 쉽고 편집하기 쉽기 때문에 주관적입니다. 두 번째는 텍스트를 코드와 혼합하여 둘 다 가리고 노이즈를 추가합니다. 예를 들어 두 번째 공백이 잘못되기 쉽습니다.
JacquesB

5
@JacquesB 나는 실제로 당신의 두뇌 가이 형식에 너무 익숙하여 즉시 괄호로 넘어가 단어를 즉시 대체한다고 생각합니다. 기술적으로는 왼쪽에서 오른쪽으로 읽는 것이 아니지만 완벽하게 괜찮습니다. 나도 그렇게한다는 것을 알았으므로 네, 1은 읽기가 더 쉽기 때문에 두 번째 따옴표 전후의 어리석은 간격 문제를 처리해야한다는 것을 알고 있기 때문에 실제로 작업하기가 느립니다.
Nelson

3
n수십 년이 지난 후에도 내 마음도 그렇게 작동합니다. ;-) 그러나 나는 여전히 내 대답을 기다리고 있습니다. 그리고 그것은 당신이 가지고있는 더 많은 매개 변수가 더 분명해집니다. 결국, 그것이 하나의 남자 쇼라면, 당신이 익숙하고 편안한 것을 가지고 가십시오. 팀 노력이라면 일관성과 코드 검토를 시행하십시오. 사람들은 어느 쪽에도 익숙해 질 수 있습니다.
Mawg

4
첫 번째 문장은 문장 중간에 "부스러기"가 적기 때문에 더 읽기 쉽습니다. 내 눈이 끝까지보기가 더 쉬우 며 뇌가 여분의 따옴표, 공백 및 플러스를 파싱하는 것이 더 쉽습니다. 물론 지금은 Python 3.6 형식 문자열을 선호합니다 f"your {object} is in the {location}".
Dustin Wyatt

8
또한 변수를 따옴표로 묶어야 할 때 읽고 쓰는 것이 더 어렵다는 것을 알았습니다. "your '" + object + "' is in the '" + location + "'"... 지금 당장 그것을 얻었는지 확실하지 않습니다 ...
Dustin Wyatt

12

가독성 인수를 명확히하는 예 :

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(두 번째 예제는 읽기 쉽고 편집하기 쉬울뿐 아니라 한 줄에서 템플릿을 변경하고 다른 줄에서 변수 목록을 변경할 수 있습니다)

또 다른 문제는 % s 코드도 문자열로 변환한다는 것입니다. 그렇지 않으면 % s 코드보다 읽기 어려운 str () 호출을 사용해야합니다.


1
그래서 upvote에, 당신의 첫 번째 문에 동의하지만, 우리는 차이 동의 할 수있다, 나는 두 번째의 라인을 따라 대답을 게시 할 수 막습니다
Mawg

6

사용 +해야 하지 일반적으로 피할 수. 많은 경우에 올바른 접근법입니다. 사용 %s하거나하는 것은 .join()특별한 경우에만 바람직하고, 그들이 더 나은 솔루션 때 그것은 일반적으로 매우 분명하다.

귀하의 예에서 3 개의 문자열을 함께 연결하고 있으며 사용하는 예가 +가장 간단하고 읽기 쉬우므로 권장됩니다.

%s또는 더 큰 문자열 .format()중간 에 문자열이나 값을 보간하려는 경우 유용 합니다. 예:

print "Hello %s, welcome to the computer!" % name

이 경우 %s첫 번째 문자열을 여러 세그먼트로 자르지 않기 때문에 더 읽기 쉽습니다. 특히 여러 값을 보간하는 경우.

.join() 문자열의 가변 크기 시퀀스가 ​​있거나 동일한 구분 기호로 여러 문자열을 연결하려는 경우에 적합합니다.


2

단어 순서가 다른 언어로 변경 될 수 있으므로 %s소프트웨어에서 문자열 변환을 올바르게 지원하려면 with 형식 이 필수적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.