2016-03-19 8 views
6

मैं सिर्फ अपनी समारोह में t चर के लिए for पाश का उपयोग करना चाहते:मैं फ़ंक्शन में केवल एक चर के लिए 'फॉर' लूप का उपयोग कैसे कर सकता हूं जो दो चर पर निर्भर करता है?

l = [] 

def func(s): 
    for i in range(1, 100): 
     t = i 
     p = t * 2 + s * 2 
    return p 

l.append(func(10)) 

print l 

मैं टी का मूल्य 1 से 99 करने के लिए जाने के लिए और और सभी मूल्य की एक सूची प्रिंट करना चाहते हैं, लेकिन मैं हमेशा l = [218] प्राप्त करने के अंत में।

+2

@ अल्बर्टो बोन्सेंटो: इंडेंटेशन फिक्सिंग के साथ समस्या अब स्पष्ट होनी चाहिए। क्या वह 'वापसी' वास्तव में समारोह में 'लूप' का हिस्सा था? और आपने फ़ंक्शन बॉडी को क्यों इंडेंट नहीं किया? –

+0

@MartijnPieters मुझे खेद है कि मैं सही पल में संपादन कर रहा था! मैंने तुम्हारा ओवरराइट करने का नाटक नहीं किया! –

+0

इस पर विचार करें? 'func = lambda s: [(टी * 2) + एस * 2 टी में श्रेणी के लिए (1, 100)]' – Signal

उत्तर

41

मुझे लगता है कि आपके पास NumPy स्थापित है (कम से कम आपका मूल प्रश्न यह सुझाया गया है), इसलिए मैं एक तरीका पेश करूंगा कि आप कैसे (किसी भी सूची-comprehensions और स्पष्ट पुनरावृत्तियों के बिना) एक बहुत ही कुशल तरीके से numpy-arrays का उपयोग कर अपने परिणाम प्राप्त:

> import numpy as np 
> s = 10 
> l = np.arange(1, 100) * 2 + s * 2 # Arrange produces an array. Syntax is like "range". 
> print(l) 

array([ 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 
     48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 
     74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 
     100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 
     126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
     152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 
     178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 
     204, 206, 208, 210, 212, 214, 216, 218]) 

मैं तथ्य यह है कि NumPy सरणी पर गणितीय क्रियाओं सभी तत्वों को प्रभावित करते थे। इसलिए यह इतना आसान आपरेशन लिखना है: np.arange(1, 100) * 2, क्योंकि यह 2 और numpy.arange साथ हर तत्व गुणा किया जाता है के बीच सभी नंबरों युक्त एक सरणी बनाने के लिए एक संभावना एक start और stop के साथ दिया एक वैकल्पिक step (बस python range की तरह)।

न्यूमपी के साथ यह append एकल मानों के लिए एक अच्छा विकल्प नहीं होगा (क्योंकि यह पूरी सरणी को पुन: प्रयास करता है और न केवल मूल्यों को जोड़ता है)। ज्यादातर मामलों में अंतिम आकार और आकार के साथ एक सरणी बनाना और सीधे उस पर काम करना सर्वोत्तम होता है। बेशक आप concatenate या append अलग-अलग NumPy arrays कर सकते हैं, लेकिन जैसा कि बताया गया है कि यह हमेशा एक पूरी तरह से नई सरणी बनाता है और इसलिए बहुत कुशल नहीं है (यदि नियमित रूप से उपयोग किया जाता है)।


अपने प्रारंभिक प्रयास पर तो अब कुछ टिप्पणियों और क्यों यह काम नहीं किया: अपने समारोह संख्या के बहुत बनाया है, लेकिन यह प्रत्येक पाश में उन्हें ओवरराइड करता है और केवल पिछले एक रिटर्न:

def func(s): 
    for i in range(1, 100): 
     t = i 
     p = t * 2 + s * 2 
     # Next iteration of the loop just overwrites p 
    # Returns only the last p 
    return p 

आप (return के बजाय yield के साथ) यह एक जनरेटर बना सकता है, लेकिन यह शायद overkill यहाँ है, मैं :-)

l = [] 
def func(s): 
    for i in range(1, 100): 
     p = i * 2 + s * 2 
     yield p 

l.append(list(func(10))) # Need to convert the generator to a list here. 
# In this case a simple "l = list(func(10))" would be easier if you don't need to append. 
+0

, परिणाम सूची में एक 1 तत्व के रूप में सामने आते हैं। मैं 'def funcs' को कैसे प्रिंट कर सकता हूं ताकि मैं इसे किसी अन्य सूची के विरुद्ध साजिश कर सकूं –

+0

@ p.kumar आप जेनरेटर का उपयोग कैसे करते हैं? कम से कम इस तरह से 'सूची (func (ओं)) के साथ मेरे कंप्यूटर पर ठीक काम करता है, परिणाम 99 तत्वों वाली एक सूची है। 'प्लॉटिंग' के बारे में, शायद [' matplotlib.pyplot.plot'] (http://matplotlib.org/api/pyplot_api.html) पर एक नज़र डालें। – MSeifert

4

आप एक मान को कई बार गणना कर रहे हैं (जबकि इसे किसी सूची में जोड़ने के लिए), फिर अंतिम सूची को किसी सूची में जोड़ना।

इसके बजाए, हम सूची में शामिल होना चाहते हैं जैसे हम जाते हैं।

def func(s): 
    l = [] 
    for i in range(1, 100): 
     l.append(i*2+s*2) 
    return l 

अगर आपको तकलीफ के लिए जा रहे हैं एक list comprehension का उपयोग कर एक पंक्ति में कर सकते हैं।

func = lambda s: [(t*2)+s*2 for t in range(1, 100)] 

आउटपुट:

[22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218] 

नोट अंत में 218। जैसा कि मैंने पहले कहा था, आप केवल अंतिम मूल्य लौट रहे थे, इस प्रकार, आपके प्रोग्राम ने 218 का उत्पादन किया।

+4

भले ही आप अनावश्यक एक-अस्तर पर जोर देते हैं, इसे 'def' के साथ करना सबसे अच्छा है, न कि 'lambda'; 'लैम्ब्डा' का अर्थ है कि फ़ंक्शन को अपना नाम नहीं पता है, जो कि पिकलिंग जैसी सरल सामग्री को तोड़ता है (कुछ मामलों में 'मल्टीप्रोसेसिंग' या 'समवर्ती। फ्यूचर्स' या यहां तक ​​कि 'copy.deepcopy' जैसी चीजों में शामिल)। 'def func (ओं): श्रेणी में टी के लिए वापसी [(टी * 2) + एस * 2 (1, 100)] 'एक पंक्तिबद्ध, समान संक्षेप में, और अधिक कार्यात्मक है (अंग्रेजी अर्थ में, नहीं भाषा डिजाइन भावना)। जनरेटर 'उपज' का उपयोग करते समय – ShadowRanger

0

फिर भी यह दिखाता हूँ के बाद से वहाँ की गिरफ्तारी ई समाधान के बहुत सारे। विभिन्न पुस्तकालयों या जेनरेटर के साथ। आपके कोड में केवल इंडेंटेशन समस्या थी और यह उड़ने के लिए तैयार था। यहां आपके कोड में केवल छोटा बदलाव है।

#In Python3 
def func(s): 
    for i in range(1,100): 
     p = i * 2 + s * 2 
     l.append(p) 
    return l 
l =[] 
print(func(10)) 
संबंधित मुद्दे

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