2011-04-05 80 views
41

अरे, मैं अपनी होमवर्क समस्याओं में से एक को सरल बनाने और कोड को थोड़ा बेहतर बनाने की कोशिश कर रहा हूं। मैं जो काम कर रहा हूं वह एक बाइनरी सर्च पेड़ है। अभी मेरे पास Tree() कक्षा में एक फ़ंक्शन है जो सभी तत्वों को पाता है और उन्हें एक सूची में रखता है।डिफ़ॉल्ट पैरामीटर के रूप में self.xxxx का उपयोग करना - पायथन

tree = Tree() 
#insert a bunch of items into tree 

तो मैं पेड़ से सभी नोड्स लेने के लिए अपने मेकलिस्ट() फ़ंक्शन का उपयोग करता हूं और उन्हें एक सूची में रखता हूं। makeList() फ़ंक्शन को कॉल करने के लिए, मैं tree.makeList(tree.root) करता हूं। मेरे लिए यह थोड़ा दोहराया जाता है। मैं पहले ही पेड़ वस्तु को tree. से बुला रहा हूं, इसलिए tree.root बस थोड़ा टाइपिंग का अपशिष्ट है।

अभी makeList समारोह है:

def makeList(self, aNode): 
     if aNode is None: 
      return [] 
     return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) 

मैं एनोड इनपुट एक डिफ़ॉल्ट पैरामीटर जैसे aNode = self.root (जो काम नहीं करता है) कि जिस तरह से मैं इस के साथ समारोह चला सकते हैं, tree.makeList() बनाने के लिए करना चाहते हैं।

पहला सवाल यह है कि, यह क्यों काम नहीं करता है?
दूसरा सवाल यह है कि क्या यह एक तरीका है कि यह काम कर सकता है? जैसा कि आप देख सकते हैं makeList() फ़ंक्शन रिकर्सिव है इसलिए मैं फ़ंक्शन की शुरुआत में कुछ भी परिभाषित नहीं कर सकता या मुझे अनंत लूप मिलता है।

संपादित यहाँ के रूप में अनुरोध सभी कोड है:

class Node(object): 
    def __init__(self, data): 
     self.data = data 
     self.lChild = None 
     self.rChild = None 

class Tree(object): 
    def __init__(self): 
     self.root = None 

    def __str__(self): 
     current = self.root 

    def isEmpty(self): 
     if self.root == None: 
      return True 
     else: 
      return False 

    def insert (self, item): 
     newNode = Node (item) 
     current = self.root 
     parent = self.root 

     if self.root == None: 
      self.root = newNode 
     else: 
      while current != None: 
       parent = current 
       if item < current.data: 
        current = current.lChild 
       else: 
        current = current.rChild 

      if item < parent.data: 
       parent.lChild = newNode 
      else: 
       parent.rChild = newNode 

    def inOrder(self, aNode): 
     if aNode != None: 
      self.inOrder(aNode.lChild) 
      print aNode.data 
      self.inOrder(aNode.rChild) 

    def makeList(self, aNode): 
     if aNode is None: 
      return [] 
     return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) 


    def isSimilar(self, n, m): 
     nList = self.makeList(n.root) 
     mList = self.makeList(m.root) 
     print mList == nList 
+1

मॉड्यूल स्तर विधि के भीतर आप 'स्वयं' के साथ क्या चाहते हैं? यह बिल्कुल कोई सघन नहीं बनाता है। यदि makeList2() कक्षा का एक तरीका है तो कृपया संदर्भ के बिना सही कोड प्रदान करें और स्निपेट न करें। –

+0

makeList2() को बनाने का अनुमान था(), मैंने इसे संपादित किया – crh878

+0

इसका कोई अर्थ नहीं है? मैं इसे कॉल करने के बजाय पेड़ की जड़ के लिए डिफ़ॉल्ट पैरामीटर का उपयोग कर अपने मेकलिस्ट() फ़ंक्शन को सरल बनाने का प्रयास कर रहा हूं। – crh878

उत्तर

31

larsmans answered अपने पहले प्रश्न

अपने दूसरे प्रश्न, तो आप बस देख सकते हैं के लिए इससे पहले कि आप प्रत्यावर्तन से बचने के लिए छलांग?

def makeList(self, aNode=None): 
    if aNode is None: 
     aNode = self.root 
    treeaslist = [aNode.data] 
    if aNode.lChild: 
     treeaslist.extend(self.makeList(aNode.lChild)) 
    if aNode.rChild: 
     treeaslist.extend(self.makeList(aNode.rChild)) 
    return treeaslist 
26

क्योंकि डिफ़ॉल्ट तर्क, समारोह परिभाषा समय में मूल्यांकन किया जाता है कॉल समय पर नहीं यह काम नहीं करता है:

def f(lst = []): 
    lst.append(1) 
    return lst 

print(f()) # prints [1] 
print(f()) # prints [1, 1] 

सामान्य रणनीति None डिफ़ॉल्ट पैरामीटर का उपयोग करना है। यदि None कोई मान्य मान, एक सिंगलटन प्रहरी का उपयोग करें:

NOTHING = object() 

def f(arg = NOTHING): 
    if arg is NOTHING: 
     # no argument 
    # etc. 
+1

आप 'सेंटिनल' को छोड़ सकते हैं। बस 'NOTHING = ऑब्जेक्ट() 'का उपयोग करें। एक अद्वितीय सिंगलटन उत्पन्न करने की गारंटी है जिसे आप 'is' के माध्यम से देख सकते हैं। – delnan

+0

@ डेलनान: अच्छा बिंदु, 'सेंटिनल' हटा दिया गया। –

+0

मैं दृढ़ता से 'foo (1, कोई नहीं)' और 'foo (1)' अलग-अलग चीजों को करने के खिलाफ सलाह देता हूं। –

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

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