2012-10-16 9 views
17

मैं ब्लॉक-कोड संदर्भ में for लूप से परिचित हूं। उदाहरण के लिए:पायथन 'सिंटैक्स' के लिए: ब्लॉक कोड बनाम सिंगल लाइन जेनरेटर एक्सप्रेशन

for c in "word": 
    print c 

मैं सिर्फ कुछ उदाहरण दिए गए for अलग ढंग से उपयोग करने के बारे में जाना। for कथन से शुरू करने के बजाय, वे इसे अभिव्यक्ति के अंत में टैग करते हैं (और इंडेंट कोड-ब्लॉक शामिल नहीं करते हैं)। उदाहरण के लिए:

sum(x*x for x in range(10)) 

किसी को भी मुझे कुछ प्रलेखन कि for के इस प्रयोग की रूपरेखा को इंगित कर सकते हैं? मैं उदाहरण ढूंढने में सक्षम हूं, लेकिन स्पष्टीकरण नहीं। सभी for प्रलेखन मैं पिछले उपयोग (ब्लॉक-कोड उदाहरण) का वर्णन करने में सक्षम हूं। मुझे यह भी यकीन नहीं है कि इस उपयोग को क्या कॉल करना है, इसलिए यदि मेरे प्रश्न का शीर्षक अस्पष्ट है तो मैं क्षमा चाहता हूं।

उत्तर

15

जो आप इंगित कर रहे हैं वह Generator पायथन में है। पर एक नज़र डालें: -

दस्तावेज़ देखें: - Generator Expression जो बिल्कुल एक ही उदाहरण आप

प्रलेखन से पोस्ट किया है शामिल हैं: -

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

जेनरेटर List Comprehension कि आप square brackets के बजाय साथ उपयोग करने के लिए इसी तरह के हैं brackets, लेकिन वे अधिक स्मृति कुशल हैं। वे एक ही समय में परिणाम के पूर्ण list वापस नहीं लौटते हैं, लेकिन वे जनरेटर ऑब्जेक्ट वापस करते हैं। जब भी आप generator ऑब्जेक्ट पर next() का आह्वान करते हैं, तो जनरेटर अगले मान को वापस करने के लिए yield का उपयोग करता है।

List Comprehension के लिए की तरह ऊपर कोड दिखेगा: -

[x * x for x in range(10)] 

तुम भी स्थितियों के लिए के अंत में परिणाम को फिल्टर करने की जोड़ सकते हैं।

[x * x for x in range(10) if x % 2 != 0] 

यह, 5 के लिए सीमा 1 में 2 से गुणा numbers की एक सूची वापस आ जाएगी अगर नंबर 2 से विभाज्य नहीं है।

yield के उपयोग का चित्रण Generators का एक उदाहरण हो सकते हैं: -

def city_generator(): 
    yield("Konstanz") 
    yield("Zurich") 
    yield("Schaffhausen") 
    yield("Stuttgart") 

>>> x = city_generator() 
>>> x.next() 
Konstanz 
>>> x.next() 
Zurich 
>>> x.next() 
Schaffhausen 
>>> x.next() 
Stuttgart 
>>> x.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

तो, आप देखते हैं कि, next() के लिए हर कॉल कार्यान्वित अगले yield()generator में। और अंत में यह StopIteration फेंकता है।

+1

जनरेटर और सूची भी समझते हैं, जो बहुत समान दिखते हैं: '[x * x x x श्रेणी में (10)] '। आप परिणामों को फ़िल्टर करने के लिए एक शर्त भी शामिल कर सकते हैं: 'x x x x x (x) x x 2 == 0 या x% 3 == 0]'। –

0

आपके विशिष्ट उदाहरण को generator expression कहा जाता है। List comprehensions, dictionary comprehensions, और set comprehensions अर्थ में समान हैं (विभिन्न परिणाम प्रकार, और जेनरेटर अभिव्यक्ति आलसी हैं) और एक ही वाक्यविन्यास, मॉड्यूलो अन्य प्रकार के ब्रैकेट के अंदर है, और एक अभिव्यक्ति के बजाय expr1: expr2 वाले एक धैर्य समझ के मामले में (आपके उदाहरण में एक्स * एक्स)।

4

उन generator expressions हैं और वे list comprehensions

सूची comprehensions सूचियों का आसान निर्माण के लिए अनुमति देने से संबंधित हैं। उदाहरण के लिए, अगर आप सही वर्गों की एक सूची बनाना चाहती है आप ऐसा कर सकता है:

>>> squares = [] 
>>> for x in range(10): 
...  squares.append(x**2) 
... 
>>> squares 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

लेकिन बजाय आप एक सूची समझ इस्तेमाल कर सकते हैं:

squares = [x**2 for x in range(10)] 

जेनरेटर भाव सूची comprehensions की तरह होते हैं, वे सिवाय एक सूची के बजाय जनरेटर ऑब्जेक्ट वापस करें। आप इस जनरेटर ऑब्जेक्ट को समझने के लिए समान तरीके से पुन: सक्रिय कर सकते हैं, लेकिन आपको सूची में पूरी सूची को एक साथ स्मृति में स्टोर करने की आवश्यकता नहीं है, जैसा कि आप सूची समझ में सूची बनाते हैं।

संबंधित मुद्दे