दिलचस्प और अजगर की उपयोगिता। भाग २

पिछले लेख में, हमने अजगर भाषा के कई दिलचस्प बिंदुओं की जांच की, निश्चित रूप से, वे एक लेख तक सीमित नहीं हैं, इसलिए हम जारी रखेंगे।

एक टिप्पणी ने निम्नलिखित कोड की जांच की:

SEX = 'Female', 'Male' sex = SEX[True] # -> Male sex = SEX[False] # -> Female 

यह काम करता है क्योंकि तार्किक डेटा प्रकार 0 और 1 के बराबर है, इसके अलावा, शुरुआत में कोई विशेष प्रकार नहीं था और मान 0 और 1 का उपयोग किया गया था। और जब इसे दर्ज किया गया था, तो हमने पूरे से वारिस करने का फैसला किया।

 print(int.__subclasses__()) # -> [<class 'bool'>] 

लेकिन सूची मान प्राप्त करने के बाद, मान लें कि हमारे पास निम्नलिखित डेटा हैं:

 books = [["Sherlock Holmes", "Arthur Conan Doyle", 1986, True, 12.51], ["The Lost World", "Arthur Conan Doyle", 2015, False, 5.95], ["The Art of Computer Programming", "Donald E. Knuth ", 2017, True, 190.54] ] 

बेशक, हार्डककोड सूचकांकों द्वारा मूल्यों का जिक्र करना हमारा तरीका नहीं है। आप एक निरंतरता बना सकते हैं, उदाहरण के लिए AUTHOR और इसे निर्दिष्ट करें, लेकिन आप आगे जा सकते हैं:

 TITLE_AUTHOR = slice(0, 2) PRICE_IN_STOCK = slice(3, 5) print(books[0][TITLE_AUTHOR]) print([book for book in books if book[PRICE_IN_STOCK] > [True, 10.0]]) 

हम एक स्लाइस ऑब्जेक्ट बना सकते हैं और यह इंगित कर सकते हैं कि ब्याज के क्षेत्र किस सूचकांक में स्थित हैं। हम इस ब्लॉक में अंतिम पंक्ति के समान कुछ लिखने के लिए पर्याप्त बहादुर हो सकते हैं, जो कि गोदाम में उपलब्ध पुस्तकों को प्रदर्शित करता है और 10 से अधिक महंगी है। यह कोड काम करेगा, क्योंकि सूचियों और टुपल्स की तुलना शाब्दिक रूप से होती है: पहले तत्वों की तुलना की जाती है, फिर दूसरी और इसी तरह, अर्थात्, कोई भी वस्तु जिसका in_stock "फ़ील्ड" झूठी है, सूची की तुलना में छोटा होगा [True, 10.0], क्योंकि सच> गलत।

नोट: बेशक, इस कोड का उपयोग परियोजनाओं में नहीं किया जाना चाहिए, लेकिन स्लाइस के लिए कुछ मूल्यों को प्राप्त करने के लिए खुद को सीमित करना बेहतर है, डेटाबेस में चयन करना बेहतर है, या तो पंडों में या पुस्तक वर्ग की विधि के रूप में। आप नेमटुपल का उपयोग कर सकते हैं और एक छोटा मॉड्यूल लिख सकते हैं जहां समान चयन के साथ तरीके डाल सकते हैं।

हमने पहले ही उन तर्कों पर विचार किया है जिन्हें केवल कुंजी द्वारा फ़ंक्शन में पास किया जा सकता है। हाल ही में, बूल फ़ंक्शन के लिए प्रलेखन का अध्ययन करते समय, मुझे एक सबस्क्रिप्ट मिला:
संस्करण 3.7 में परिवर्तित: x अब एक केवल स्थितीय पैरामीटर है।
अब PEP 570 विकास के अधीन है, जो इस तरह के मापदंडों को स्थापित करने की संभावना को खोलेगा, यह तब उपयोगी हो सकता है जब पैरामीटर नाम मायने नहीं रखता, जैसे, बूल (), पॉव (), आदि।

मसौदा सिंटैक्स इस तरह दिखता है:

 def name(positional_only_parameters, /, positional_or_keyword_parameters, *, keyword_only_parameters): 

बूल फ़ंक्शन पर वापस लौटना, जो परिस्थितियों में जाँच की तरह काम करता है और जब आप कोड निष्पादित करते हैं तो लूप्स

 if obj: #  while obj: 

अजगर एक बूलियन मूल्य के उत्पादन के लिए एक बल्कि दिलचस्प प्रक्रिया करता है:

  1. यदि ऑब्जेक्ट __bool __ () विधि को लागू करता है, तो इस पद्धति को कॉल करने का परिणाम वापस आ जाता है
  2. अन्यथा, यह जाँच की जाती है कि क्या __len __ () विधि लागू की गई है, यदि ऐसा है, तो यह जाँच की जाती है कि यह वापस आती है, यदि 0, तो परिणाम गलत होगा।
  3. यदि न तो विधि लागू की जाती है, तो True वापस आ जाता है

 class A: pass a = A() print(bool(a)) # -> True 

इंजीर्स __bool__ विधि को लागू करते हैं, मानक संग्रह इसे लागू नहीं करते हैं, लेकिन __len__ विधि को लागू करते हैं:

 print(dir(int)) # -> ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', ... print(dir(list)) # -> ['__add__', '__class__', '__contains__', ... 

एक अन्य टिप्पणी में , वर्ग विशेषताओं का "गैर-मानक" व्यवहार दिया गया था:

 class Example: arr=[] def __init__(self): pass a = Example() b = Example() a.arr.append(1) print(a.arr) # -> [1] print(b.arr) # -> [1] print(Example.arr) # -> [1] 

एक वर्ग और एक वस्तु की विशेषताओं के बीच अंतर करना बहुत महत्वपूर्ण है, एक वस्तु की विशेषताएं, वस्तु से, SUDDENLY बनाई जाती हैं।
यह समझना महत्वपूर्ण है कि वर्ग निकाय में घोषित कोई भी क्षेत्र और विधियां कक्षा से संबंधित हैं। किसी ऑब्जेक्ट के लिए एक विशेषता बनाने के लिए, आपको ऑब्जेक्ट को स्वयं के माध्यम से या प्रोग्राम टेक्स्ट में ऑब्जेक्ट चर के माध्यम से ऑब्जेक्ट को असाइन करने की आवश्यकता है।

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

एक नई भाषा सीखते समय, यह समझना महत्वपूर्ण है कि प्रत्येक भाषा का अपना दर्शन होता है, और सभी भाषाओं में स्थिर कीवर्ड नहीं होना चाहिए। कभी-कभी एक समान तंत्र अन्य तंत्रों द्वारा प्रदान किया जाता है।

सबसे स्पष्ट रूप से, यह विचार है कि अजगर जावा नहीं है, यह दर्शाता है कि वस्तुओं और वर्गों में क्षेत्रों का जोड़ सामान्य कार्य के माध्यम से किया जाता है:

 def make_title(self): if self.title == 'Mister': return 'Mr. ' + self.surname class Person: pass john = Person() john.title = 'Mister' john.name = 'John' john.surname = 'Peterson' john.age = 33 Person.make_title = make_title print(john.make_title()) 

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

उदाहरण के लिए, एक वर्ग बनाना बहुत सरल है जो अपने सभी उदाहरणों के लिए लिंक संग्रहीत करता है:

 class RememberAll(): instances = [] def __init__(self): self.instances.append(self) a = RememberAll() b = RememberAll() print(RememberAll.instances) #-> [<__main__.RememberAll object at 0x7faa4a5ab7b8>, <__main__.RememberAll object at 0x7faa4a523c88>] 

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

खैर, जब से हमने भौतिकी को छुआ है, मैं @ ऑपरेटर का उल्लेख करना चाहता हूं। हां, एक है । यह मैट्रिक्स गुणा के लिए पेश किया गया था, जो सबसे मजेदार है, लेकिन ऐसा लगता है कि इसे किसी भी मानक डेटा प्रकार के लिए लागू नहीं किया गया है, अर्थात, यह मूल रूप से केवल तृतीय-पक्ष पुस्तकालयों के लिए पेश किया गया था। लेकिन __matmul__, __rmatmul__, __imatmul__ के तरीकों को लागू करके अपने डेटा प्रकारों के लिए अपना समर्थन जोड़ने से कुछ भी नहीं रोकता है

 class Person: def __init__(self, name): self.name = name def __matmul__(self, msg): return "@" + self.name + " " + msg john = Person("John") print(john @ "hello") # -> @John hello 

Source: https://habr.com/ru/post/hi422311/


All Articles