সংক্ষিপ্তকরণের জন্য কেন% এর চেয়ে ভাল?


88

আমি বুঝতে পারি আমাদের পাইথনের %sচেয়ে স্ট্রিং সংমিশ্রনের জন্য ব্যবহার করা উচিত +

আমি যে কোন একটি করতে পারে:

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])

তবে কেন আমি বাদে অন্য কিছু ব্যবহার করব +? একটি সরল সঙ্গে কনকনেটেশন লিখতে তাড়াতাড়ি +। তারপরে আপনি যদি ফর্ম্যাটিং স্ট্রিংয়ের দিকে লক্ষ্য করেন, আপনি টাইপগুলি উদাহরণস্বরূপ %sএবং যেমন নির্দিষ্ট করেন %d। আমি বুঝতে পারছি প্রকারটি সম্পর্কে স্পষ্ট করে বলা ভাল।

তবে আমি পড়লাম যে সংক্ষিপ্তকরণের +জন্য ব্যবহার করা টাইপ করা সহজ, তবুও এড়ানো উচিত। স্ট্রিংগুলি অন্য কোনও উপায়ে একটিতে সংযুক্ত হওয়া উচিত কি তার স্পষ্ট কারণ আছে?


29
কে বলেছে এর চেয়ে ভাল?
ইয়ানিস

3
%sসিলেক্টেশনের জন্য নয়, এটি সি এর থেকে প্রাপ্ত স্ট্রিং ফর্ম্যাটিংয়ের জন্য রূপান্তরকরণের নির্দিষ্টকরণ printf(3)। এটি ব্যবহার করার জন্য বা একটি কনক্যাটেনশন অপারেটর কেস রয়েছে; যেটি আপনি ব্যবহার করেন তা সিদ্ধান্তের ভিত্তিতে হওয়া উচিত, ডগমা নয়। কোড লেখার পক্ষে কতটা সহজ তা সম্পূর্ণ অপ্রাসঙ্গিক কারণ আপনি কেবল একবার এটি করতে যাচ্ছেন।
blrfl

আমি প্রশ্নটি কেবল অজগরকে প্রত্যাখ্যান করেছি (যদিও আমি পাইথন ব্যক্তি নই এবং কোডে এখনও সমস্যা আছে)। দয়া করে নিশ্চিত হয়ে নিন যে আপনি যে প্রশ্নটি জিজ্ঞাসা করছেন এটি কোনও উপযুক্ত আপডেট করুন এবং আপনি সি বা জাভাতে আগ্রহী হলে একটি আলাদা প্রশ্ন জিজ্ঞাসা করুন ।

12
এবং এখন আমরা উচ্চতর এফ স্ট্রিং আছে ! print(f"{hello} {world}"), কনক্রিটেশনটির পাঠযোগ্যতা রয়েছে যেহেতু ভেরিয়েবলগুলি স্ট্রিংয়ের যেখানে দেখা যায় সেখানে দেখা যায় এবং তার চেয়ে দ্রুত হয় str.format
এনরিকো

উত্তর:


88
  1. পঠনযোগ্যতার। ফর্ম্যাট স্ট্রিং সিনট্যাক্সটি আরও পঠনযোগ্য, কারণ এটি স্টাইলটি ডেটা থেকে পৃথক করে। এছাড়াও, পাইথন এ, %sসিনট্যাক্স স্বয়ংক্রিয়ভাবে কোনো অ নিগৃহীত হবে strপ্রকারের str; যখন কনকমেটেশন কেবলমাত্র সাথে কাজ করে strএবং আপনি এর strসাথে সংমিশ্রণ করতে পারবেন না int

  2. কর্মক্ষমতা. পাইথনে strঅপরিবর্তনীয়, সুতরাং বাম এবং ডান স্ট্রিংকে প্রতিটি জোড় যুক্ত করার জন্য নতুন স্ট্রিংয়ে অনুলিপি করতে হবে। যদি আপনি 10 দৈর্ঘ্যের চারটি স্ট্রিং সংশ্লেষ করেন তবে আপনি কেবল 40 এর পরিবর্তে (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 টি অক্ষর অনুলিপি করছেন চরিত্র. স্ট্রিংয়ের সংখ্যা এবং আকার বাড়ার সাথে সাথে জিনিসগুলি চতুর্ভুজিকভাবে খারাপ হয়। জাভা ব্যবহারের জন্য কনটেক্সেটের সিরিজটি রূপান্তর করে এই StringBuilderকেসটিকে কয়েকবার অনুকূলিত করেছে , তবে সিপিথন তা করে না।

  3. কিছু ব্যবহারের ক্ষেত্রে লগিং লাইব্রেরি এমন একটি এপিআই সরবরাহ করে যা লগি এন্ট্রি স্ট্রিংটি অলস ( logging.info("blah: %s", 4)) তৈরি করতে ফর্ম্যাট স্ট্রিং ব্যবহার করে । উন্নত পারফরম্যান্সের জন্য এটি দুর্দান্ত, যদি লগিং লাইব্রেরি স্থির করে যে বর্তমান লগ এন্ট্রি কোনও লগ ফিল্টার দ্বারা ফেলে দেওয়া হবে, সুতরাং স্ট্রিংটি ফর্ম্যাট করার দরকার নেই।


31
আপনার # 1 এর জন্য কোনও বৈজ্ঞানিক বা অভিজ্ঞতামূলক উত্স আছে? কারণ আমি মনে করি এটি অনেক কম পাঠযোগ্য (বিশেষত ২ বা তিনটির বেশি যুক্তির সাথে)
লভিস

4
@ এল। মুলার: শেষ পর্যন্ত একটি বিষয়গত অভিজ্ঞতা (পড়া সহজলভ্য) যা থেকে আপনি কী ধরনের উত্স আশা করেন তা আমি নিশ্চিতভাবে জানি না, তবে আপনি যদি আমার যুক্তি চান: 1)% s প্রতি স্থানধারক বনাম + জন্য 2 অতিরিক্ত অক্ষর প্রয়োজন সর্বনিম্ন 4 (বা 8 আপনি পিইপি 8 অনুসরণ করেন, 13 যদি আপনি বাধ্য করেন), 2)% s একক স্ট্রিংয়ে আবদ্ধ থাকে, সুতরাং + এর সাথে চাক্ষুষভাবে পার্স করা আরও সহজ, আপনার আরও চলন্ত অংশ রয়েছে: বন্ধ স্ট্রিং, অপারেটর, ভেরিয়েবল , অপারেটর, ওপেন স্ট্রিং, 3) সিন্ট্যাক্স রঙিন% s এর প্রতিটি ফাংশনের জন্য একটি রঙ থাকে: স্ট্রিং এবং স্থানধারক, + সহ আপনি তিনটি রঙ পাবেন: স্ট্রিং, অপারেটর এবং ভেরিয়েবল রঙিন।
মিথ্যা রায়ান

4
@ এল। ম্যালার: ৪) আমার কাছে ভেরিয়েবল বা অভিধানে দীর্ঘ বিন্যাসের স্ট্রিং রাখার অপশন রয়েছে, যেখানে ফর্ম্যাটিং করা দরকার সেখান থেকে, ৫) বিন্যাসের স্ট্রিংটি কোনও কনফিগার ফাইল, কমান্ড আরগস বা ডাটাবেস থেকে নির্দিষ্ট করা যেতে পারে , একই কথা বলা যেতে পারে না। তবে হ্যাঁ, আমি যখন% 4 টিরও বেশি জিনিস ইন্টারপোলেট করার জন্য করতাম তখন আমি% s ব্যবহার করতাম না, পরিবর্তে আমি পাইথনের% (বর্ণ) এর রূপ বা "{foo}"। ফর্ম্যাট () ব্যবহার করতাম। আমি মনে করি যে সুস্পষ্ট নামগুলি প্রচুর ইন্টারপোলটেড ভেরিয়েবলের সাথে দীর্ঘতর ফর্ম্যাট স্ট্রিংয়ের পাঠযোগ্যতার উন্নতি করে।
মিথ্যা রায়ান

2
আমি "সত্য" কি জানি না, এজন্যই যদি আপনার কাছে প্রমাণ থাকে: আমি জিজ্ঞাসা করি :-)। সত্যিই আপনার দ্বিতীয় মন্তব্যের সাথে একমত
লভিস

6
আমি সন্দেহভাজন হওয়ার জন্য # 2 খুঁজে পেয়েছি - আপনার কাছে কী দলিলযুক্ত প্রমাণ রয়েছে? আমি জাভার সাথে চূড়ান্তভাবে পরিচিত নই, তবে সি # তে কনটেনটেশন স্ট্রিং ইন্টারপোলেশনের চেয়ে দ্রুত । আমি সম্পূর্ণভাবে # 1 এর সাথে একমত এবং কোনটি কখন ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য সত্যই এর উপর নির্ভর করি তবে আপনাকে মনে রাখতে হবে যে অন্তরোলনের জন্য প্রচুর পরিমাণে স্ট্রিং পার্সিং এবং জটিলতা প্রয়োজন যেখানে কনটেনটেশন এর কোনও প্রয়োজন নেই requires
জিমি হোফা 14

48

আমি কি কেবলমাত্র বাম থেকে ডান পড়ি?

আমার কাছে, ব্যবহার %sকরা জার্মান স্পিকার শোনার মতো, যেখানে ক্রিয়াটি কী তা শুনতে খুব দীর্ঘ বাক্যটি শেষ না হওয়া পর্যন্ত আমাকে অপেক্ষা করতে হবে।

এর মধ্যে কোনটি দ্রুত নজরে পরিষ্কার হয়?

"your %s is in the %s" % (object, location)

অথবা

"your " + object + " is in the " + location  

17
স্পষ্টতই এটি বিষয়বস্তু, যেহেতু আমি প্রথমটি আরও পঠনযোগ্য - এবং লিখতে এবং সম্পাদনা করা সহজ find দ্বিতীয়টি কোড সহ পাঠ্যকে অন্তর্নিবিষ্ট করে যা উভয়কেই অস্পষ্ট করে এবং শব্দ যোগ করে। উদাহরণস্বরূপ দ্বিতীয়টিতে ফাঁকা স্থান পাওয়া সহজ।
জ্যাকবিবি

5
@ জ্যাকসবিবি আমি আসলে মনে করি আপনার মস্তিষ্ক এই ফর্ম্যাটটির সাথে এতটাই পরিচিত যে আপনি তাত্ক্ষণিক বন্ধনীতে ঝাঁপিয়ে পড়েছেন এবং তাত্ক্ষণিকভাবে শব্দগুলি প্রতিস্থাপন করছেন। প্রযুক্তিগতভাবে এটি বাম থেকে ডান পড়া নয়, তবে এটি পুরোপুরি ঠিক। আমি এটিও করতে পেরেছি, সুতরাং হ্যাঁ, 1 পড়া আরও সহজ কারণ আমি জানি যে দ্বিতীয়টির উদ্ধৃতিগুলির আগে এবং তার পরে আমার বোকা ব্যবধানের সমস্যাগুলি মোকাবেলা করতে হবে এবং এটি সত্যিই ধীরে ধীরে কাজ করবে।
নেলসন

3
কয়েক nদশক পরে , আমার মনও এর মতো কাজ করে ;-) তবে আমি এখনও আমার উত্তরটির সাথে দাঁড়িয়ে আছি, দ্বিতীয়টি পরিষ্কার করা এবং পড়া সহজ, সুতরাং বজায় রাখা। এবং এটি আপনার কাছে যত বেশি পরামিতি রয়েছে তা আরও স্পষ্ট হয়ে ওঠে। শেষ পর্যন্ত, যদি এটি একজন লোক দেখায় তবে আপনি যা পরিচিত এবং স্বাচ্ছন্দ্য বোধ করেন তার সাথে যান; যদি এটি একটি দলের প্রচেষ্টা, ধারাবাহিকতা এবং কোড পর্যালোচনা প্রয়োগ করুন; মানুষ অভ্যস্ত হতে পারে।
মাউগ

4
প্রথমটিটি আমার পক্ষে আরও বেশি পঠনযোগ্য কারণ বাক্যটির মাঝখানে এটির "ক্রাফট" কম রয়েছে। আমার চোখের পক্ষে শেষের দিকে নজর দেওয়া আরও সহজ তবে আমার মস্তিষ্কের জন্য অতিরিক্ত উদ্ধৃতি, স্পেস এবং প্লাসগুলি বিশ্লেষণ করা। অবশ্যই, আমি এখন অনেক পছন্দ পাইথন 3.6 বিন্যাস স্ট্রিং: f"your {object} is in the {location}"
ডাস্টিন ওয়াইয়াট

8
পরিবর্তনশীল নিজেই উদ্ধৃতি দিয়ে ঘিরে রাখা দরকার যখন পড়তে এবং লিখতে আমার আরও কঠিন মনে হয়। "your '" + object + "' is in the '" + location + "'"... আমি ঠিক এখনই পেয়েছি কিনা তা সম্পর্কে আমি নিশ্চিত নই ...
ডাস্টিন ওয়াইয়াট

12

পাঠযোগ্যতার যুক্তি স্পষ্টকারী একটি উদাহরণ:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(নোট করুন যে দ্বিতীয় উদাহরণটি কেবল আরও পঠনযোগ্য নয় তবে সম্পাদনা করাও সহজ, আপনি এক লাইনে টেমপ্লেট পরিবর্তন করতে পারেন এবং অন্যটিতে ভেরিয়েবলের তালিকা রাখতে পারেন)

একটি পৃথক সমস্যা হ'ল% s কোড স্ট্রিংতে রূপান্তর করে, অন্যথায় আপনাকে স্ট্র () কলটি ব্যবহার করতে হবে যা একটি% s কোডের চেয়ে কম পঠনযোগ্য।


1
আমি আপনার প্রথম বক্তব্যের সাথে একমত নই, তবে আমরা ভিন্নমত পোষণ করতে সম্মত হতে পারি, আমি কেবল আপনার দ্বিতীয় লাইনের সাথে উত্তর পোস্ট করতে
যাচ্ছিলাম

6

সাধারণভাবে ব্যবহার এড়ানো +উচিত নয় । অনেক ক্ষেত্রে সঠিক পন্থা হয়। বিশেষ ক্ষেত্রে ক্ষেত্রে ব্যবহার করা %sবা .join()কেবল তার চেয়ে বেশি পছন্দনীয় এবং এগুলি আরও ভাল সমাধান হলে সাধারণত তা স্পষ্ট হয়।

আপনার উদাহরণে আপনি তিনটি স্ট্রিং একসাথে জালিয়ে তুলছেন, এবং উদাহরণটি ব্যবহার +করা স্পষ্টভাবে সহজতম এবং সর্বাধিক পঠনযোগ্য এবং তাই প্রস্তাবিত।

%sঅথবা .format()আপনি যদি বড় স্ট্রিংয়ের মাঝখানে স্ট্রিং বা মানগুলি ইন্টারপোল্ট করতে চান তবে দরকারী । উদাহরণ:

print "Hello %s, welcome to the computer!" % name

এই ক্ষেত্রে %sএটি ব্যবহার করা আরও পঠনযোগ্য কারণ আপনি প্রথম স্ট্রিংটিকে একাধিক বিভাগে কাটা এড়াতে পারবেন না। বিশেষত যদি আপনি একাধিক মানকে ইন্টারপোল্ট করে থাকেন।

.join() আপনার যদি স্ট্রিংগুলির পরিবর্তনশীল আকারের ক্রম থাকে এবং / অথবা আপনি একই বিভাজকের সাথে একাধিক স্ট্রিং সংমিশ্রিত করতে চান তবে উপযুক্ত is


2

যেহেতু শব্দের ক্রমটি বিভিন্ন ভাষায় পরিবর্তিত হতে পারে, তাই %sআপনি যদি আপনার সফ্টওয়্যারটিতে স্ট্রিংয়ের অনুবাদটিকে যথাযথভাবে সমর্থন করতে চান তবে ফর্মটি আবশ্যক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.