2017-01-05 12 views
1

Так что я программирую текстовую игру в Python 3.4, которая очень часто требует использования функции print(), чтобы отображать переменные пользователю.Является ли более Pythonic использовать форматирование строк по конкатенации строк в Python 3?

два пути я всегда делал это с строки форматирования и конкатенации:

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

И

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

Так что же лучше? Они одинаково читаемы и быстро печатаются, и выполняют точно так же. Какой из них более Pythonic и почему?

Вопрос задан, поскольку я не смог найти ответ для этого в Stack Overflow, который не касался Java.

+0

Частичный ответ можно найти по адресу [Любая причина не использовать «+» для объединения двух строк?] (Http: // stackoverflow.com/questions/10043636/any-reason-not-to-use-to-concatenate-two-strings) –

+1

Ну, с семантического и удобочитаемого угла, использование 'format' выглядит лучше. – Acepcs

+0

зависит от того, сколько строк должно быть конкатенировано и насколько сложным является формат – RomanPerekhrest

ответ

4

Зависит от продолжительности вашей строки и количества переменных. Для вашего случая использования я считаю, что string.format лучше, так как он имеет лучшую производительность и выглядит более чистым для чтения.

Иногда для более длинных строк + выглядит более чистым, потому что положение переменных сохраняется там, где они должны находиться в строке, и вам не нужно перемещать глаза, чтобы сопоставить позицию {} с соответствующей переменной.

Если вам удастся перейти на Python 3.6 вы можете использовать более новый более интуитивный синтаксис форматирования строки, как показано ниже, и есть лучшее из обоих миров:

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

Если у вас есть очень большой строки, я рекомендую используйте шаблонный движок наподобие Jinja2 (http://jinja.pocoo.org/docs/dev/) или что-то в этом роде.

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

+0

Вот что я думал, так как совмещение '{}' с соответствующей переменной на длинных строках кода может быть затруднительным, и легко ошибиться и посмотреть на неверную переменную для этой позиции. Похоже, ваш пример исправляет это с повышенной удобочитаемостью. Я определенно получаю Python 3.6 для этого, однако мой проект сильно построен вокруг модуля «pygame», знаете ли вы, поддерживает ли Python 3.6 «pygame»? – Arbiter

+0

@Arbiter Если я не ошибаюсь, 'pygame' отлично работает с Python 3.6. В прошлый раз я запускал «Kivy», который зависит от «pygame». – Eddie

+0

Отлично. Спасибо за ответ! – Arbiter

4

format() лучше:

  1. лучше с точки зрения производительности.
  2. прозрачный. Вы можете видеть, как выглядит предложение и каковы параметры, у вас нет кучи + и «вокруг».
  3. Дает вам больше возможностей, например, сколько мест после нуля в плавающей запятой, тем самым более гибким для изменений.
+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