2009-07-17 4 views
18

इस भाषा का निर्माण क्या कहा जाता है?इस पायथन/रूबी भाषा का निर्माण करें (फ़ंक्शन पैरामीटर को संतुष्ट करने के लिए सरणी मानों का उपयोग करके)

पायथन में मैं कह सकता हूँ:

def a(b,c): return b+c 
a(*[4,5]) 

और रूबी में इसी तरह 9. मिलती है:

def a(b,c) b+c end 
a(*[4,5]) 

क्या यह कहा जाता है, जब एक एक समारोह जो अन्यथा कई की आवश्यकता के लिए एक एकल सरणी गुजरता तर्क?

* ऑपरेटर का नाम क्या है?

अन्य भाषाएं इस शांत सुविधा का समर्थन करती हैं?

+0

डुप्लिकेट http://stackoverflow.com/questions/918449/what-is-the-operator-doing-to-this-string-in-ruby/918475 – seth

+2

@ सेठ: नहीं, डुप्लिकेट नहीं। आपके द्वारा लिंक किया गया प्रश्न इस ऑपरेटर के * अर्थशास्त्र * (रूबी में) के बारे में है; यह प्रश्न * शब्दावली * के बारे में है। – ThomasH

उत्तर

26

पायथन डॉक्स इस Unpacking Argument Lists पर कॉल करें। यह एक बहुत ही आसान सुविधा है। पायथन में, आप कीवर्ड तर्कों में एक शब्दकोश (हैश) को अनपैक करने के लिए डबल तारांकन (**) का भी उपयोग कर सकते हैं। वे विपरीत में भी काम करते हैं। मैं इस तरह के एक समारोह को परिभाषित कर सकता हूं:

def sum(*args): 
    result = 0 
    for a in args: 
     result += a 
    return result 

sum(1,2) 
sum(9,5,7,8) 
sum(1.7,2.3,8.9,3.4) 

सभी तर्कों को मनमाने ढंग से आकार की सूची में पैक करने के लिए।

+2

मुझे थोड़ी देर के लिए इस बारे में पता चला है, और अंधेरे से इसे एक बार और थोड़ी देर के लिए इस्तेमाल किया लेकिन वास्तव में इसे कभी समझ में नहीं आया। अच्छा स्पष्ट और सरल स्पष्टीकरण। – monkut

+0

+1 "तर्क अनपॅकिंग" सामान्य शब्द है जिसे मैंने हमेशा इसके लिए सुना है। – Chuck

+0

रिपैकिंग चाल रूबी – rampion

2

मैं इसे "सूची विस्तार" कह रहा हूं, लेकिन मुझे नहीं लगता कि यह मानक शब्दावली है (मुझे नहीं लगता कि कोई है ...)। सभी संस्करणों में लिस्प (योजना शामिल), और हास्केल और अन्य कार्यात्मक भाषाएं, इसे आसानी से पर्याप्त कर सकती हैं, लेकिन मुझे नहीं लगता कि "मुख्यधारा" भाषाओं में करना आसान है (शायद आप इसे "प्रतिबिंब" स्टंट के रूप में खींच सकते हैं कुछ में!-)।

+0

मुझे किसी भी मानक शब्दावली के बारे में पता नहीं है, लेकिन मैंने हमेशा 'स्टार तर्क' और '** kwargs' 'kay शब्द args' के रूप में '* args' को उच्चारण किया है। मुझे यकीन है कि दूसरों की अपनी शब्दावली है, और मैं इसे सुनकर उत्सुक हूं। –

10

रूबी में, इसे अक्सर "स्प्लट" कहा जाता है।

रूबी में भी, आप इसका उपयोग 'सूची में मौजूद सभी अन्य तत्वों' के लिए कर सकते हैं।

a, *rest = [1,2,3,4,5,6] 
a  # => 1 
rest # => [2, 3, 4, 5, 6] 

यह भी असाइनमेंट ऑपरेटर के दोनों तरफ दिखाई दे सकता है:

a = d, *e 

इस उपयोग में, यह है योजना का सीडीआर की तरह एक सा है, हालांकि यह सब लेकिन के सिर होने की जरूरत नहीं सूची।

+1

स्प्लट ऑपरेटर शब्द रूबी प्रोग्रामिंग भाषा में उपयोग किया जाता है, जिसे माना जाता है कि मैटज़ (रूबी का निर्माण) – Svend

+4

"सूची में मौजूद सभी अन्य तत्वों" वाक्यविन्यास (बाईं ओर एक तारांकित नाम है) असाइनमेंट) पायथन 3 में जोड़ा गया था - आपका उदाहरण असम्बद्ध काम करेगा। इसके अलावा (पायथन 3 में), तारांकित चर को अंतिम नहीं होना चाहिए: 'ए, बी, * मध्य, वाई, जेड = रेंज (10)' काम करता है। यह असाइनमेंट के दाईं ओर दिखाई नहीं दे सकता है, लेकिन इसकी वास्तव में आवश्यकता नहीं है, क्योंकि आप 'l = list (a, * b)' कर सकते हैं। – Miles

+0

हाँ, मुझे लगता है कि मुझे यह पढ़ना याद है। मैं अभी भी काम पर पायथन 2.4-2.6 का उपयोग करता हूं (और ऐसा करना जारी रखेगा, मुझे संदेह है)। मैंने बस रूबी 1.8 के साथ एक परीक्षण किया, और * var सूची में अंतिम होना चाहिए। –

5

इसके लिए सामान्य शब्दावली को "सूची में एक फ़ंक्शन लागू करना" कहा जाता है, या संक्षिप्त के लिए "लागू करें"।

http://en.wikipedia.org/wiki/Apply

यह लिस्प में काफी 1960 अजीब में अपनी स्थापना के बाद से किया गया वापस देखें। खुशी है कि अजगर यह फिर से खोज की: -}

लागू करें एक सूची या इस तरह के एक सरणी के रूप में एक सूची का प्रतिनिधित्व पर आम तौर पर है। हालांकि, कोई तर्क के लिए फ़ंक्शंस लागू कर सकता है कि अन्य palces जैसे structs से आते हैं। हमारी PARLANSE भाषा में निश्चित प्रकार (int, float, string, ...) और संरचनाएं हैं। विचित्र रूप से पर्याप्त, फ़ंक्शन तर्क सूची संरचना परिभाषा की तरह दिखती है, और PARLANSE में, यह एक संरचना परिभाषा है, और आप एक संगत संरचना में एक PARLANSE फ़ंक्शन "लागू" कर सकते हैं। आप "बनाने" कर सकते हैं संरचना उदाहरणों, भी, इस प्रकार:

 

(define S 
    (structure [t integer] 
       [f float] 
       [b (array boolean 1 3)] 
    )structure 
)define s 

    (= A (array boolean 1 3 ~f ~F ~f)) 

    (= s (make S -3 19.2 (make (array boolean 1 3) ~f ~t ~f)) 


    (define foo (function string S) ...) 

    (foo +17 3e-2 A) ; standard function call 

    (foo s) ; here's the "apply" 

PARLANSE तुतलाना की तरह दिखता है, लेकिन नहीं है।

+1

एक varargs वाक्यविन्यास को कॉल करना "किसी सूची में फ़ंक्शन को लागू करना" केवल सादा गलत है, आईएमओ। PARLANSE का संदर्भ या तो योगदान नहीं देता है। – ThomasH

+1

@ थॉमस: ओपी ने स्पष्ट रूप से कहा, "एकाधिक तर्कों के लिए एक फ़ंक्शन में एक सरणी पास करता है"। इसे पसंद करें या नहीं, यह एक सूची के प्रतिनिधित्व के लिए एक समारोह लागू कर रहा है। ओपी ने "इस शानदार सुविधा के साथ" अन्य भाषाओं के लिए भी पूछा; PARLANSE उदाहरण समान लेकिन अलग है और इसके विपरीत के रूप में प्रदान किया जाता है। –

+0

मैं तर्क दूंगा (थॉमसएच की तरह) कि आवेदन के बीच एक महत्वपूर्ण अंतर है, जो एक सूची के आइटम पर एक ही कार्य एन बार निष्पादित करता है, और स्प्लट/var-args जो सूची के तत्वों के साथ एक बार फ़ंक्शन को कॉल करता है मापदंडों। –

3

रूबी यह कहता है सूचक, हालांकि डेविड ब्लैक भी साफ unar साथ आ गया है {, रा} y ऑपरेटर (यानी एकल unarray ऑपरेटर)

1

बहुसंख्यक प्रश्न पहले से ही किया गया है उत्तर दिया, लेकिन सवाल के रूप में "ऑपरेटर का नाम क्या है?": तकनीकी शब्द "तारांकन" है (लैटिन शब्द क्षैतिज से आता है, जिसका अर्थ है "छोटा सितारा", जो बदले में, से आता है यूनानी ἀστερίσκος)। अक्सर, हालांकि, इसे "स्टार" के रूप में जाना जाएगा, जैसा ऊपर बताया गया है, "splat"।

+1

+1, भले ही इसका इरादा नहीं था। – nilamo

2

हास्केल भी (जोड़े के लिए) यह है uncurry समारोह के साथ:

ghci> let f x y = 2*x + y 
f :: (Num a) => a -> a -> a 
ghci> f 1 2 
4 
ghci> f 10 3 
23 
ghci> uncurry f (1,2) 
4 
ghci> uncurry f (10,3) 
23 

आप भी इसे एक ऑपरेटर में कर सकते हैं, तो यह अधिक सूचक की तरह है:

ghci> f `uncurry` (1,2) 
4 
ghci> let (***) = uncurry 
(***) :: (a -> b -> c) -> (a, b) -> c 
ghci> f *** (10,3) 
23 

और यद्यपि 3-ट्यूपल, 4-टुपल इत्यादि के मामलों के लिए समान कार्यों को परिभाषित करना आसान होगा, हास्केल के सख्त टाइपिंग के कारण n -टुपल्स (जैसे अन्य भाषाओं में स्प्लट काम करता है) के लिए कोई सामान्य कार्य नहीं है।

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