2013-03-04 4 views
8

तो आज कंप्यूटर विज्ञान में मैंने एक चर के रूप में एक फ़ंक्शन का उपयोग करने के बारे में पूछा। उदाहरण के लिए, मैं एक फ़ंक्शन बना सकता हूं, जैसे returnMe (i) और एक सरणी बनाएं जिसे इसे कॉल करने के लिए उपयोग किया जाएगा। एच = [मदद, वापसी] की तरह और फिर मैं एच 1 कह सकता हूं और यह वापसी करेगा ("बॉब")। क्षमा करें मैं इसके बारे में थोड़ा उत्साहित था। मेरा सवाल है h.append (def function) जैसे कॉल करने का एक तरीका है और एक फ़ंक्शन को परिभाषित करता है जो केवल सरणी में मौजूद है?पायथन कार्यों के भीतर

संपादित करें:

यहाँ कुछ कोड है कि मैं इस के साथ लिखा था है! तो मैंने अभी इस समाधान के साथ एक शानदार FizzBuzz समाप्त किया है, आपको बहुत बहुत धन्यवाद!
funct = [] रों = ""

def newFunct(str, num): 
    return (lambda x: str if(x%num==0) else "") 

funct.append(newFunct("Fizz",3)) 
funct.append(newFunct("Buzz",5)) 

for x in range(1,101): 
    for oper in funct: 
     s += oper(x) 
    s += ":"+str(x)+"\n" 

print s 

उत्तर

12

आप lambda कीवर्ड का उपयोग अनाम प्रक्रियाएं बना सकते हैं: यहाँ एक उदाहरण के रूप में है कि कोड है।

def func(x,keyword='bar'): 
    return (x,keyword) 

मोटे तौर पर के बराबर है:

func = lambda x,keyword='bar':(x,keyword) 

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

my_list = [lambda x:x**2,lambda x:x**3] 
print my_list[0](2) #4 
print my_list[1](2) #8 
+0

के बराबर है तो यह बहुत बढ़िया है! बहुत बहुत धन्यवाद! हम फिजबज़ के बारे में भी बात कर रहे थे और मैंने सोचा कि यह हल करने के लिए यह बहुत अच्छा होगा! – Hovestar

3

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

यह निश्चित रूप से अन्य भाषाओं में समर्थित है: उदाहरण के लिए, जावास्क्रिप्ट में, पर्याप्त अज्ञात कार्यों को बनाने और उन्हें पास करने के लिए एक बहुत ही मूर्खतापूर्ण चीज है।

+0

बस पूरा करना: यह पायथन और जावास्क्रिप्ट की विशिष्ट चीजों में से एक है (अन्य भाषाओं के बीच जो एक कार्यात्मक दृष्टिकोण की अनुमति देता है)। यह एक डिजाइन पसंद है - जो पठनीयता के लिए कुछ लचीलापन व्यापार करता है। – jsbueno

+1

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

+0

मैं भी @ हाइपरबोरियस से सहमत हूं, मैंने पाइथन में लैम्बडास के साथ बहुत कुछ खेला है और यहां तक ​​कि एक आनुवांशिक एल्गोरिदम भी लिखा है जो केवल दो पंक्तियां थीं, एक यादृच्छिक आयात करने के लिए और दूसरा 2000 अक्षर लंबा था ... – Hovestar

2

आप मूल दायरे में फ़ंक्शंस बना सकते हैं, उन्हें सरणी में असाइन कर सकते हैं और फिर उन्हें अपने मूल दायरे से हटा सकते हैं। इस प्रकार, आप वास्तव में उन्हें सरणी से कॉल कर सकते हैं लेकिन स्थानीय चर के रूप में नहीं। मुझे यकीन नहीं है कि यह आपकी आवश्यकताओं को पूरा करता है या नहीं।

#! /usr/bin/python3.2 

def a (x): print (x * 2) 
def b (x): print (x ** 2) 

l = [a, b] 

del a 
del b 

l [0] (3) #works 
l [1] (3) #works 
a (3) #fails epicly 
2

तुम इतनी तरह 9 0 से हर संख्या से बढ़ाने के लिए lambda कार्यों की एक सूची बना सकते हैं:

increment = [(lambda arg: (lambda x: arg + x))(i) for i in range(10)] 
increment[0](1) #returns 1 
increment[9](10) #returns 19 

साइड नोट:

मुझे लगता है कि यह भी ध्यान दें कि यह महत्वपूर्ण है (फ़ंक्शन पॉइंटर्स लैम्बडास नहीं) कुछ हद तक एक सूची के बजाय, अधिकांश वर्गों में पाइथन के तरीकों को कैसे रखा जाता है, यह फ़ंक्शंस को इंगित करने वाले फ़ंक्शन नामों वाला एक शब्दकोश है। कई में लेकिन सभी मामलों में instance.func(args)instance.__dict__['func'](args) या type(class).__dict__['func'](args)

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