पायथन 3.6 में आउटपुट फॉर्मेट करने के लिए f-string में न्यूलाइन '\ n' का उपयोग कैसे करें?


109

मैं जानना चाहता हूं कि इस मामले को एफ-स्ट्रिंग्स के साथ पायथोनिक तरीके से कैसे प्रारूपित किया जाए:

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

समस्या यह है कि एक एफ-स्ट्रिंग '\'के {...}अभिव्यक्ति भागों के अंदर इस्तेमाल नहीं किया जा सकता है । अपेक्षित उत्पादन:

Winners are:
Adam
Bob
Cyril

10
f"Winners are:\n{chr(10).join(names)}"
विम

जवाबों:


123

आप नहीं कर सकते। बैकस्लैश घुंघराले ब्रेसिज़ के अंदर दिखाई नहीं दे सकते हैं {}; ऐसा करने में परिणाम SyntaxError:

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

यह पीईपी में एफ-स्ट्रिंग्स के लिए निर्दिष्ट है :

बैकस्लैश एफ-स्ट्रिंग्स के अभिव्यक्ति भागों के अंदर प्रकट नहीं हो सकते हैं, [...]

एक विकल्प '\n'एक नाम पर भरोसा कर रहा है और फिर .joinउस पर f-स्ट्रिंग के अंदर ; यह शाब्दिक का उपयोग किए बिना है:

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)}"

फिर भी, एक और, '\n'.joinपहले से है और फिर उसके अनुसार नाम जोड़ें:

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

जिसके परिणामस्वरूप एक ही आउटपुट मिलता है।

ध्यान दें:

यह f-strings और के बीच छोटे अंतरों में से एक है str.format। उत्तरार्द्ध में, आप हमेशा दिए गए विराम चिह्नों का उपयोग कर सकते हैं जो कि एक संबंधित निराला हुकुम अनपैक्ड है जिसमें वे कुंजियाँ हैं:

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

(कृपया ऐसा न करें।)

पूर्व में, विराम चिह्न की अनुमति नहीं है क्योंकि आपके पास उनका उपयोग करने वाले पहचानकर्ता नहीं हो सकते हैं।


इसके अलावा: मैं निश्चित रूप से printया के लिए विकल्प चुनूंगा format, क्योंकि अन्य उत्तर विकल्प के रूप में सुझाते हैं। आपके द्वारा दिए गए विकल्प केवल तभी लागू होते हैं यदि आपको किसी कारण से f-strings का उपयोग करना चाहिए

सिर्फ इसलिए कि कुछ नया है, इसका मतलब यह नहीं है कि आपको कोशिश करनी चाहिए और इसके साथ सब कुछ करना चाहिए ;-)


55

आपको विभाजक के साथ तार की सूची को मुद्रित करने के लिए f- स्ट्रिंग्स या अन्य फ़ॉर्मेटर्स की आवश्यकता नहीं है। बस sepकीवर्ड तर्क का उपयोग करें print():

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

आउटपुट:

Winners are:
Adam
Bob
Cyril

कहा कि, उपयोग करना str.join()/str.format() यहाँ यकीनन किसी भी एफ-स्ट्रिंग वर्कअराउंड की तुलना में सरल और अधिक पठनीय होगा:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

13
अब तक का सबसे अच्छा जवाब। मैं इन दिनों हर समय प्रिंट फ़ंक्शन में स्टार अनपैकिंग का उपयोग करता हूं, जैसे किसी वस्तु, जैसे print(*dir(some_object), sep='\n')या के अंदर एक नज़र print(*vars(some_object), sep='\n')
रिक

1
यदि आप सूची को सीधे प्रिंट नहीं करना चाहते हैं तो आप क्या करते हैं, जैसे यदि आप इसे लकड़हारे के पास भेज रहे हैं?
बॉब

1
@ बॉब: तो बस का उपयोग str.join()करें text = '\n'.join(['Winners are:', *names]):। BTW, किसी भी फाइलprint() को लिखने के लिए इस्तेमाल किया जा सकता है ( तर्क के साथ निर्दिष्ट , डिफ़ॉल्ट रूप से)। filesys.stdout
यूजीन यर्मश

10

आप एफ-स्ट्रिंग्स में बैकस्लैश का उपयोग नहीं कर सकते हैं जैसा कि दूसरों ने कहा है, लेकिन आप इस का उपयोग कर के चारों ओर कदम उठा सकते हैं os.linesep(हालांकि ध्यान दें कि यह \nसभी प्लेटफार्मों पर नहीं होगा , और जब तक बाइनरी फ़ाइलों को पढ़ने / लिखने की सिफारिश नहीं की जाती है; देखें; रिक की टिप्पणियां ):

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

या शायद एक कम पठनीय तरह से है, लेकिन होने की गारंटी \nके साथ, chr():

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

2
मुझे नहीं था, लेकिन का उपयोग कर os.linesepरहा है एक अच्छा विचार नहीं है जब पाठ लिखने।
रिक

1
@ रिकेटी मैंने पहले ही कोष्ठकों में कैविएट जोड़ दिया और एक वैकल्पिक दृष्टिकोण सुझाया। वैसे भी, ओपी स्क्रीन पर छपाई कर रहा है, पाठ मोड में खोली गई फ़ाइल पर नहीं लिख रहा है
Chris_Rands

मुझे नहीं लगता कि यह मायने रखता है। os.linesepसिर्फ बाइनरी मोड में पढ़ने, या पढ़ने और लिखने के लिए है । मुझे पता है कि इस मामले में यह काम करेगा, लेकिन इसे शुरू करना एक बुरी आदत है। लेकिन फिर से: मैं नीचे नहीं था। कैवेट मेरे लिए काफी अच्छा है। :)
रिक

6

अन्य उत्तर नई लाइन वर्ण को एक एफ-स्ट्रिंग क्षेत्र में कैसे रखा जाए, इसके लिए विचार देते हैं। हालाँकि, मैं तर्क दूंगा कि ओपी ने जो उदाहरण दिया है (जो ओपी के वास्तविक उपयोग के मामले का संकेत हो सकता है या नहीं भी हो सकता है), इनमें से किसी भी विचार का वास्तव में उपयोग नहीं किया जाना चाहिए।

एफ-स्ट्रिंग्स का उपयोग करने का पूरा बिंदु कोड पठनीयता बढ़ रहा है। ऐसा कुछ भी नहीं है जो आप एफ-स्ट्रिंग्स के साथ कर सकते हैं जो आप के साथ नहीं कर सकते हैं format। ध्यान से विचार करें कि क्या इस बारे में अधिक पढ़ने योग्य कुछ है (यदि आप इसे कर सकते हैं):

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
पठनीयता व्यक्तिपरक है ... ... पुरानी प्रथा कुशल लोगों को सूट करती है और कुछ मामलों में अधिक पठनीय हो सकती है, लेकिन नॉब्स के लिए लगभग अज्ञात हो सकती है और इसलिए उनके लिए अपठनीय है। दार्शनिक दृष्टिकोण के लिए क्षमा करें।
malmed

2
आम तौर पर @ पठनीय व्यक्तिपरक नहीं है। निश्चित रूप से इस मामले में नहीं। लेकिन यह लंबाई के बारे में बहस करने लायक नहीं है।
रिक मोनिका

@ आप सही कह रहे हैं कि पठनीयता इस अर्थ में "व्यक्तिपरक" है कि यह पूर्व अनुभव से प्रशिक्षित है। लेकिन क्योंकि हमारे दिमाग और इंद्रियों की सीमाएँ हैं, पठनीयता को इस बात से मापा जा सकता है कि संबंधित पाठ को स्कैन करना शारीरिक रूप से कितना आसान है, मानव मस्तिष्क इसे कितनी बार सही ढंग से मिलाता है, यह हमारे मस्तिष्क की भविष्यवाणियों के बारे में कितनी सही संकेत देता है कोड (एक बयान की शुरुआत (अंत क्या होगा पर लाइन इशारा सहित), और कितनी आसानी से यह एक नौसिखिया के लिए अधिक पठनीय हो जाता है।
मृत्युंजय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.