शुरुआत: आउटपुट कमांड के भीतर ऑपरेशन क्यों नहीं होते हैं?


23

मैं एक परिचयात्मक प्रोग्रामिंग पुस्तक के माध्यम से जा रहा हूँ और यह छद्मकोश में एक सरल उदाहरण सूचीबद्ध करता है:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

हम क्यों नहीं बुलाया एक और चर बनाने के लिए छोड़ देना चाहिए myAnswerऔर इस तरह से ऑपरेशन कमांड में डाल दिया:

Start
  input myNumber
  output myNumber * 2
Stop

पूर्व सही और उत्तरार्द्ध क्यों नहीं है?


39
क्या पुस्तक कहती है कि आप नहीं कर सकते?
ट्यूलेंस कोर्डोवा

2
पुस्तक यह नहीं कहती है कि मैं नहीं कर सकता; यह इसके बारे में कुछ नहीं कहता है।
user1475207

5
मुझे लगता है कि छोटे से दूसरे ब्लॉक के साथ शुरुआत करना काफी उचित है, फिर अगर जरूरत हो तो पहले कन्वर्ट करें।
मतीन उल्हाक

13
संक्षिप्त उत्तर: आप कर सकते हैं, लेखक इसे स्पष्ट करने के लिए (एक प्रयास में) कर रहा है (हालांकि ईमानदारी से, यह वास्तव में इसे बिल्कुल भी स्पष्ट नहीं करता है ...)।
जूल्स

1
दोनों तरीके काम करते हैं। अधिक अनुभव के साथ, आप पाएंगे कि गंभीर कोडिंग के लिए पठनीयता कोड की सादगी या मौलिकता से कहीं अधिक महत्वपूर्ण है। आपका कोड आसानी से इसे बनाए रखने वाले कई अन्य लोगों द्वारा पठनीय होना चाहिए।
फ्रांटिसेक कोसुथ

जवाबों:


36

आप कर सकते हैं, लेकिन दूसरा यह है कि आप देख रहे हैं कि क्या चल रहा है और इसलिए आप myAnswerकार्यक्रम में बाद में उपयोग कर सकते हैं । यदि आप अपने दूसरे का उपयोग करते हैं, तो आप पुन: उपयोग नहीं कर सकते myAnswer

तो बाद में कार्यक्रम में नीचे आप चाहते हो सकता है:

myAnswer + 5
myAnswer + 1
etc.

आपके पास अलग-अलग ऑपरेशन हो सकते हैं जिनके लिए आप इसका उपयोग करना चाहते हैं।

स्वैपिंग संख्या पर विचार करें:

Start
  input myNumber
  set myAnswerA = myNumber * 2
  output myAnswerA
  set myAnswerB = myNumber * 3
  output myAnswerB
  set temp = myAnswerA
  set myAnswerA = myAnswerB
  set myAnswerA = temp
  output myAnswerA
  output myAnswerB
Stop

जो बिना चरों के मुश्किल होगा। जब तक आप जटिलता नहीं देखते तब तक कंप्यूटर की किताबें वास्तविक रूप से शुरू होती हैं, और अधिकांश प्रोग्रामिंग आसान होती है। अधिकांश सब कुछ ट्यूटोरियल में तुच्छ है, और यह केवल जटिलता में है क्या आप देखते हैं कि चीजें कहां हैं या समझ में नहीं आती हैं।


1
तो यह वैध तर्क है लेकिन यह सबसे अच्छा अभ्यास नहीं है क्योंकि यह मुझे कार्यक्रम के अन्य हिस्सों में संचालन का पुन: उपयोग करने की अनुमति नहीं देता है?
user1475207

@ user1475207 मेरा संपादन देखें इस छोटे से कार्यक्रम में इससे कोई फर्क नहीं पड़ता। लेखक जानता है कि आप बाद में मूल्य को आउटपुट करने की तुलना में बहुत अधिक कर रहे हैं। यह केवल जटिलता में है जो आपको यह देखने को मिलता है। इसके साथ बने रहें।
जॉनी

आह ठीक है, मैं देख रहा हूं। मैं इसे ध्यान में रखते हुए पुस्तक के माध्यम से जारी रखूंगा। धन्यवाद।
यूजर 1475207

29
@ user1475207 दोनों तरह से अपनी जगह है। कभी-कभी आपको अतिरिक्त चर का उपयोग करना पड़ सकता है। कभी-कभी आपको अतिरिक्त चर की आवश्यकता नहीं हो सकती है, लेकिन इसे किसी भी तरह से उपयोग करना चाहते हैं क्योंकि कुछ स्थितियों में, बस कुछ अच्छी तरह से सोचा हुआ नाम देने से यह अधिक स्पष्ट हो जाता है। कभी-कभी आप अतिरिक्त चर का उपयोग नहीं करना चाहते हैं क्योंकि यह सिर्फ शोर है। और कई बार, अंतर वास्तव में मायने नहीं रखता है।
8bittree

3
मुझे लगता है कि किसी ऑपरेशन के परिणाम को बिना किसी वेरिएबल को बताए वापस करना वैध है। लेकिन मैंने resultछोटे कार्यों के लिए भी एक वैरिएबल बनाने की आदत डाली , ताकि जोड़कर डिबगिंग print(result)वास्तव में तेज हो। हालांकि यह अच्छे अभ्यास से अधिक सुविधा से बाहर है।
दायां पैर

33

एक और कारण, असाइनमेंट set myAnswer = myNumber * 2परिणामी मूल्य को एक नाम देता है । आपके कोड के दो लाइन संस्करण को पढ़ने वाला व्यक्ति केवल यह जानता है कि यह उसके मूल्य को प्रिंट करता है myNumber * 2। तीन लाइन संस्करण पढ़ने वाला व्यक्ति यह देख सकता myNumber * 2है कि इसका उत्तर क्या है

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


10
+1, हालाँकि यह तभी लागू होता है जब नाम सार्थक होता है। इस तरह के नाम i, resultया कुछ अन्य अर्थहीन पहचानकर्ता का उपयोग करके अस्थायी रूप से स्पष्टता में सुधार करने के लिए कुछ भी नहीं किया जाता है, और केवल कोड का सुराग लगाता है
अलेक्जेंडर - मोनिका

7
@Alexander: अर्थहीन नाम अभी भी सार्थक हो सकते हैं। iबेहतर एक सरणी सूचकांक हो गया था। यदि कोई है result, तो फ़ंक्शन को return resultनैतिक समकक्ष के साथ समाप्त होना चाहिए । और इसी तरह ...
केविन

6
@ केविन "अर्थहीन नाम अभी भी सार्थक हो सकते हैं" उह ... क्या आप सुनिश्चित हैं? योग्य
अलेक्जेंडर - मोनिका

3
@ केविन यदि आप जा रहे हैं return result, तो आप परिणाम के लिए जो भी असाइन कर रहे थे उसे वापस करने के लिए सिर्फ इनलाइन हो सकते हैं। हम इसका परिणाम देख सकते हैं। आप इसे वापस कर रहे हैं, हम इसे प्राप्त करते हैं।
अलेक्जेंडर - मोनिका

5
@ अलेक्जेंडर: जाहिर है कि आप रिटर्न को इनलाइन कर सकते हैं यदि यह एक सरल अभिव्यक्ति है, लेकिन क्या होगा यदि आपको इसे कई बयानों पर बनाने की आवश्यकता है? लगातार नामकरण योजना का उपयोग करने से यह स्पष्ट हो जाता है कि आप इन मामलों में क्या कर रहे हैं।
केविन

14

वह स्यूडोकोड है। यह किसी विशेष रूप से कार्यान्वित की जाने वाली भाषा नहीं है।

कुछ प्रोग्रामिंग भाषाएं अभिव्यक्ति के मूल्यांकन का समर्थन नहीं करती हैं और फिर कोड की एक ही पंक्ति में परिणाम की रूपरेखा तैयार करती हैं। उदाहरण के लिए ज्यादातर असेंबलर इसका समर्थन नहीं करते हैं। शायद किताब के लेखक कम-स्तरीय फैशन में चीजों को दिखाना चाहते थे।


2
और कुछ भाषाएं (उदाहरण के लिए C) दोनों को एक ही समय में अनुमति देती हैं - यदि आप वास्तव में चाहते हैं तो आप "आउटपुट (उत्तर = उत्तर * 2)" जैसी चीजें लिख सकते हैं! (लेकिन "आउटपुट (उत्तर == उत्तर * 2)" से सावधान रहें, इसका अर्थ कुछ अलग है ...
एलेफ़ेज़र

9

अन्य उत्तरों ने विशिष्ट मैकेनिक विवरणों को संबोधित किया है और एक या दूसरे रूप के उदाहरण बेहतर होंगे, लेकिन मैं थोड़ा आगे की पृष्ठभूमि का उल्लेख करना चाहता हूं, दार्शनिक का प्रकार:

आप एक भाषा सीख रहे हैं।

एक भाषा एक ऐसी चीज है जिसमें विचारों को व्यक्त किया जा सकता है और समझा जा सकता है (संप्रेषित)। एक कंप्यूटर प्रोग्रामिंग भाषा में अतिरिक्त संपत्ति होती है कि इसे यंत्रों द्वारा पार्स किया जा सकता है जिसे उस भाषा के उपयोग में निर्दिष्ट और खिलाए गए विचारों (निर्णयों) के आधार पर कार्रवाई (निष्पादित) करने के लिए डिज़ाइन की गई मशीन द्वारा किया जाता है।

किसी भी भाषा में जो सभी उपयोगी है, उस भाषा में व्यक्त किसी भी विचार को व्यक्त करने का एक से अधिक तरीका है।


अंग्रेजी भाषा में उपलब्ध विभिन्न प्रकार की बारीकियों पर विचार करें। यहां तक ​​कि एक साधारण वाक्य, जैसे कि

बिल्ली बॉक्स पर कूद गई।

उसी भिन्न भौतिक ब्रह्माण्ड क्रिया का उल्लेख करते हुए दृश्य के विभिन्न भागों पर थोड़ा अलग विचार व्यक्त करने या जोर देने के लिए भिन्न हो सकते हैं

पहले व्याकरणिक रूपांतर हैं:

बॉक्स को बिल्ली द्वारा कूद दिया गया था।

बॉक्स पर बिल्ली कूद गई।

फिर व्यापक और व्यापक रूपांतर हैं, फिर भी उसी शारीरिक क्रिया का जिक्र है:

बिल्ली के प्रभाव में बॉक्स हिल गया।

बिल्ली बॉक्स के शीर्ष पर एक थूड के साथ नीचे आई।

बिल्ली के समान हवा में हल्के से छलांग लगाते हैं और पास के बॉक्स पर बड़े करीने से उतरते हैं।

बस उस अंतिम वाक्य में "पास" शब्द के निहितार्थ को देखें। इसका समावेश अवधारणाओं की एक पूरी नई श्रृंखला को बताता है जो अन्यथा मौजूद नहीं है।


नहीं है हमेशा की तुलना में अधिक एक ही रास्ता यह करने के लिए, विपरीत करने के लिए अजगर जेन।


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

लेकिन एक परिचयात्मक प्रोग्रामिंग कोर्स या एक परिचयात्मक अंग्रेजी पाठ्यक्रम में, आपको सबसे पहले विभिन्न तरीकों (शब्द, कोड स्निपेट्स) को सीखना होगा जिसमें आप एक विचार को काउच कर सकते हैं इससे पहले कि आप निर्णय लें कि कौन सा विकल्प पूरी तरह से उपयुक्त है।


3
बेशक, पायथन अपने नियम को तोड़ता है। आपके पास लैम्ब्डा और नेस्टेड फ़ंक्शन हैं; छोरों, सूची समझ, और जनरेटर के भाव; फ्लोट्स, डेसीमल, और अंश; और __init__और __new__, बस कुछ ही नाम है। मुद्दा यह है कि प्रत्येक एक अलग अलग समस्या के लिए उपयुक्त है। आप उन अंग्रेजी वाक्यों में से एक को यादृच्छिक पर नहीं लेंगे, न ही आप इनमें से एक पायथन भाषा की विशेषताओं को यादृच्छिक पर चुनेंगे।
केविन

1
@ केविन, हाँ, सहमत। बिंदु किसी के लिए वह यह है कि पूरी तरह से नए प्रोग्रामिंग करने के लिए, वाक्य रचना की आवश्यकता की शुद्धता कर सकते हैं इसे बनाने लगते है कि वहाँ सिर्फ एक ही रास्ता कुछ भी पूरा-यानी जा सकता है, को कॉपी सटीक से कोड ट्यूटोरियल शब्दशः, कैसे मध्य विद्यालय गणित की समस्याओं के समान (५ )३ x २४ 57) का केवल एक सही उत्तर है। " फ़ाइलों को सिकोड़ने का कार्यक्रम क्या है ?" यदि आप मेरा उत्तर पढ़ते हैं, तो मैं यादृच्छिक पर कुछ भी करने के लिए नहीं कह रहा हूँ; मैं कह रहा हूँ कि आप कर रहे हैं हमेशा विकल्प बनाना जब आप प्रोग्राम।
वाइल्डकार्ड

1
यह निश्चित रूप से उचित है। मुझे लगता है कि समस्या यह है कि आप पायथन के ज़ेन को थोड़ा सरल या गलत तरीके से प्रस्तुत कर रहे हैं। पूरे बिंदु यह है कि उन निर्णयों को अंततः आपकी समस्या के संदर्भ द्वारा निर्धारित किया जाता है, न कि आप स्वतंत्र रूप से चुन सकते हैं। आपको इसे करने का एक तरीका खोजने के लिए बहुत अधिक पुनरावृत्ति और रिफैक्टिंग से गुजरना पड़ सकता है, एक तरीका जो आपकी आवश्यकताओं को पूरी तरह से फिट करता है, वह पठनीय, संक्षिप्त, यहां तक ​​कि सुरुचिपूर्ण है। लेकिन किसी भी समस्या के लिए, इस तरह का एक आदर्श समाधान होना चाहिए, और एक अच्छी तरह से डिजाइन की गई भाषा धीरे-धीरे आपको इसकी ओर मार्गदर्शन करेगी। यही ज़ेन का मतलब है।
केविन

4
एक निंदक कह सकता है 'पायथन में इसे करने का केवल एक ही तरीका है, लेकिन पायथन का हर नया संस्करण "और अब कुछ पूरी तरह से अलग करने के लिए लागू होता है" पिछले संस्करण ने जिस तरह से कार्य किया है;)
alephzerz

3
PEP20 से उद्धरण: "वहाँ एक होना चाहिए और अधिमानतः यह करने के लिए केवल एक ही स्पष्ट तरीका है। हालांकि यह तरीका पहली बार में स्पष्ट नहीं हो सकता है जब तक कि आप डच न हों।"
vaxquis

5

आप केवल उस myAnswerवेरिएबल के बारे में पूछ रहे हैं जो बेमानी लगता है। अन्य उत्तर पहले से ही कुछ समझाते हैं कि यह कब और क्यों इसे छोड़ने या उपयोग करने के लिए समझ में आएगा लेकिन यहाँ एक और है: इस बारे में कैसे?

Start
  output input * 2
Stop

या यहां तक ​​कि

Start output input * 2 Stop

अधिकांश भाषाओं में यह अभी भी काम करेगा लेकिन क्या आप इसे पढ़ सकते हैं? यह मुश्किल है इसलिए हम अक्सर हेल्पर चर का उपयोग करते हैं क्योंकि कंप्यूटर केवल वही नहीं हैं जो कोड पढ़ते हैं। हमें इसे बनाए रखने और इसे कुछ महीनों में समझने की आवश्यकता है और यह कोड लिखना और भी कठिन है कि आप अभी भी बाद में समझ सकते हैं फिर एक काम कर रहे हैं ... आमतौर पर केवल कुछ दिनों के बाद आपको पता नहीं चलेगा कि आपने एक विशिष्ट तरीके से कुछ क्यों किया ।


2
... या अभी भी (*2)। हालाँकि, मुझे आपत्ति होगी, कि प्रदर्शन करने वाले इनपुट को सुरक्षित रूप से केवल एक चर को एक्सेस करने या एक अंकगणितीय ऑपरेशन करने के रूप में सुरक्षित रूप से व्यक्त नहीं किया जा सकता है: इसके अवलोकन प्रभाव हो सकते हैं।
लेफ्टरनबाउट

2

आप दोनों वेरिएंट (इस साधारण मामले में) कर सकते हैं, लेकिन पहला संस्करण अधिक जटिल मामलों के लिए अधिक पठनीय और संरचित हो जाता है। पहला संस्करण प्रत्येक चरण के लिए एक पंक्ति के साथ आईपीओ मॉडल दिखाता है (उनमें से दो पहले से ही सही नाम के साथ):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.