2016-10-05 8 views
9

प्रश्न में What does the "yield" keyword do?, मुझे एक पाइथन सिंटैक्स का उपयोग किया जा रहा है जिसे मैंने वैध होने की उम्मीद नहीं की थी। सवाल पुराना है और वोट की एक बड़ी संख्या है, तो मैं हैरान कोई भी कम से कम इस समारोह परिभाषा के बारे में कोई टिप्पणी की कर रहा हूँ:क्या पाइथन में बिंदीदार नाम के साथ फ़ंक्शन को डिफॉल्ट करना संभव है?

def node._get_child_candidates(self, distance, min_dist, max_dist): 
    if self._leftchild and distance - max_dist < self._median: 
     yield self._leftchild 
    if self._rightchild and distance + max_dist >= self._median: 
     yield self._rightchild 

क्या मैं वाक्य रचना की इस तरह का मूल्यांकन करने की कोशिश:

  • एक आयातित मॉड्यूल

के एक समारोह को पुनर्परिभाषित कक्षा या वस्तु

  • को एक विशेषता बताए अब तक

    के साथ विफल

    SyntaxError: invalid syntax

    मैं link (maybe outdated) प्रश्न में दिए गए ऊपर देखा और def के उपयोग के लिए वेब खोज की है, लेकिन मैं इस "बिंदीदार नाम" पैटर्न समझा कुछ नहीं मिला। मैं पाइथन 3 का उपयोग कर रहा हूं, शायद यह पाइथन 2 की एक विशेषता है?

    क्या यह वाक्यविन्यास मान्य है (या था), यदि हां इसका क्या अर्थ है?

  • +1

    https://docs.python.org/3/reference/lexical_analysis.html#identifiers नहीं है, तो। –

    +1

    यदि आप कोड देखते हैं तो आप भी 'node = candidates.pop()' देखते हैं, तो आप 'node._get_child_candidates' देखते हैं, यह फ़ंक्शन में एक टाइपो है। वे नोड उदाहरण पर 'get_child_candidates' विधि को कॉल कर रहे हैं। –

    +0

    @ पैड्राइक कनिंघम अच्छी तरह से, एक मामले में एक टाइपो जिसे मैंने संदर्भित किया है, लेकिन सभी मामलों में भी अमान्य वाक्यविन्यास (मैंने आपके द्वारा वर्णित [पहचानकर्ता वाक्यविन्यास] का पता लगाने की कोशिश की है (https://docs.python.org/3/reference/ lexical_analysis.html # पहचानकर्ता) लेकिन 'पीसी' थोड़ा उलझन में पाया)? – Wolf

    उत्तर

    4

    नहीं, वाक्यविन्यास मान्य नहीं है। दस्तावेज़ीकरण की जांच करके साबित करना आसान है। अजगर 2 में, एक पहचानकर्ता निम्नलिखित rules द्वारा निर्माण किया है:

    identifier ::= (letter|"_") (letter | digit | "_")* 
    letter  ::= lowercase | uppercase 
    lowercase ::= "a"..."z" 
    uppercase ::= "A"..."Z" 
    digit  ::= "0"..."9" 
    

    Py3 में नियम, और अधिक या कम एक ही हैं बगल में यूनिकोड वर्ण की सीमा से ऊपर का विस्तार किया जा रहा है।

    ऐसा लगता है कि लेखक शायद की तरह

    class Node: 
        ... 
        def _get_child_candidates(self, ...): 
         ... 
    
    +0

    हां, एक कक्षा में परिभाषा के लिए केवल शॉर्टकट नोटेशन प्रतीत होता है – Wolf

    2

    कोई न कोई मतलब मेरी टिप्पणी में के रूप में आप नहीं कर सकते, python3 के लिए मान्य पहचानकर्ता docs में हैं:

    पहचानकर्ता (भी नाम के रूप में) निम्नलिखित व्याख्यात्मक परिभाषाओं द्वारा वर्णित हैं।

    पायथन में पहचानकर्ताओं का सिंटैक्स यूनिकोड मानक अनुबंध अनुबंध UAX-31 पर आधारित है, जिसमें विस्तार और परिवर्तन नीचे परिभाषित किया गया है; अधिक जानकारी के लिए पीईपी 3131 भी देखें। _ अपरकेस और लोअरकेस वर्णों A से Z के माध्यम से, अंडरस्कोर और,:

    ASCII सीमा के भीतर (U + 0001..U + 007F), पहचानकर्ता मान्य वर्ण पायथन 2.x में जैसे ही हैं पहले चरित्र को छोड़कर, 0 से 9 0 अंक

    पायथन 3.0 एएससीआईआई रेंज के बाहर से अतिरिक्त वर्ण प्रस्तुत करता है (पीईपी 3131 देखें)। इन वर्णों के लिए, वर्गीकरण यूनिकोड कैरेक्टर डेटाबेस के संस्करण का उपयोग करता है जैसा कि यूनिकोडेडटा मॉड्यूल में शामिल है।

    आप कोड की जांच तो आप देख सकते हैं यह मूल प्रश्न में कोई गलती है:

    def node._get_child_candidates(self, distance, min_dist, max_dist): 
        if self._leftchild and distance - max_dist < self._median: 
         yield self._leftchild 
        if self._rightchild and distance + max_dist >= self._median: 
         yield self._rightchild 
    

    और यह फोन करने वाले है:

    result, candidates = list(), [self] 
    while candidates: 
        node = candidates.pop() # creates an instance 
        distance = node._get_dist(obj) 
        if distance <= max_dist and distance >= min_dist: 
         result.extend(node._values) 
        # the _get_child_candidates node is called 
        candidates.extend(node._get_child_candidates(distance, min_dist, max_dist)) 
    return result 
    

    तो विधि _get_child_candidates पर कहा जाता है उदाहरण। तो सच में वास्तविक कोड की तरह दिखता है:

    def _get_child_candidates(self, distance, min_dist, max_dist): 
        if self._leftchild and distance - max_dist < self._median: 
         yield self._leftchild 
        if self._rightchild and distance + max_dist >= self._median: 
         yield self._rightchild 
    

    और यह फोन करने वाले है:

    result, candidates = list(), [self] 
    while candidates: 
        node = candidates.pop() # creates an instance 
        distance = node._get_dist(obj) 
        if distance <= max_dist and distance >= min_dist: 
         result.extend(node._values) 
        # the _get_child_candidates node is called 
        candidates.extend(node._get_child_candidates(distance, min_dist, max_dist)) 
    return result 
    
    संबंधित मुद्दे

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