Що означає% s у рядку формату python?


166

Що %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 не скаже, що це застаріле, немає сенсу стверджувати, що він є, коли його немає.
Бен

Відповіді:


198

Це синтаксис форматування рядків (який він запозичує з 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 () тепер просто вхід () для тих із вас, хто намагається для себе.
Готбурз

1
Чому (name,), а не просто name?
Камерон Хадсон

111

Відповідь Андрія хороша.

А щоб трохи більше допомогти, ось як ви використовуєте багаторазове форматування в одній рядку

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

Якщо ви використовуєте ints замість рядка, використовуйте% d замість% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12

2
приємно. % d рятує вас від трансляції str (int). будь-яка ідея, що означають% s та% d? я здогадуюсь, що я запам'ятаю їх як рядок і цифру
користувач391339

1
@ user391339 означає десятковий :) вони всі тут docs.python.org/2/library/…
sqram

Я не знаю для більш ранніх версій, але принаймні для 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)- це не буде `
sqram

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'

11
Цю відповідь було б покращено, якби вона пояснила, що синтаксис у запитанні форматує текст, а потім демонструє новіший метод. Таким чином він міг стояти самостійно. Надання прикладу, еквівалентного прикладу у питанні, також було б плюсом.
Steve S

13

%sвказує тип перетворення рядка при використанні можливостей форматування рядків python. Більш конкретно, %sперетворює задане значення в рядок за допомогою str()функції. Порівняйте це з %rтипом перетворення, який використовує repr()функцію для перетворення значення.

Погляньте на документи для форматування рядків .


13

%sі %dє специфікаторами формату або заповнювачами для форматування рядків / десяткових знаків / поплавків тощо.

НАЙБІЛЬШ часто використовуваний Формат специфікатор:

%s : рядок

%d : десяткові знаки

%f : плавати

Код роз'яснення:

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].


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.