अजगर: ऐसी चीजें जो आप नहीं जानते होंगे

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

1. एक असीम रूप से नेस्टेड सूची

>>> a = [1, 2, 3, 4] >>> a.append(a) >>> a [1, 2, 3, 4, [...]] >>> a[4] [1, 2, 3, 4, [...]] >>> a[4][4][4][4][4][4][4][4][4][4] == a True 

शब्दकोशों के साथ भी यही:
 >>> a = {} >>> b = {} >>> a['b'] = b >>> b['a'] = a >>> print a {'b': {'a': {...}}} 


2. सूची प्रारूपण

 >>> l = [[1, 2, 3], [4, 5], [6], [7, 8, 9]] >>> sum(l, []) [1, 2, 3, 4, 5, 6, 7, 8, 9] 

सूची जनरेटर ( धन्यवाद मैजिक 4x ):
 [y for x in data for y in x] 

वैकल्पिक लेकिन लंबे विकल्प ( धन्यवाद मोनोलिथेड ):
 import itertools data = [[1, 2, 3], [4, 5, 6]] list(itertools.chain.from_iterable(data)) 

 from functools import reduce from operator import add data = [[1, 2, 3], [4, 5, 6]] reduce(add, data) 


3. शब्दकोश जनरेटर

कई लोग सूची जनरेटर के बारे में जानते हैं, लेकिन शब्दकोश जनरेटर के बारे में क्या?
 >>> {a:a**2 for a in range(1, 10)} {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} 


4. वन-टाइम क्लास फंक्शन

मामले में आपको एक फ़ंक्शन की आवश्यकता होती है जिसे केवल एक बार उपयोग किया जाएगा, जिसके बाद एक और फ़ंक्शन का उपयोग किया जाएगा:
 class foo: def normal_call(self): print("normal_call") def call(self): print("first_call") self.call = self.normal_call 

 >>> y = foo() >>> y.call() first_call >>> y.call() normal_call >>> y.call() normal_call 


5. वर्ग गुण प्राप्त करना

 class GetAttr(object): def __getattribute__(self, name): f = lambda: "Hello {}".format(name) return f 

 >>> g = GetAttr() >>> g.Mark() 'Hello Mark' 


6. सेट पर संचालन

सेट - एक सेट जिसमें कोई दोहराए जाने वाले तत्व नहीं हैं:
 >>> a = set([1,2,3,4]) >>> b = set([3,4,5,6]) >>> a | b #  {1, 2, 3, 4, 5, 6} >>> a & b #  {3, 4} >>> a < b #  False >>> a - b #  {1, 2} >>> a ^ b #   {1, 2, 5, 6} 

निर्धारित सेट के बिना, ये ऑपरेशन काम नहीं करेंगे। जब तक यह एक सेट जनरेटर नहीं है ( ZyXI के लिए धन्यवाद ):
 { x for x in range(10)} #   set([1, 2, 3]) == {1, 2, 3} set((i*2 for i in range(10))) == {i*2 for i in range(10)} 


7. तुलनात्मक संचालक

 >>> x = 5 >>> 1 < x < 10 True >>> 10 < x < 20 False >>> x < 10 < x*10 < 100 True >>> 10 > x <= 9 True >>> 5 == x > 4 True 


8. गतिशील रूप से नई कक्षाएं बनाना

 >>> NewType = type("NewType", (object,), {"x": "hello"}) >>> n = NewType() >>> nx 'hello' 

हमेशा की तरह एक ही विकल्प:
 >>> class NewType(object): >>> x = "hello" >>> n = NewType() >>> nx "hello" 


9. शब्दकोशों में KeyError अपवाद को दबाना

शब्दकोशों में एक .get () विधि है। सामान्य स्थिति में, यदि आप गैर-मौजूद कुंजी name_dict ['key'] कहते हैं , तो आपको KeyError अपवाद मिलेगा। हालाँकि, यदि आप d.get ('कुंजी') विधि के माध्यम से कुंजी कहते हैं, तो कोई अपवाद नहीं होगा, और यदि कोई कुंजी नहीं है, तो शब्दकोश कोई नहीं लौटाएगा। यदि आप लापता कुंजी के बजाय एक चर असाइन करना चाहते हैं, तो आप एक दूसरा पैरामीटर असाइन कर सकते हैं: d.get ('कुंजी', 0)

संख्यात्मक कुंजियों की गणना करते समय इसका सबसे अच्छा उपयोग किया जाता है:
 sum[value] = sum.get(value, 0) + 1 


10. डिक्शनरी में सूची में जोड़ना

यदि आपको कई प्रमुख मूल्यों को संग्रहीत करने की आवश्यकता है, तो आप उन्हें एक सूची में संग्रहीत कर सकते हैं:

 >>> d = {} >>> a, b = 4, 5 >>> d[a] = list() >>> d {4: []} >>> d[a].append(b) >>> d {4: [5]} 


11. हालत से चर का असाइनमेंट

 x = 1 if (y == 10) else 2 # X  1,  ,  Y  10.     - X  2 x = 3 if (y == 1) else 2 if (y == -1) else 1 #   .    elif 


12. चर में मानों को खोलना

यदि मान निर्दिष्ट करते समय अधिक चर हैं, तो चर नाम की शुरुआत में तारांकन चिह्न जोड़ें और शेष चर इसे (केवल पायथन 3.x) को सौंपा जाएगा:
 >>> first,second,*rest = (1,2,3,4,5,6,7,8) >>> first #   1 >>> second #   2 >>> rest #    [3, 4, 5, 6, 7, 8] 

 >>> first,*rest,last = (1,2,3,4,5,6,7,8) >>> first 1 >>> rest [2, 3, 4, 5, 6, 7] >>> last 8 


13. सूची मदों की संख्या

 >>> l = ["spam", "ham", "eggs"] >>> list(enumerate(l)) >>> [(0, "spam"), (1, "ham"), (2, "eggs")] >>> list(enumerate(l, 1)) #        >>> [(1, "spam"), (2, "ham"), (3, "eggs")] 


14. अपवादों में अन्य का उपयोग करना

AnimeshneG को ठीक करने के लिए धन्यवाद
 try: function() except Error: #    try    Error else: #   try    except finally: #     


15. सूची की एक प्रति बनाना

सामान्य विधि का उपयोग करते हुए प्रतिलिपि बनाते समय, निम्नलिखित होगा:
 >>> x = [1, 2, 3] >>> y = x >>> y[2] = 5 >>> y [1, 2, 5] >>> x [1, 2, 5] 

सही विकल्प:
 >>> x = [1,2,3] >>> y = x[:] >>> y.pop() 3 >>> y [1, 2] >>> x [1, 2, 3] 

नेस्टेड सूचियों \ शब्दकोशों की प्रतिलिपि करें ( धन्यवाद डेनिस्बल्यको )
 import copy my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]} my_copy_dict = copy.deepcopy(my_dict) 


16. नंबर के लिए

एक लूप के माध्यम से आउटपुट करते समय तत्वों की गणना करने के लिए, एन्यूमरेट विधि का उपयोग करें
 >>> l = ['a', 'b', 'c', 'd', 'e'] >>> for i, value_list in enumerate(l, 1): #  1 -   >>> print(i, value_list) ... 1 a 2 b 3 c 4 d 5 e 


17. कार्य दोष

डिफ़ॉल्ट रूप से गलत तर्कों के लिए कार्यों को असाइन करने के परिणामस्वरूप कुछ इस तरह हो सकता है:
 >>> def foo(x=[]): ... x.append(1) ... print x ... >>> foo() [1] >>> foo() [1, 1] #    [1] >>> foo() [1, 1, 1] 


इसके बजाय, डिफ़ॉल्ट रूप से कोई भी तर्क सेट करें:
 >>> def foo(x=None): ... if x is None: ... x = [] ... x.append(1) ... print x >>> foo() [1] >>> foo() [1] 


18. शब्दकोशों के लिए __missing__ विधि

__Missing__ मेथड एक त्रुटि के बजाय अनुरोधित कुंजी का नाम लौटाकर KeyError को समाप्त करता है।
 class MyDict(dict): #    def __missing__(self, key): return key ... >>> m = MyDict(a=1, b=2, c=3) #     >>> m {'a': 1, 'c': 3, 'b': 2} >>> m['a'] #     1 1 >>> m['z'] #         'z' 


19. सज्जाकार

सज्जाकार आपको एक फ़ंक्शन को दूसरे के साथ लपेटने की अनुमति देते हैं, इसमें कार्यक्षमता जोड़ते हैं। डेकोरेटर को फ़ंक्शन के ऊपर एक लाइन चिह्नित करने के लिए, आप "@" चिह्न और फ़ंक्शन का नाम लिखते हैं। उदाहरण:
 >>> def print_args(function): >>> def wrapper(*args, **kwargs): >>> print ' : ', args, kwargs >>> return function(*args, **kwargs) >>> return wrapper >>> @print_args >>> def write(text): >>> print text >>> write('foo') Arguments: ('foo',) {} foo 

केवल प्रलेखन आसान समझा सकता है:
 @f1(arg) @f2 def func(): pass 

कोड के बराबर
 def func(): pass func = f1(arg)(f2(func)) 


20. चर के बीच मूल्यों का आदान-प्रदान

 >>> a = 10 >>> b = 5 >>> a, b (10, 5) >>> a, b = b, a >>> a, b (5, 10) 


21. प्रथम श्रेणी के कार्य

 >>> def jim(phrase): ... return 'Jim says, "%s".' % phrase >>> def say_something(person, phrase): ... print person(phrase) >>> say_something(jim, 'hey guys') #     'Jim says, "hey guys".' 


उच्च-क्रम के कार्य ( एंड्री_सोलोमैटिन के लिए धन्यवाद ):
 #      g(),       . #       "100" (  (7+3)×(7+3)). def f(x): return x + 3 def g(function, x): return function(x) * function(x) print g(f, 7) 


22. नकारात्मक दौर

 >>> round(1234.5678, -2) 1200.0 >>> round(1234.5678, 2) 1234.57 


23. ज़ेन पायथन

 import this 


24. स्टाइल सी यानी का उपयोग करना {} इंडेंटेशन के बजाय

यह बुराई हो सकती है, लेकिन यदि आप क्षेत्रों को इंगित करने के लिए इंडेंटेशन के बजाय कोष्ठक {} का उपयोग करना चाहते हैं:
 from __future__ import braces 


25. सूची स्लाइस में कदम

 a = [1,2,3,4,5] >>> a[::2] #   [1,3,5] 

-1 का मान रिवर्स मेथड के बराबर है - सूची को सम्मिलित करता है:
 >>> a[::-1] #   [5,4,3,2,1] 


26. एक ब्राउज़र में एक टैब खोलना

डिफ़ॉल्ट ब्राउज़र में निर्दिष्ट पते के साथ एक टैब खोलता है।
 import webbrowser webbrowser.open_new_tab('http://habrahabr.ru/') #  True    


27. ज़िप विलय सूची

 a = [(1,2), (3,4), (5,6)] zip(*a) # [(1, 3, 5), (2, 4, 6)] 

एक शब्दकोश में दो सूचियों को मिलाएं:
 >>> t1 = (1, 2, 3) >>> t2 = (4, 5, 6) >>> dict (zip(t1,t2)) {1: 4, 2: 5, 3: 6} 


28. सूचियों में स्लाइस और उनके साथ काम करना

 >>> a = range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[:5] = [42] #    5   "42" >>> a [42, 5, 6, 7, 8, 9] >>> a[:1] = range(5) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del a[::2] #     >>> a [1, 3, 5, 7, 9] >>> a[::2] = a[::-2] #  reserved >>> a [9, 3, 5, 7, 1] 


29. एक शब्दकोश कुंजी में कई तत्वों का भंडारण

यदि आपको कुंजी में एक से अधिक तत्व असाइन करने की आवश्यकता है, तो उन्हें सूची में संग्रहीत करना बेहतर है:
 >>> m = {} >>> m.setdefault('foo', []).append(1) >>> m {'foo': [1]} >>> m.setdefault('foo', []).append(2) >>> m {'foo': [1, 2]} 


30. अंतिम और सबसे महत्वपूर्ण
सब कुछ अज्ञात के लिए, दस्तावेज़ पढ़ें! एक और बाइक इकट्ठा न करें - आपका कोड अभी भी किसी के द्वारा पढ़ा जा सकता है। कोई भी पुस्तक प्रलेखन की पूर्णता को प्रतिबिंबित नहीं कर सकती है, और अजगर का प्रलेखन उत्कृष्ट है।


युपीडी:
31. @ एलेक्स 222 | टिप्पणी
 import antigravity 


32. टैनेन | टिप्पणी
एक और लूप में उपयोग करना:
 >>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, 'equals', x, '*', n/x ... break ... else: ... # loop fell through without finding a factor ... print n, 'is a prime number' 


33. अखंड | टिप्पणी
हम पहला कार्यक्रम लिखते हैं - "हैलो वर्ल्ड!"
 import __hello__ 


34. एंडरसनडुनाई | टिप्पणी
आदेश दिया या छँटाई शब्दकोशों:
 >>> #    >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} >>> #     >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) >>> #    >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) >>> #      >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)]) 


35. एंडरसनडुनाई | टिप्पणी
स्व .__ वर्ग__ ( अधिक ) के माध्यम से कक्षा के भीतर से मक्खी पर किसी वस्तु के वर्ग को बदलना
बिंदु में मामला ( धन्यवाद dmitriko ):
 class Worm: def creep(self): print("i am creeping") class Butterfly: def fly(self): print("i am flying") creature = Worm() creature.creep() creature.__class__ = Butterfly creature.fly() 


36. skovorodkin | टिप्पणी
तत्वों की संख्या की गिनती (उदाहरण में, एक शब्द में अक्षरों की संख्या):
 from collections import Counter Counter('habrahabr') # Counter({'a': 3, 'h': 2, 'r': 2, 'b': 2}) 


37. जोर लगाना
मुखर एक विशेष निर्माण है जो आपको कार्यक्रम के किसी भी स्थान पर मनमाने डेटा के मूल्यों के बारे में मान्यताओं की जांच करने की अनुमति देता है। यह डिज़ाइन परीक्षण / डिबगिंग कोड के लिए उपयोग किया जाता है, उदाहरण के लिए, आप निम्नलिखित निर्देश लिख सकते हैं:
 assert x>y 

और यदि यह निर्देश गलत है, तो मान लिया जाए कि मान लिया जाए। वास्तव में, यह निर्देश
 assert <test>, <data> 

यह इस के बराबर है:
  if __debug__: if not <test>: raise AssertationError, <data> 



पीडीएफ में टिप्पणी पृष्ठ सहेजें
यदि आपके पास Google Chrome है - तो बस प्रिंट करें -> "पीडीएफ में सहेजें" प्रिंटर पर क्लिक करें। अन्य ब्राउज़रों में इसी तरह की सुविधा के लिए, मुझे नहीं पता।

अगर आपके पास क्रोम नहीं है
doPDF हाइब्रिड मेनू को छोटा करता है, और टिप्पणियाँ छोड़ता है। हाबरा पेज को मेनू के बिना प्रिंट करने के लिए भेजा गया है, इसलिए कोई भी वर्चुअल प्रिंटर उपयुक्त है। नतीजतन, हमारे पास एक पठनीय पीडीएफ फाइल है। बहुत सहज है। डाउनलोड करें, प्रिंटर के बजाय इंस्टॉल करें और प्रिंट करने के लिए भेजें। (तब और धन्यवाद कहें)।

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


All Articles