web-dev-qa-db-ja.com

f-stringで改行 '\ n'を使用してPython 3.6で出力をフォーマットする方法は?

F-stringsを使用してPythonの方法でこのケースをフォーマットする方法を知りたい:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

問題は、f-stringの'\'式部分内で{...}を使用できないことです。期待される出力:

Winners are:
Adam
Bob
Cyril
44
malmed

できません。バックスラッシュは中括弧{}内に表示できません。そうするとSyntaxErrorになります:

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

これは、f-stringの PEP で指定されます。

バックスラッシュは、f-stringの式部分の中に表示されない場合があります、[...]

1つのオプションは、'\n'を名前に割り当て、f- string内の.joinを割り当てることです。つまり、リテラルを使用せずに:

names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

結果:

Winners are:
Adam
Bob
Cyril

@wimで指定されている別のオプションは、chr(10)を使用して\nを返し、そこに参加することです。 f"Winners are:\n{chr(10).join(names)}"

もちろん、もう1つは、事前に'\n'.joinにしてから、それに応じて名前を追加することです。

n = "\n".join(names)
text = f"Winners are:\n{n}"

結果は同じ出力になります。

注:

これは、f- stringsとstr.formatのわずかな違いの1つです。後者では、それらのキーを含む対応する奇抜なディクショナリが解凍されることを認められた句読点を常に使用できます。

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(これをしないでください。)

前者では、句読点は使用できません。これを使用する識別子を使用できないためです。


余談:私は間違いなくprintまたはformatを選択します。他の答えが代替案として示唆しているように。私が指定したオプションは、何らかの理由でf-stringsを使用する必要がある場合にのみ適用されます。

何かが新しいからといって、それですべてを試してみるべきだという意味ではありません;-)

セパレータ付きの文字列のリストを印刷するために、f-stringやその他のフォーマッタは必要ありません。 sepキーワード引数を print() に渡すだけです:

names = ['Adam', 'Bob', 'Cyril']
print("Winners are:", *names, sep="\n")

出力:

Winners are:
Adam
Bob
Cyril

ただし、ここで str.format() を使用すると、f-stringの回避策よりも間違いなくシンプルで読みやすくなります。

print("Winners are:\n{}".format("\n".join(names))
30
Eugene Yarmash

他の回答は、改行文字をf-stringフィールドに入れる方法のアイデアを提供します。ただし、OPの例(OPの実際のユースケースを示す場合と示さない場合があります)では、これらのアイデアを実際に使用しないでください。

F-stringsを使用する全体のポイントは、コードの可読性を高めることです。 formatでできないf-stringsでできることは何もありません。このことについて読みやすいがあるかどうかを慎重に検討してください(できれば):

f"Winners are:\n{'\n'.join(names)}"

...またはこれ:

newline = '\n'
f"Winners are:\n{newline.join(names)}"

...またはこれ:

"Winners are:\n{chr(10).join(names)}"

対これ:

"Winners are:\n{}".format('\n'.join(names))

最後の方法は、少なくともそうでなくても読み取り可能です。

要するに、ドライバーが必要なときは、光沢のある新しいドライバーがあるからといってハンマーを使用しないでください。コードは、書かれているよりもはるかに頻繁に読み取られます。

他のユースケースでは、はい、chr(10)アイデアまたはnewlineアイデアが適切である可能性があります。しかし、与えられたもののためではありません。

7
Rick Teachey

他の人が言ったようにf文字列にバックスラッシュを使用することはできませんが、 os.linesep を使用してこれを回避することができます(ただし、これはすべてのプラットフォームで\nになりません。バイナリファイルの作成; Rick's comments)を参照してください:

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

または、おそらく読みにくい方法ですが、 chr() を使用して\nであることが保証されています。

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril
2
Chris_Rands