Что означает% s в строке формата python?

167

Что %sзначит в Python? И что делает следующий фрагмент кода?

Например...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])
Тайлер
источник
4
%Оператор является устаревшим в пользу более мощного str.formatметода см PEP-3101 .
Пауло Скардин
35
На самом деле, что говорит PEP: «В Python 3.0 оператор% дополнен более мощным методом форматирования строк» ​​и он перенесен в Python 2.6. Откуда я родом «дополнен», значит добавлен, а не заменен. PEP не говорит «вытесненный», и ни в одной части PEP не говорится, что оператор% устарел (хотя он говорит, что другие вещи устарели снизу). Вы можете предпочесть формат str.format, и это нормально, но пока PEP не скажет, что он устарел, утверждать, что это не так, бессмысленно.
Бен

Ответы:

199

Это синтаксис форматирования строки (который он заимствует из C).

Пожалуйста, смотрите "PyFormat" :

Python поддерживает форматирование значений в строки. Хотя это может включать в себя очень сложные выражения, основное использование заключается в вставке значений в строку с %sзаполнителем.

Редактировать: Вот действительно простой пример:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

%sМаркер позволяет мне вставить (и , возможно , форматировать) строку. Обратите внимание, что %sтокен заменяется тем, что я передаю строке после %символа. Также обратите внимание, что здесь я также использую кортеж (когда у вас есть только одна строка, использование кортежа необязательно), чтобы проиллюстрировать, что несколько строк могут быть вставлены и отформатированы в одном выражении.

Эндрю Хэйр
источник
11
Обратите внимание, что этот тип интерполяции строк не рекомендуется в пользу более мощного str.formatметода.
Пауло Скардин
6
В python3 raw_input () теперь просто input () для тех из вас, кто пытается сам.
Gothburz
1
Почему (name,), а не только name?
Кэмерон Хадсон
112

Андрей ответит хорошо.

И просто, чтобы помочь вам немного больше, вот как вы используете несколько форматирования в одной строке

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Если вы используете int вместо строки, используйте% d вместо% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
источник
2
отлично. % d спасает вас от призыва str (int). есть идеи, что обозначают% s и% d? Я думаю, я буду помнить их как строки и цифры.
user391339
1
@ user391339 обозначает десятичную :) они все здесь docs.python.org/2/library/…
квадрат
Я не знаю, для более ранних версий, но по крайней мере для 3.6 он работает так же, даже если вы используете %sцелые числа, он просто будет преобразован в строку.
Lapin
@ Лапин, ты прав :). но это не всегда то, что вы хотите. Скажем, вы хотите набрать цифру, например. print('This number will be padded with 4 zeros: %05d ' % 1)- это будет работать. print('This number will be padded with 4 zeros: %05s ' % 1)- это не будет `
квадратный
28

formatМетод был введен в Python 2.6. Это более способно и не намного сложнее в использовании:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'
dansalmo
источник
11
Этот ответ был бы улучшен, если бы он объяснил, что синтаксис в вопросе форматировал текст, а затем продемонстрировал более новый метод. Таким образом, он может стоять сам по себе. Предоставление примера, эквивалентного примеру в вопросе, также будет плюсом.
Стив S
13

%sуказывает тип преобразования строки при использовании возможностей форматирования строки Python. Более конкретно, %sпреобразует указанное значение в строку, используя str()функцию. Сравните это с %rтипом преобразования, который использует repr()функцию для преобразования значения.

Посмотрите документы для форматирования строк .

Брэндон Э Тейлор
источник
13

%sи %dявляются Спецификаторами формата или местозаполнителями для форматирования строк / десятичных знаков / чисел и т. д.

Наиболее часто используемый спецификатор формата:

%s : строка

%d : десятичные дроби

%f : float

Самоочевидный код:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"
Ом Сао
источник
6

В ответ на ваш второй вопрос: что делает этот код? ...

Это довольно стандартный код проверки ошибок для скрипта Python, который принимает аргументы командной строки.

Итак, первое ifутверждение означает: если вы не передали мне аргумент, я расскажу вам, как вы должны передать мне аргумент в будущем, например, вы увидите это на экране:

Usage: myscript.py database-name

Следующий ifоператор проверяет, существует ли в файловой системе «имя базы данных», переданное вами сценарию. Если нет, вы получите сообщение, подобное этому:

ERROR: Database database-name was not found!

Из документации :

argv [0] - имя сценария (зависит от операционной системы, является ли это полным путем или нет). Если команда была выполнена с использованием параметра командной строки -c для интерпретатора, argv [0] устанавливается в строку '-c'. Если имя интерпретатора не было передано интерпретатору Python, argv [0] является пустой строкой.

mechanical_meat
источник
2

Вот хороший пример в Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
Gothburz
источник