% S समवर्ती के लिए + से बेहतर क्यों है?


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संगति के लिए नहीं है, यह C से प्राप्त स्ट्रिंग स्वरूपण के लिए रूपांतरण विनिर्देशन है printf(3)। उस या एक संघचालक के उपयोग के मामले हैं; जो आप उपयोग करते हैं वह परिस्थिति के निर्णय पर आधारित होना चाहिए, न कि हठधर्मिता पर। कोड लिखना कितना आसान है यह पूरी तरह से अप्रासंगिक है क्योंकि आप केवल एक बार ऐसा करने जा रहे हैं।
Blrfl

मैंने सिर्फ अजगर पर सवाल वापस किया है (हालांकि मैं एक अजगर व्यक्ति नहीं हूं और कोड में अभी भी गड़बड़ियां हो सकती हैं)। कृपया सुनिश्चित करें कि यह वह प्रश्न है जो आप पूछ रहे हैं, कोई भी उपयुक्त अपडेट करें और यदि आप C या जावा में रुचि रखते हैं तो एक अलग प्रश्न पूछने पर विचार करें ।

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) +10) = 90 वर्णों की नकल करेंगे पात्र। और स्ट्रिंग की संख्या और आकार बढ़ने के साथ चीजें चतुर्थ रूप से खराब हो जाती हैं। जावा इस मामले को कुछ समय के लिए उपयोग करने के लिए StringBuilderसंगति की श्रृंखला में परिवर्तित करके अनुकूलन करता है, लेकिन सीपीथॉन ऐसा नहीं करता है।

  3. कुछ उपयोग मामलों के लिए, लॉगिंग लाइब्रेरी एक एपीआई प्रदान करती है जो लॉग एंट्री स्ट्रिंग आलसी ( logging.info("blah: %s", 4)) बनाने के लिए प्रारूप स्ट्रिंग का उपयोग करती है । यह बेहतर प्रदर्शन के लिए बहुत अच्छा है यदि लॉगिंग लाइब्रेरी ने फैसला किया कि वर्तमान लॉग प्रविष्टि को लॉग फ़िल्टर द्वारा छोड़ दिया जाएगा, इसलिए इसे स्ट्रिंग को प्रारूपित करने की आवश्यकता नहीं है।


31
क्या आपके पास # 1 के लिए कोई वैज्ञानिक या अनुभवजन्य स्रोत है? क्योंकि मुझे लगता है कि यह बहुत कम पठनीय है (विशेषकर 2 या तीन से अधिक तर्कों के साथ)
लोविस

4
@ एल। मोलर: मुझे बिल्कुल यकीन नहीं है कि आप किस तरह के स्रोत से उम्मीद करते हैं कि अंततः एक व्यक्तिपरक अनुभव (पढ़ने में आसानी) है, लेकिन अगर आप मेरा तर्क चाहते हैं: 1)% s को प्रति प्लेसहोल्डर प्रति 2 अतिरिक्त वर्णों की आवश्यकता है + न्यूनतम 4 (या 8 यदि आप PEP8 का पालन करते हैं, 13 यदि आप ज़बरदस्ती करते हैं), 2)% s एक ही तार में संलग्न है, तो नेत्रहीन को पार्स करना आसान है, + के साथ, आपके पास अधिक चलती भागों हैं: करीब स्ट्रिंग, ऑपरेटर, चर , ऑपरेटर, ओपन स्ट्रिंग, 3) सिंटैक्स रंग% s में प्रत्येक कार्य के लिए एक रंग होता है: स्ट्रिंग और प्लेसहोल्डर, के साथ आपको तीन रंग मिलते हैं: स्ट्रिंग, ऑपरेटर और चर रंग।
रयान

4
@ L.Möller: 4) मेरे पास एक चर या शब्दकोश में लंबे समय तक तार लगाने का विकल्प है, जहां से प्रारूपण करने की आवश्यकता है, 5) प्रारूप स्ट्रिंग एक विन्यास फाइल, कमांड आर्ग या डेटाबेस से निर्दिष्ट उपयोगकर्ता हो सकता है। , इसी को संघटन के साथ नहीं कहा जा सकता है। लेकिन हाँ, मैं भी% s का उपयोग नहीं करूंगा, जब मेरे पास 4-5 से अधिक चीजें हैं, जो इंटरपोलेट करना चाहते हैं, इसके बजाय मैं पायथन में% (varname) के वेरिएंट या "{foo}" प्रारूप () का उपयोग करूंगा। मुझे लगता है कि स्पष्ट नाम बहुत अधिक प्रक्षेपित चर के साथ लंबी अवधि के तार के लिए पठनीयता में सुधार करते हैं।
रयान

2
मुझे नहीं पता कि "सच" क्या है, इसलिए मैं पूछता हूं कि क्या आपके पास सबूत हैं :-)। वास्तव में आपकी दूसरी टिप्पणी से सहमत हूँ
लव डेस

6
मुझे संदेह होने के लिए # 2 लगता है - क्या आपके पास प्रूफ है? मैं जावा से सर्वोच्च रूप से परिचित नहीं हूं, लेकिन C # कॉन्सेप्टन में स्ट्रिंग इंटरपोलेशन से तेज है । मैं पूरी तरह से # 1 से सहमत हूं और इसका उपयोग करने का निर्णय लेने के लिए वास्तव में उस पर निर्भर करता हूं, लेकिन आपको यह याद रखना होगा कि प्रक्षेप में स्ट्रिंग पार्सिंग और जटिलता की मात्रा की आवश्यकता होती है, जहां सहमति के लिए किसी की आवश्यकता नहीं होती है।
जिमी हॉफा

48

क्या मैं केवल वही हूं जो बाएं से दाएं पढ़ता है?

मेरे लिए, का उपयोग %sकरना जर्मन वक्ताओं को सुनने जैसा है, जहां मुझे यह सुनने के लिए बहुत लंबे वाक्य के अंत तक इंतजार करना होगा कि क्रिया क्या है।

त्वरित नज़र में इनमें से कौन स्पष्ट है?

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

या

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

17
स्पष्ट रूप से यह व्यक्तिपरक है, क्योंकि मुझे पहला पढ़ने योग्य लगता है - और लिखना और संपादित करना आसान है। दूसरा पाठ कोड के साथ परस्पर क्रिया करता है जो दोनों को अस्पष्ट करता है और शोर जोड़ता है। उदाहरण के लिए दूसरे में रिक्त स्थान को प्राप्त करना आसान है।
जैक्सबीस

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 कोड स्ट्रिंग में भी परिवर्तित हो जाता है, अन्यथा आपको str () कॉल का उपयोग करना पड़ता है जो% s कोड से कम पठनीय भी होता है।


1
मैं आपके पहले बयान से असहमत हूं, लेकिन हम अलग होने के लिए सहमत हो सकते हैं, मैं बस आपके दूसरे की तर्ज पर एक उत्तर पोस्ट करने वाला था, इसलिए upvote
Mawg

6

का उपयोग करना +चाहिए नहीं सामान्य रूप में बचा जाना। कई मामलों में सही दृष्टिकोण है। का उपयोग करना %sया .join()केवल विशेष मामलों में बेहतर होता है, और यह आमतौर पर काफी स्पष्ट होता है जब वे बेहतर समाधान होते हैं।

अपने उदाहरण में आप एक साथ तीन तारों को समेट रहे हैं, और उपयोग करने वाला उदाहरण +स्पष्ट रूप से सबसे सरल और सबसे पठनीय है, और इसलिए अनुशंसित है।

%sया .format()यदि आप तार या मूल्यों को एक बड़े स्ट्रिंग के बीच में प्रक्षेपित करना चाहते हैं तो उपयोगी है । उदाहरण:

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

इस मामले में %sइसका उपयोग करना अधिक पठनीय है क्योंकि आप कई खंडों में पहले स्ट्रिंग को काटने से बचते हैं। खासकर यदि आप कई मूल्यों को प्रक्षेपित कर रहे हैं।

.join() यदि आपके पास स्ट्रिंग्स का एक वैरिएबल आकार अनुक्रम है और / या आप एक ही विभाजक के साथ कई स्ट्रिंग्स को बदलना चाहते हैं।


2

चूंकि शब्द क्रम अलग-अलग भाषाओं में बदल सकता है, %sयदि आप अपने सॉफ़्टवेयर में स्ट्रिंग्स के अनुवाद का ठीक से समर्थन करना चाहते हैं, तो इसके साथ फॉर्म अनिवार्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.