2017-09-23 6 views
5

में लैम्ब्डा अभिव्यक्ति के बारे में उलझन में मैं सामान्य लैम्ब्डा अभिव्यक्ति को समझते हैं, इस तरह के रूपअजगर

g = lambda x: x**2 

हालांकि, कुछ जटिल लोगों के लिए, मैं एक छोटे से उनके बारे में उलझन में हूँ। उदाहरण के लिए:

for split in ['train', 'test']: 
    sets = (lambda split=split: newspaper(split, newspaper_devkit_path)) 

def get_imdb(): 
    return sets() 

जहां newspaper एक कार्य है। मैं सोच रहा था क्या वास्तव में sets है और क्यों get_imdb समारोह मूल्य sets()

धन्यवाद लौट सकते हैं आपकी मदद के लिए!

जोड़ा गया: कोड यहाँ से वास्तव में कर रहे factory.py

+3

क्या आप वाकई कोड सही हैं? हर पुनरावृत्ति 'सेट' को पुन: असाइन करना वास्तव में अजीब है। –

+0

मुझे लगता है कि यह एक न्यूनतम उदाहरण बनाने के लिए ओपी का प्रयास है। यह कोड खुद ही प्रश्न के अनुसार नहीं है। –

उत्तर

2

sets को लैम्ब्डा असाइन किया जा रहा है जिसे वास्तव में इनपुट स्वीकार नहीं किया जाता है, जिसे आप जिस तरह से बुलाते हैं उससे देखते हैं। सामान्य रूप से लैम्ब्डा सामान्य कार्यों की तरह व्यवहार करते हैं, और इसलिए g या sets जैसे चरों को असाइन किया जा सकता है। sets की परिभाषा किसी स्पष्ट कारण के लिए ब्रांड्स के एक अतिरिक्त सेट से घिरा हुआ है। आप उन बाहरी माता-पिता को अनदेखा कर सकते हैं।

लैम्बडास में समान प्रकार के स्थितित्मक, कीवर्ड और डिफ़ॉल्ट तर्क एक सामान्य कार्य कर सकते हैं। लैम्ब्डा sets में split नामक एक डिफ़ॉल्ट पैरामीटर है। यह सुनिश्चित करने के लिए एक आम मुहावरे है कि लूप के प्रत्येक पुनरावृत्ति में sets को split का मान मिलता है जो सभी मामलों में अंतिम पुनरावृत्ति से केवल उस पुनरावृत्ति के अनुरूप होता है।

डिफ़ॉल्ट पैरामीटर के बिना, split का नाम नाम के समय नाम के आधार पर लैम्ब्डा के भीतर मूल्यांकन किया जाएगा। एक बार लूप पूरा हो जाने पर, बाहरी फ़ंक्शन के नामस्थान में split लूप के लिए केवल अंतिम मूल्य होगा।

फ़ंक्शन ऑब्जेक्ट बनने पर डिफ़ॉल्ट मानकों का तुरंत मूल्यांकन किया जाता है। इसका अर्थ यह है कि डिफ़ॉल्ट पैरामीटर split का मान उस लूप के पुनरावृत्ति में होगा जहां यह बनाता है।

आपका उदाहरण थोड़ा भ्रामक है क्योंकि यह पिछले एक के अलावा sets के सभी वास्तविक मानों को छोड़ देता है, जो लम्बाडा को डिफ़ॉल्ट पैरामीटर बना देता है। यहां एक उदाहरण दिया गया है जो बताता है कि क्या होता है यदि आप सभी लैम्ब्स रखते हैं। सबसे पहले डिफ़ॉल्ट पैरामीटर के साथ:

 
sets = [] 
for split in ['train', 'test']: 
    sets.append(lambda split=split: split) 
print([fn() for fn in sets]) 

मैं lambdas छोटा कर दिया है बस चित्रांकन के लिए अपने इनपुट पैरामीटर वापस जाने के लिए। यह उदाहरण अपेक्षित के रूप में ['train', 'test'] प्रिंट करेगा।

आप डिफ़ॉल्ट पैरामीटर के बिना एक ही बात करते हैं, उत्पादन के बजाय ['test', 'test'] हो जाएगा:

 
sets = [] 
for split in ['train', 'test']: 
    sets.append(lambda: split) 
print([fn() for fn in sets]) 

इसका कारण यह है 'test'split का मूल्य है, जब सभी lambdas का मूल्यांकन करने के लिए है।

+0

जब हम 'एफएन' कहते हैं, तो कोई पैरामीटर नहीं हो सकता है? 'G = lambda x: x ** 2' का उदाहरण लें, हमें इसे 'g (2)' के रूप में कॉल करने की आवश्यकता है, और 'g()' समझ में नहीं आता है। यदि इसमें डिफ़ॉल्ट पैरामीटर हैं, तो यह ठीक लगता है क्योंकि इसे बनाते समय मान पहले ही उत्पन्न हो चुके हैं।लेकिन डिफ़ॉल्ट पैरामीटर के बिना, क्या हमें अंतिम उदाहरण के लिए 'प्रिंट ([एफएन (विभाजित) सेट में एफएन (विभाजन) का उपयोग करना चाहिए? –

+1

आखिरी उदाहरण में लैम्ब्डा फ़ंक्शन को 'लैम्ब्डा: स्प्लिट' के रूप में परिभाषित किया गया है, i। ई। यह 'def func(): '(पैरामीटर के बिना एक फ़ंक्शन) के रूप में कुछ है। यदि लैम्ब्डा फ़ंक्शन पैरामीटर का उपयोग करता है, तो इसे परिभाषित किया जाना चाहिए ई। जी। 'lambda x: x ** 2' (आपका पहला, समझने योग्य उदाहरण) के रूप में -' lambda' और ':' के बीच पैरामीटर नामों के साथ। – MarianD

0

एक लैम्ब्डा समारोह:

func = lambda x: x**2 

लगभग समतुल्य रूप में लिखा जा सकता:

def func(x): 
    return x**2 

किसी भी तरह से उपयोग करके, आप कॉल कर सकते हैं इस तरीके से कार्य करें:

func(4) 

अपने उदाहरण में,

sets = lambda split=split: newspaper(split, newspaper_devkit_path) 

फिर से लिखा जा सकता है:

def sets(split=split): 
    return newspaper(split, newspaper_devkit_path) 

और इतने कहा जा सकता है:

sets() 

जब आप निम्न लिखते हैं:

def get_imdb(): 
    return sets() 

आप "बंद" को परिभाषित कर रहे हैं। फ़ंक्शन sets का संदर्भ get_imdb के भीतर सहेजा गया है ताकि इसे बाद में कहीं भी कहा जा सके जहां कहीं भी get_imdb कहा जाता है।

+0

आप डिफ़ॉल्ट पैरामीटर के उद्देश्य को संबोधित नहीं करते हैं या तथ्य यह है कि 'सेट' के सभी मान लेकिन अंतिम को छोड़ दिया जाता है। 'def get_imb(): ... * * * बंद नहीं करता है। यह सिर्फ एक सामान्य समारोह कॉल करता है। –

0

शायद आप split=split भाग के बारे में उलझन में हैं। इसका एक ही अर्थ है जैसा कि यह एक नियमित कार्य में होगा: बाईं ओर विभाजन लैम्ब्डा फ़ंक्शन का एक पैरामीटर है और दाईं ओर विभाजित डिफ़ॉल्ट मान है जब बाएं विभाजन को कोई मूल्य प्रदान नहीं किया जाता है। इस मामले में, डिफ़ॉल्ट मान लूप में परिभाषित चर split होगा।

तो, अपने पहले प्रश्न (क्या sets है?) का जवाब दे:

sets एक चर करने के लिए जो एक गुमनाम समारोह (या लैम्ब्डा समारोह) निर्दिष्ट किया जाए। यह लैम्ब्डा फ़ंक्शन को संदर्भित करने और परिवर्तनीय sets के माध्यम से उपयोग करने की अनुमति देता है।

आपके दूसरे प्रश्न के लिए (sets() क्यों लौटाया जा सकता है?), मैं जवाब देता हूं:

sets एक चर है जो फ़ंक्शन के रूप में कार्य करता है, इसे लैम्ब्डा फ़ंक्शन कहने के बाद ब्रांडेसिस जोड़ता है। चूंकि कोई पैरामीटर नहीं दिया गया है, पैरामीटर split मान 'test' लेता है, जो लूप वैरिएबल split लेता है, जो अंतिम मान है। यह ध्यान देने योग्य है कि, sets फ़ंक्शन get_imdb फ़ंक्शन के अंदर परिभाषित नहीं किया गया है, इसलिए दुभाषिया की get_imdb के दायरे के बाहर की परिभाषा को देखता है (और वह लैम्ब्डा फ़ंक्शन को संदर्भित करता है)।