2015-08-27 5 views
7

स्कैला में apply() फ़ंक्शन है।पायथन और कार्यात्मक प्रोग्रामिंग: क्या कोई लागू() फ़ंक्शन है?

मैं अजगर करने के लिए नया हूँ और मैं सोच रहा हूँ कि कैसे मैं के बाद एक-लाइनर लिखना चाहिए:

(part_a, part_b) = input_string.apply(lambda x: re.search(r"(\w+)_(\d+)", x).groups()) 

मैं एक से गलत हूँ:

(part_a, part_b) = (lambda x: re.search(r"(\w+)_(\d+)", x).groups())(input_string) 

मैं की तरह कुछ के साथ बेहतर महसूस होगा एफएफ दृष्टिकोण? क्या पाइथन में ऐसा निर्माण है?

संपादित करें: मुझे खराब चुने हुए स्निपेट के बारे में पता है।

+0

नहीं, isn 'टी, लेकिन यह आपके लिए लिखना इतना आसान होगा कि' part_a, part_b = लागू करें (lambda ...: ..., input_string) 'काम किया। – jonrsharpe

+1

जिसके लिए सभी ऑब्जेक्ट्स को एक लागू विधि की आवश्यकता होगी, जो वे नहीं करते हैं। तो मुझे डर है कि आपको इसके साथ रहना होगा। ध्यान दें कि आप जो भी बेहतर महसूस करेंगे, वही चीज़ लिखने का एक लंबा तरीका है। – skyking

+3

पायथन के शुरुआत से ही 'लागू' फ़ंक्शन था, लेकिन 'लागू होने के बाद (एफएन, तर्क, kwargs) == एफएन (* args, ** kwargs)' इसके लिए अब थोड़ा उपयोग नहीं है .. – thebjorn

उत्तर

11

हास्केल लिखते समय हास्केल लिखें। जब अजगर लेखन सिर्फ अजगर लिखें:

part_a, part_b = re.search(r"(\w+)_(\d+)", input_string).groups() 
+0

बहुत ऋषि सलाह। –

1

पायथन के पास ऐसा कोई निर्माण नहीं है; क्या उल्लेख होगा? lambda x: ... एक फ़ंक्शन है, और इसलिए इसे आपके पहले स्निपेट में (lambda x: ...)(input_string) के रूप में सामान्य फ़ंक्शन की तरह उपयोग किया जाना चाहिए।

हालांकि, आपके मामले में, मुझे कोई कारण नहीं दिखता कि आपको लैम्ब्डा से परेशान क्यों होना चाहिए; बस करें:

(part_a, part_b) = re.search(r"(\w+)_(\d+)", input_string).groups() 
1

आप फिर से उपयोग के बारे में चिंतित हैं, तो आप रेगुलर एक्सप्रेशन से संकलन सकता है:

rx = re.compile(r"(\w+)_(\d+)") 
a, b = rx.search(input_string).groups() 
+0

शायद आवश्यक नहीं है: http://stackoverflow.com/a/452143/473285 – scytale

+2

मैं प्रदर्शन से अधिक दस्तावेज़ीकरण के लिए ऐसा करता हूं (मान लीजिए कि मैं 'आरएक्स' को एक सूचनात्मक नाम दे सकता हूं)। – thebjorn

1

अजगर एक समारोह (docs) लागू किया करते थे, लेकिन यह पाइथन 3 में हटा दिया गया है, क्योंकि यह अनावश्यक था और अजगर के सिद्धांत के खिलाफ कि एक विशेष चीज़ करने का केवल एक ही तरीका होना चाहिए।

कहें, हमारे पास "func" नामक एक फ़ंक्शन है, हम आसानी से लागू (func, args) के बजाय func (* args) को कॉल कर सकते हैं।

+0

धन्यवाद, मैंने अपना जवाब संपादित कर लिया है – hspandher

3

आप apply के बिना एक अजगर का उपयोग कर रहे हैं, तो आप हमेशा यह अपने आप को लिख सकता है ...

def apply(fn, args=(), kwargs=None): 
    if kwargs is None: 
     kwargs = {} 
    return fn(*args, **kwargs) 

सिर्फ इसलिए कि आप, इसका मतलब यह नहीं कर सकता है आपको चाहिए ..

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