%sはpython形式文字列で何を意味しますか?


167

%sPythonで何を意味しますか?そして、次のコードは何をするのでしょうか?

例えば...

 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
Paulo Scardine、2013

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トークンは、%記号の後の文字列に渡すものに置き換えられることに注意してください。また、ここでもタプルを使用し(タプルを使用する文字列が1つだけの場合はオプションです)、1つのステートメントで複数の文字列を挿入してフォーマットできることを示しています。


11
この種の文字列補間は、より強力なstr.format方法のために廃止されることに注意してください。
Paulo Scardine 2013

6
python3では、raw_input()は、自分で試してみる人のための単なるinput()になりました。
Gothburz

1
なぜ(name,)、とだけではなくname
キャメロンハドソン

112

アンドリューの答えはいいです。

そして、もう少し参考にするために、1つの文字列で複数の書式を使用する方法を示します

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

文字列の代わりに整数を使用している場合は、%sの代わりに%dを使用してください。

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

2
いいね。%dはstr(int)をキャストする手間を省きます。%sと%dが何を表すのかわかりませんか?私はそれらを文字列と数字として覚えていると思います。
user391339

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
それは問題の構文は、テキストをフォーマットしたことを説明している場合、この答えは改善されるだろうそして新しい方法を実証しました。そうすれば、それ自体で立つことができます。質問の例と同等の例を提供することもプラスになります。
スティーブS


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

2番目の質問への回答:このコードは何をしますか?...

これは、コマンドライン引数を受け入れる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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.