2016-01-31 3 views
11

में किसी फ़ंक्शन के इनपुट के रूप में सूची को कैसे पास करें I Python का उपयोग कर रहा हूं, और मेरे पास एक ऐसा फ़ंक्शन है जो तर्क के रूप में एक सूची लेता है। उदाहरण के लिए, मैं निम्न सिंटैक्स का उपयोग कर रहा,पायथन

def square(x,result= []): 
    for y in x: 
     result.append=math.pow(y,2.0) 
     return result 

print(square([1,2,3])) 

और आउटपुट [1] है केवल जहां मैं [1,4,9] प्राप्त करना चाहिए।

मैं क्या गलत कर रहा हूं?

+13

1. परिवर्तनीय डिफ़ॉल्ट तर्क न बनाएं। 2. आप केवल एक बार 'वापसी' कर सकते हैं। – jonrsharpe

+1

फिर मैं आउटपुट के रूप में एक सरणी कैसे वापस कर सकता हूं। क्या आप मुझे कोई विचार दे सकते हैं? धन्यवाद –

+3

लूप के लिए वापसी को बाहर लाएं। –

उत्तर

14

आप वर्तमान में अपने for पाश के पहले चरण में अपने कार्य से एक मूल्य के लिए लौट रहे हैं की कोशिश करो। इस वजह से, आपके for लूप का दूसरा और तीसरा पुनरावृत्ति कभी नहीं होता है। आप पाश के बाहर अपने return बयान स्थानांतरित करने के लिए इस प्रकार की जरूरत है:

import math 

def square(x): 
    result = [] 
    for y in x: 
     result.append(math.pow(y,2.0)) 
    return result 

print(square([1,2,3])) 

आउटपुट

[1.0, 4.0, 9.0] 
+0

चूंकि किसी ने इंडेंटेशन के आधार पर आधारित प्रोग्रामिंग को ब्रेस करने के लिए उपयोग किया था, मुझे यह कहना होगा कि एक टैब बदल रहा है जहां से फ़ंक्शन लौटाता है, मुझे कुछ बेहद अनजान लगता है। – Pharap

+0

लेकिन आप अभी भी अपने कोड को इंडेंट करते हैं भले ही आप ब्रेसिज़ का उपयोग करते हैं, है ना? – Matthias

18

समस्या को साइड-चरण क्यों नहीं?

def square(vals): 
    return [v*v for v in vals] 

संपादित करें: पहली समस्या, के रूप में कई लोगों ने बताया है, कि तुम शॉर्ट-सर्किट रहे हैं अपने for पाश है। लूप के बाद आना चाहिए, इसमें नहीं।

अगली समस्या list.append का उपयोग है - आपको इसे कॉल करने की आवश्यकता है, इसे निर्दिष्ट नहीं करें, यानी result.append(y*y)result.append = y*y इसके बजाय विधि को एक संख्यात्मक मान के साथ ओवरराइट करता है, संभवतः अगली बार जब आप इसे कॉल करने का प्रयास करते हैं तो एक त्रुटि फेंक देते हैं।

एक बार जब आप यह है कि ठीक है, तो आप एक और कम स्पष्ट त्रुटि मिलेगा होती है, तो आप बार-बार अपने फ़ंक्शन को कॉल करें:

print(square([1,2,3])  # => [1, 4, 9] 
print(square([1,2,3])  # => [1, 4, 9, 1, 4, 9] 

क्योंकि आप एक डिफ़ॉल्ट के रूप में एक अस्थायी मद (एक सूची), यह सब आगे उपयोग के पारित डिफ़ॉल्ट आइटम बिंदु पर एक ही मूल सूची पर वापस आती है।

इसके बजाय,

def square(vals, result=None): 
    if result is None: 
     result = [] 
    result.extend(v*v for v in vals) 
    return result 
+2

यह वास्तव में ओपी को नहीं बताता है कि वे गलत कहां जा रहे हैं और यह एक सरणी है कि कैसे एक सरणी – ShaneQful

+1

@ShaneQful को स्क्वायर करना है: कृपया एक और नज़र डालें। –

+0

क्षमाप्रार्थी, उपरोक्त मेरी प्रारंभिक टिप्पणी आपके शुरुआती संक्षिप्त उत्तर पर आधारित थी। एक वोट वोट करें :) – ShaneQful

3

आप पाश के लिए बाहर लौटना चाहिए। अन्यथा, यह पहली पुनरावृत्ति के बाद रुक जाएगा।

def square(x): 
    result=[] 
    for y in x: 
     result.append=math.pow(y,2.0) 
    return result 

print(square([1,2,3]) 
+0

परिशिष्ट एक ऐसा फ़ंक्शन है जिसे आप यहां ओवरराइट नहीं करना चाहते हैं। –

6

हम भी result का उपयोग करते हैं? आप अपना परिणाम उत्पन्न करने के लिए एक सूची समझ का उपयोग कर सकते हैं जिसे आप वापस कर सकते हैं। मुझे यकीन नहीं है कि आपने result को फ़ंक्शन में चर के रूप में क्यों पारित किया है, क्योंकि इसका उपयोग नहीं किया जाता है।

इसके अलावा, आपके लूप के अंदर return result होने का अर्थ है कि फ़ंक्शन पहले पुनरावृत्ति पर मान देता है, इसलिए यह सूची में पहले नंबर का वर्ग देता है।

import math 

def square(x): 
    return [math.pow(y, 2) for y in x] 

>>> print(square([1,2,3])) 
[1.0, 4.0, 9.0] 
+0

ठीक है, इसे प्रारंभिक मान के रूप में देखा जा सकता है, उदाहरण के लिए। शायद ओपी 'वर्ग ([1,2,3], [100,200,300])' '100,200,300,1,4,9]' वापस करने का इरादा रखता है। – muru

0

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

result.append(math.pow(y,2)) 

केवल बात यह है कि कोई मुद्दा नहीं है सूची जो आपके सवाल यह है कि के निधन है, समारोह पूरी सूची प्राप्त कर रहा है अगर आप

करना है
def f(a): 
    print a 
f([1,2,3]) 

बाहर

[1,2,3,] 
3

आप yield

का उपयोग करने में रुचि हो सकती है
def square(x): 
    for y in x: 
     yield math.pow(y, 2.0) 

कि जिस तरह से आप या तो

for sq in square(x): 
    ... 

कॉल कर सकते हैं जो एक ही बार में वर्गों की पूरी सूची उत्पन्न होगी नहीं, लेकिन यात्रा प्रति नहीं बल्कि एक तत्व, या list(square(x)) का उपयोग मांग पर पूरी सूची प्राप्त करने के लिए।

2

यह एक थोड़ा और अधिक कार्यात्मक शैली के उपयोग का दिलचस्प अवसर है:

import math 
map(lambda x:(math.pow(x,2)), [1,2,3]) 

यह map समारोह है, जो एक सूची और एक समारोह लेता है का उपयोग करता है, और एक नई सूची जहां कि समारोह को व्यक्तिगत रूप से लागू किया गया है देता है सूची के प्रत्येक सदस्य को। इस मामले में, यह सूची के प्रत्येक सदस्य को math.pow(x,2) फ़ंक्शन लागू करता है, जहां प्रत्येक संख्या x है।

ध्यान दें कि map(lambda x:(math.pow(x,2)), [1,2,3]) एक पुनरावर्तनीय लौटाता है, जो वास्तव में सुविधाजनक है, लेकिन यदि आपको सूची वापस लेने की आवश्यकता है तो बस पूरे विवरण को list() पर लपेटें।