Co oznacza% s w ciągu formatu Pythona?

166

Co to %sznaczy w Pythonie? A co robi następny fragment kodu?

Na przykład...

 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])
Tyler
źródło
4
%Operator jest zastąpiona mocniejszego str.formatmetody, zobacz PPG-3101 .
Paulo Scardine,
35
W rzeczywistości PEP mówi: „W Pythonie 3.0 operator% jest uzupełniony o bardziej wydajną metodę formatowania ciągów znaków” i że jest przenoszony do Pythona 2.6. Skąd pochodzę „uzupełniony” oznacza dodany, a nie zastąpiony. PEP nie mówi „zastąpiony” iw żadnej części PEP nie mówi, że operator% jest przestarzały (ale mówi, że inne rzeczy są przestarzałe). Możesz preferować str.format i to jest w porządku, ale dopóki PEP nie powie, że jest przestarzały, nie ma sensu twierdzić, że tak nie jest.
Ben

Odpowiedzi:

198

Jest to składnia formatująca ciąg znaków (zapożyczona z C).

Zobacz „PyFormat” :

Python obsługuje formatowanie wartości w łańcuchy. Chociaż może to obejmować bardzo skomplikowane wyrażenia, najbardziej podstawowym zastosowaniem jest wstawianie wartości do ciągu za pomocą %ssymbolu zastępczego.

Edycja: Oto naprawdę prosty przykład:

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

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

%sToken pozwala mi wkładać (i potencjalnie format) ciąg. Zwróć uwagę, że %stoken jest zastępowany przez wszystko, co przekażę do ciągu po %symbolu. Zauważ również, że używam tutaj również krotki (gdy masz tylko jeden ciąg, użycie krotki jest opcjonalne), aby zilustrować, że wiele ciągów można wstawić i sformatować w jednej instrukcji.

Andrew Hare
źródło
11
Zauważ, że ten rodzaj interpolacji ciągów jest przestarzały na rzecz bardziej wydajnej str.formatmetody.
Paulo Scardine,
6
W python3 raw_input () jest teraz tylko input () dla tych z was, którzy próbują sami.
Gothburz
1
Dlaczego (name,)i nie tylko name?
Cameron Hudson
111

Odpowiedź Andrzeja jest dobra.

Aby ci nieco bardziej pomóc, oto jak używasz wielu formatów w jednym ciągu

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

Jeśli używasz ints zamiast string, użyj% d zamiast% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
źródło
2
miły. % d oszczędza ci rzucania str (int). masz pojęcie, co oznaczają% s i% d? Myślę, że zapamiętam je jako ciąg i cyfrę.
user391339
1
@ user391339 oznacza decimal :) wszyscy są tutaj docs.python.org/2/library/ ...
sqram
Nie wiem o wcześniejszych wersjach, ale przynajmniej dla 3.6 działa tak samo, nawet jeśli używasz %sna liczbach całkowitych, zostanie po prostu przekonwertowany na ciąg.
Lapin
@lapin masz rację :). ale nie zawsze tego chcesz. Powiedzmy, że chcesz wprowadzić cyfrę, na przykład. print('This number will be padded with 4 zeros: %05d ' % 1)- to zadziała. print('This number will be padded with 4 zeros: %05s ' % 1)- to się nie uda `
sqram
28

formatMetodę wprowadzono Pythonie 2.6. Jest bardziej wydajny i niewiele trudniejszy w użyciu:

>>> "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
źródło
11
Ta odpowiedź byłaby lepsza, gdyby wyjaśniła, że ​​składnia pytania dotyczy formatowania tekstu, a następnie zademonstrowała nowszą metodę. W ten sposób może stać samodzielnie. Podanie przykładu, który byłby równoważny z przykładem w pytaniu, również byłoby plusem.
Steve S
13

%swskazuje typ konwersji ciągu znaków podczas korzystania z możliwości formatowania napisów w języku Python. Dokładniej, %skonwertuje określoną wartość na ciąg przy użyciu str()funkcji. Porównaj to z %rtypem konwersji, który używa repr()funkcji do konwersji wartości.

Zapoznaj się z dokumentacją dotyczącą formatowania ciągów .

Brandon E. Taylor
źródło
13

%si %dsą specyfikatorami formatu lub symbolami zastępczymi do formatowania ciągów / liczb dziesiętnych / liczb zmiennoprzecinkowych itp.

NAJBARDZIEJ powszechnie używany specyfikator formatu:

%s : strunowy

%d : dziesiętne

%f : pływak

Kod nieobjaśniający:

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!"
Om Sao
źródło
6

Odpowiadając na drugie pytanie: do czego służy ten kod? ...

Jest to dość standardowy kod sprawdzający błędy dla skryptu Pythona, który akceptuje argumenty wiersza poleceń.

Zatem pierwsze ifstwierdzenie oznacza: jeśli nie przekazałeś mi argumentu, powiem ci, jak powinieneś przekazać mi argument w przyszłości, np. Zobaczysz to na ekranie:

Usage: myscript.py database-name

Następna ifinstrukcja sprawdza, czy „nazwa-bazy danych”, którą przekazałeś do skryptu, faktycznie istnieje w systemie plików. Jeśli nie, otrzymasz następujący komunikat:

ERROR: Database database-name was not found!

Z dokumentacji :

argv [0] to nazwa skryptu (zależy od systemu operacyjnego, czy jest to pełna ścieżka, czy nie). Jeśli polecenie zostało wykonane przy użyciu opcji wiersza poleceń -c do interpretera, argv [0] jest ustawiane na łańcuch „-c”. Jeśli żadna nazwa skryptu nie została przekazana do interpretera Pythona, argv [0] jest łańcuchem pustym.

mięso_mechaniczne
źródło
2

Oto dobry przykład w Pythonie3.

  >>> 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
źródło