У меня есть строка этой формы
s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)
Все% s в строке имеют одинаковое значение (т.е. s). Есть ли лучший способ написать это? (Вместо того, чтобы перечислять три раза)
У меня есть строка этой формы
s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)
Все% s в строке имеют одинаковое значение (т.е. s). Есть ли лучший способ написать это? (Вместо того, чтобы перечислять три раза)
Вы можете использовать расширенное форматирование строк, доступное в Python 2.6 и Python 3.x:
incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}
Вам может понравиться прочитать это, чтобы понять: Операции форматирования строк.
Вы можете использовать тип форматирования словаря:
s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
В зависимости от того, что вы подразумеваете, лучше. Это работает, если ваша цель - удаление избыточности.
s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
Если вы используете Python 3.6+
, вы можете использовать новый так называемый f-strings
, который обозначает форматированные строки, и его можно использовать, добавив символ f
в начале строки, чтобы идентифицировать это как f-string.
price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!
Основные преимущества использования f-струн в том, что они более читабельны, могут быть быстрее и предлагают лучшую производительность:
Источник Pandas для всех: анализ данных Python, Daniel Y. Chen
Без сомнения, новый f-strings
более читабельен, так как вам не нужно переназначать строки, но быстрее ли это, как указано в вышеупомянутой цитате?
price = 123
name = "Jerry"
def new():
x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"
def old():
x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)
import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776 #new
> 5.861819514350163 #old
Запуск теста 10 миллионов кажется, что новый f-strings
на самом деле быстрее работает при сопоставлении.