2017-01-05 5 views
1

저는 에 텍스트 게임을 프로그래밍하고 있습니다. 함수를 사용하여 사용자에게 변수를 표시해야하는 Python 3.4이 필요합니다.파이썬 3에서 문자열 연결보다 문자열 서식을 사용하는 것이 더 파이썬적인가요?

난 항상 이런 짓을 한 두 가지 방법이 및 문자열 연결 포맷 문자열입니다 :

print('{} has {} health left.'.format(player, health)) 

그리고,

print(player + ' has ' + str(health) + ' health left.') 

그래서 더 나은 무엇입니까? 둘 다 똑같이 읽기 쉽고 빠르게 입력 할 수 있으며 은 정확히입니다. 어느 것이 더 Pythonic이고 그 이유는 무엇입니까?

Java에 관심이없는 스택 오버플로에서 이에 대한 대답을 찾을 수 없어서 질문이 생겼습니다.

+0

[2 개의 문자열을 연결하는 데 '+'를 사용하지 않는 이유는 무엇입니까?] (http : // stackoverflow.com/questions/10043636/any-reason-not-to-concatenate-two-strings) –

+1

의미와 읽기 쉬운 각도에서'format'을 사용하는 것이 더 좋습니다. – Acepcs

+0

은 얼마나 많은 문자열을 연결해야하는지에 따라 달라지며 형식이 얼마나 정교한 지에 따라 달라집니다. – RomanPerekhrest

답변

4

문자열 길이 및 변수 수에 따라 다릅니다. 귀하의 사용 사례에 대한 더 나은 성능을 가지고 있고 더 깨끗하게 읽을 수 있기 때문에 나는 string.format이 더 좋다고 믿습니다.

때때로 더 긴 문자열의 경우 +은 변수의 위치가 문자열에 있어야하는 위치에서 유지되므로 눈을 움직여서 {}의 위치를 ​​해당 변수에 매핑 할 필요가 없으므로 더 깨끗하게 보입니다.

당신이 아래와 같이 새로운 직관적 문자열 서식 구문을 사용하여 두 세계의 최고 수 있습니다 파이썬 3.6로 업그레이드 관리 할 수있는 경우는 매우 큰 문자열이 있으면, 내가 추천

player = 'Arbiter' 
health = 100 
print(f'{player} has {health} health left.') 

Jinja2 (http://jinja.pocoo.org/docs/dev/)과 같은 템플릿 엔진을 사용하십시오.

참조 : https://www.python.org/dev/peps/pep-0498/

+0

코드의 긴 줄에서 해당 변수와 '{}'를 일치시키는 것이 어려울 수 있으며, 실수를해서 그 위치의 잘못된 변수를 살펴 보는 것이 쉽기 때문에 생각했던 것입니다. 귀하의 예제가 가독성을 높여 수정 한 것처럼 보입니다. 그러나 분명히 파이썬 3.6을 얻을 것입니다. 그러나 프로젝트는'pygame' 모듈을 중심으로 구축되어 있습니다. 파이썬 3.6이'파이 게임 '을 지원하는지 알고 있습니까? – Arbiter

+0

@Arbiter '파이 게임'을 오해하지 않으면 파이썬 3.6에서 잘 작동합니다. 마지막으로 나는 파이 게임 (pygame)에 의존하는'키비 (Kivy)'를 운영하고 있었다. – Eddie

+0

우수. 답변 감사합니다! – Arbiter

4

format() 낫다 :

  1. 더 나은 성능 현명한.
  2. 가 분명합니다. 문장이 어떻게 생겼는지, 매개 변수가 무엇인지 볼 수 있습니다. 당신은 +와 -의 모든 것을 가지고 있지 않습니다.
  3. 예를 들어 부동 소수점에서 0 이후의 자리 수와 같은 더 많은 기능을 제공하므로 변경 사항에보다 유연합니다.
+0

당신이 더 나은 '성과 현명한'말을 할 때, 더 빠르고 효율적으로 더 나은 것을 의미합니까? 나는'time' 모듈과'time.clock()'을 사용하여 어떤 메소드가 많은 변수를 가지고 가장 빠르다는 것을 생각했다. – Arbiter

+0

concat 4 개의 문자열은 다음과 같이됩니다. 1 + 2, (1 + 2) +3, (1 + 2 + 3) +4 -> 할당 된 문자열 개체가 훨씬 많고 문자열 작업이 훨씬 많습니다. 그게 내 아주 높은 수준의 설명. 그러나 나는 측정이 증명을 줄 것이라고 확신한다. – Hanan

3

결합하려는 개체의 양과 유형, 원하는 출력의 종류에 따라 다릅니다.

>>> d = '20160105' 
>>> t = '013640' 
>>> d+t 
'20160105013640' 
>>> '{}{}'.format(d, t) 
'20160105013640' 
>>> hundreds = 2 
>>> fifties = 1 
>>> twenties = 1 
>>> tens = 1 
>>> fives = 1 
>>> ones = 1 
>>> quarters = 2 
>>> dimes = 1 
>>> nickels = 1 
>>> pennies = 1 
>>> 'I have ' + str(hundreds) + ' hundreds, ' + str(fifties) + ' fifties, ' + str(twenties) + ' twenties, ' + str(tens) + ' tens, ' + str(fives) + ' fives, ' + str(ones) + ' ones, ' + str(quarters) + ' quarters, ' + str(dimes) + ' dimes, ' + str(nickels) + ' nickels, and ' + str(pennies) + ' pennies.' 
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.' 
>>> 'I have {} hundreds, {} fifties, {} twenties, {} tens, {} fives, {} ones, {} quarters, {} dimes, {} nickels, and {} pennies.'.format(hundreds, fifties, twenties, tens, fives, ones, quarters, dimes, nickels, pennies) 
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.' 
>>> f'I have {hundreds} hundreds, {fifties} fifties, {twenties} twenties, {tens} tens, {fives} fives, {ones} ones, {quarters} quarters, {dimes} dimes, {nickels} nickels, and {pennies} pennies.' 
'I have 2 hundreds, 1 fifties, 1 twenties, 1 tens, 1 fives, 1 ones, 2 quarters, 1 dimes, 1 nickels, and 1 pennies.' 

너무, 연결을 많이 할보다 큰 형식 문자열 오류없이 훨씬 쉽게 만들 수 있습니다. 형식 문자열이 정렬이나 반올림과 같은 실제 서식을 처리 할 수 ​​있다는 사실을 추가하면 위와 같이 간단한 경우에만 연결을 유지합니다.

+0

훌륭한 예를 들자면 많은 변수에서 문자열 연결이 문자열 연결보다 훨씬 다양하고 읽기 쉽고 단순하다는 것을 알 수 있습니다. 감사! – Arbiter