পাইথন ৩.6-এ আউটপুট ফর্ম্যাট করতে f-স্ট্রিংয়ে কীভাবে নিউলাইন '\ n' ব্যবহার করবেন?


122

আমি জানতে চাই কীভাবে এই কেসটিকে এফ-স্ট্রিং দিয়ে পাইথোনিক উপায়ে ফর্ম্যাট করবেন:

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

সমস্যাটি হ'ল এফ-স্ট্রিংয়ের এক্সপ্রেশন অংশের '\'ভিতরে ব্যবহার করা যায় না {...}। প্রত্যাশিত আউটপুট:

Winners are:
Adam
Bob
Cyril

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

উত্তর:


134

আপনি পারবেন না। কোঁকড়া ধনুর্বন্ধনী এর ভিতরে ব্যাকস্ল্যাশগুলি উপস্থিত হতে পারে না {}; এর ফলে একটি ফলাফল SyntaxError:

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

এটি পি -পি-এ স্ট্রিংয়ের জন্য নির্দিষ্ট করা হয়েছে :

ব্যাকস্ল্যাশগুলি এফ-স্ট্রিংয়ের অংশের প্রকাশের অংশের ভিতরে উপস্থিত নাও হতে পারে, [...]

একটি বিকল্প assinging হয় '\n'একটি নাম এবং তারপর .joinযে ভিতরে f-string; এটি হল আক্ষরিক ব্যবহার না করে:

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

ফলাফল স্বরূপ:

Winners are:
Adam
Bob
Cyril

@ উইম দ্বারা উল্লিখিত অন্য একটি বিকল্পটি হল ফিরে আসার জন্য ব্যবহার chr(10)করা \nএবং তারপরে সেখানে যোগদান করা।f"Winners are:\n{chr(10).join(names)}"

আর একটি, অবশ্যই, '\n'.joinআগে আগে এবং পরে সেই অনুযায়ী নাম যুক্ত করা হয়:

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

একই ফলাফল ফলে।

বিঃদ্রঃ:

এটি f-রস্টিং এবং এর মধ্যে একটি ছোট পার্থক্য str.format। পরবর্তীকালে, আপনি সর্বদা বিরামচিহ্নগুলি ব্যবহার করতে পারেন এমন মঞ্জুরি দেওয়া হয়েছে যে সংশ্লিষ্ট উইকি ড্যাকটি প্যাক করা নেই যাতে এই কীগুলি রয়েছে:

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

(দয়া করে এটি করবেন না।)

পূর্ববর্তীগুলিতে, বিরামচিহ্নগুলি অনুমোদিত নয় কারণ আপনার ব্যবহারকারীর সনাক্তকারী থাকতে পারে না।


একদিকে: অন্যান্য উত্তরগুলি বিকল্প হিসাবে পরামর্শ হিসাবে আমি অবশ্যই বাছাই করব printবা করব format। আমি প্রদত্ত বিকল্পগুলি কেবল তখনই প্রয়োগ হয় যদি আপনার কোনও কারণে এফ-স্ট্রিংগুলি ব্যবহার করা আবশ্যক

কিছু নতুন হওয়ার কারণে, এর অর্থ এই নয় যে আপনার চেষ্টা করা উচিত এবং এটি দিয়ে সবকিছু করা উচিত ;-)


56

বিভাজক সহ স্ট্রিংগুলির তালিকা মুদ্রণ করতে আপনার এফ-স্ট্রিং বা অন্যান্য ফর্ম্যাটারের প্রয়োজন নেই। কেবল 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')
রিক

4
আপনি যদি তালিকাটি সরাসরি মুদ্রণ করতে না চান তবে আপনি কী করবেন, যদি আপনি এটি কোনও লগারে পাস করেন?
বব

4
@bob: তারপর ব্যবহার str.join(): text = '\n'.join(['Winners are:', *names])। বিটিডাব্লু, print()যে কোনও ফাইলকে লেখার জন্য ব্যবহার করা যেতে পারে ( ডিফল্টরূপে fileযুক্তির সাহায্যে নির্দিষ্ট করা হয় sys.stdout)।
ইউজিন ইয়ারমশ

11

অন্যরা যেমন বলেছে আপনি এফ স্ট্রিংগুলিতে ব্যাকস্ল্যাশগুলি ব্যবহার করতে পারবেন না, তবে আপনি এটি ব্যবহার করে পদক্ষেপ নিতে পারেন 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

4
আমি ছিলাম না, তবে লেখাটি লেখার সময় ব্যবহার os.linesepকরা ভাল ধারণা নয়
রিক মনিকা 24

4
@ রিকটিচি আমি ইতিমধ্যে বন্ধনীগুলিতে সতর্কতা যুক্ত করেছি এবং বিকল্প পদ্ধতির পরামর্শ দিই। যাইহোক, ওপি স্ক্রিনে মুদ্রণ করছে, পাঠ্য মোডে খোলা কোনও ফাইলে লিখছে না
Chris_Rands

আমি মনে করি না এটি গুরুত্বপূর্ণ। os.linesepশুধুমাত্র পড়া বা বাইনারি মোডে লেখার জন্য । আমি জানি এটি এই ক্ষেত্রে একই কাজ করবে, তবে এটি শুরু করা খারাপ অভ্যাস। কিন্তু আবার: আমি ডাউনভোট ছিলাম না। সাবধানবাণী আমার পক্ষে যথেষ্ট ভাল। :)
রিক

7

অন্যান্য উত্তরগুলি কীভাবে নতুন লাইনের চরিত্রটিকে একটি এফ-স্ট্রিং ক্ষেত্রে রাখবে সে সম্পর্কে ধারণা দেয়। তবে আমি যুক্তি দেব যে ওপি যে উদাহরণ দিয়েছে (যেটি ওপির প্রকৃত ব্যবহারের ক্ষেত্রে নির্দেশক হতে পারে বা নাও হতে পারে), এই ধারণাগুলির কোনওটিই ব্যবহার করা উচিত নয়।

এফ-স্ট্রিংগুলি ব্যবহারের পুরো পয়েন্টটি কোডের পঠনযোগ্যতা বৃদ্ধি করছে। এফ-স্ট্রিংগুলি দিয়ে আপনি করতে পারবেন এমন কিছুই নেই যা আপনি করতে পারবেন না 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
পঠনযোগ্যতা বিষয়বস্তু :) ... পুরানো অনুশীলন দক্ষদের জন্য উপযুক্ত এবং এটি কিছু ক্ষেত্রে আরও পঠনযোগ্য হতে পারে তবে তাদের কাছে প্রায় অচেনা হতে পারে এবং তাই তাদের জন্য অপঠনযোগ্য। দার্শনিক দৃষ্টিকোণ জন্য দুঃখিত।
হতাহত

4
@ সামান্য পাঠযোগ্যতা সাধারণত বিষয়গত নয় not অবশ্যই এই ক্ষেত্রে না। তবে দৈর্ঘ্যে এ বিষয়ে তর্ক করার মতো নয়।
রিক মনিকা

4
@ মিলেমড আপনি ঠিক বলেছেন যে পাঠ্যতা "স্বার্থগত" এই অর্থে যে এটি পূর্বের অভিজ্ঞতার দ্বারা প্রশিক্ষণযোগ্য । তবে আমাদের মস্তিস্ক ও ইন্দ্রিয়ের সীমাবদ্ধতা রয়েছে বলে প্রাসঙ্গিক পাঠ্যটি স্ক্যান করা শারীরিকভাবে কতটা সহজ, মানব মস্তিস্ক কতবার এটি সঠিকভাবে প্যাটার্ন-ম্যাচের দিকে ঝোঁকায়, অন্যটি সম্পর্কে আমাদের মস্তিষ্কের ভবিষ্যদ্বাণীগুলিতে সঠিকভাবে ইঙ্গিত দেয় সেভাবে পাঠযোগ্যতা অবজ্ঞাতভাবে পরিমাপ করা যেতে পারে can কোড (শেষটি কী হবে তার ইঙ্গিত দিয়ে একটি বিবৃতি / লাইনের সূচনা সহ), এবং কতটা সহজেই এটি কোনও নবজাতকের কাছে আরও পঠনযোগ্য হয়ে ওঠে।
mtraceur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.