Saya ingin tahu bagaimana memformat case ini dengan cara Pythonic dengan f-string:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
Masalahnya adalah itu '\'
tidak bisa digunakan di dalam {...}
bagian ekspresi f-string. Output yang diharapkan:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmed
sumber
sumber
f"Winners are:\n{chr(10).join(names)}"
Jawaban:
Tidak boleh. Garis miring terbalik tidak bisa muncul di dalam kurung kurawal
{}
; melakukan hal itu menghasilkanSyntaxError
:>>> f'{\}' SyntaxError: f-string expression part cannot include a backslash
Ini ditentukan dalam PEP untuk f-string:
Salah satu pilihan adalah
'\n'
memasukkan nama dan kemudian memilih.join
di dalamf
-string; yaitu, tanpa menggunakan literal:names = ['Adam', 'Bob', 'Cyril'] nl = '\n' text = f"Winners are:{nl}{nl.join(names)}" print(text)
Hasil dalam:
Opsi lain, sebagaimana ditentukan oleh @wim, adalah menggunakan
chr(10)
untuk\n
dikembalikan dan kemudian bergabung di sana.f"Winners are:\n{chr(10).join(names)}"
Namun yang lainnya, tentu saja, adalah
'\n'.join
terlebih dahulu dan kemudian menambahkan nama yang sesuai:n = "\n".join(names) text = f"Winners are:\n{n}"
yang menghasilkan keluaran yang sama.
catatan:
Ini adalah salah satu perbedaan kecil antara
f
-string danstr.format
. Yang terakhir, Anda selalu dapat menggunakan tanda baca yang diberikan bahwa dikt aneh yang sesuai dibongkar yang berisi kunci-kunci tersebut:>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'}) "Hello World!"
(Tolong jangan lakukan ini.)
Dahulu, tanda baca tidak diperbolehkan karena Anda tidak boleh memiliki pengenal yang menggunakannya.
Selain: Saya pasti akan memilih
print
atauformat
, seperti yang disarankan jawaban lain sebagai alternatif. Opsi yang saya berikan hanya berlaku jika Anda harus menggunakan f-string karena alasan tertentu.Hanya karena ada sesuatu yang baru, bukan berarti Anda harus mencoba dan melakukan semuanya dengannya ;-)
sumber
Anda tidak memerlukan f-string atau pemformat lain untuk mencetak daftar string dengan pemisah. Cukup gunakan
sep
argumen kata kunci untukprint()
:names = ['Adam', 'Bob', 'Cyril'] print('Winners are:', *names, sep='\n')
Keluaran:
Karena itu, menggunakan
str.join()
/ distr.format()
sini bisa dibilang lebih sederhana dan lebih mudah dibaca daripada solusi f-string apa pun:print('\n'.join(['Winners are:', *names])) print('Winners are:\n{}'.format('\n'.join(names)))
sumber
print(*dir(some_object), sep='\n')
atauprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. BTW,print()
dapat digunakan untuk menulis ke file apa pun (ditentukan denganfile
argumen,sys.stdout
secara default).Anda tidak dapat menggunakan garis miring terbalik di f-string seperti yang dikatakan orang lain, tetapi Anda dapat melangkah di sekitar ini menggunakan
os.linesep
(meskipun perhatikan ini tidak akan ada\n
di semua platform, dan tidak disarankan kecuali membaca / menulis file biner; lihat komentar Rick ):>>> import os >>> names = ['Adam', 'Bob', 'Cyril'] >>> print(f"Winners are:\n{os.linesep.join(names)}") Winners are: Adam Bob Cyril
Atau mungkin dengan cara yang kurang mudah dibaca, tetapi dijamin
\n
, denganchr()
:>>> print(f"Winners are:\n{chr(10).join(names)}") Winners are: Adam Bob Cyril
sumber
os.linesep
adalah bukan ide yang baik saat menulis teks.os.linesep
hanya untuk membaca, atau membaca dan menulis dalam mode biner . Saya tahu itu akan bekerja sama dalam kasus ini, tetapi itu adalah kebiasaan buruk untuk memulai. Tapi sekali lagi: Saya bukan orang yang tidak disukai. Peringatan itu cukup bagus untuk saya. :)Jawaban lain memberikan ide bagaimana menempatkan karakter baris baru ke dalam bidang f-string. Namun, saya berpendapat bahwa untuk contoh yang diberikan OP (yang mungkin atau mungkin tidak merupakan indikasi kasus penggunaan OP yang sebenarnya), tidak satu pun dari gagasan ini yang benar-benar harus digunakan.
Inti dari penggunaan f-string adalah meningkatkan keterbacaan kode. Tidak ada yang dapat Anda lakukan dengan f-string yang tidak dapat Anda lakukan
format
. Pertimbangkan baik-baik apakah ada yang lebih bisa dibaca tentang ini (jika Anda bisa melakukannya):f"Winners are:\n{'\n'.join(names)}"
...atau ini:
newline = '\n' f"Winners are:\n{newline.join(names)}"
...atau ini:
"Winners are:\n{chr(10).join(names)}"
vs. ini:
"Winners are:\n{}".format('\n'.join(names))
Cara terakhir setidaknya dapat dibaca, jika tidak lebih.
Singkatnya: jangan gunakan palu saat Anda membutuhkan obeng hanya karena Anda memiliki obeng baru yang mengkilap. Kode dibaca lebih sering daripada yang tertulis.
Untuk kasus penggunaan lain, ya, mungkin saja
chr(10)
ide ataunewline
idenya sesuai. Tapi tidak untuk yang diberikan.sumber