2013-05-24 4 views
1

파이썬에서 재귀 멤버 함수를 작성하는 중 문제가 발생했습니다. 함수 매개 변수의 기본값을 멤버 변수와 동일한 값으로 초기화 할 수 없습니다. 필자는 매개 변수를 할당하려고 할 때 자체가 정의되어 있지 않으므로 Python이이 기능을 지원하지 않는다고 생각합니다. 그 주위를 코딩 할 수있는 동안, 파이썬에서 함수 오버로딩이 부족하여 내가 시도 할 하나의 확실한 해결책이 없어졌습니다.클래스 멤버 함수 매개 변수의 파이썬 기본값이 멤버 변수로 설정되었습니다.

예를 들어, 링크 된 목록을 재귀 적으로 인쇄하려고하면 다음과 같은 코드가 표시됩니다.

def display(self,head = -1): 
     if head == -1: 
      head = self.head 

     if not head: 
      return 

     print head, 

     self.display(head.link) 

이 코드가 작동하는 동안, 그것은 추합니다. 주요 기능은 다음과 같습니다

def main(): 
    l = List(); 
    l.insert(3); 
    l.insert(40); 
    l.insert(43); 
    l.insert(45); 
    l.insert(65); 
    l.insert(76); 

    l.display() 

if __name__ == "__main__": 
    main() 

나는 그것이 매개 변수없이 호출하면 다음이 훨씬 좋네요 보일 것 self.head을 기본값으로 표시 기능 매개 변수를 설정할 수 있습니다합니다. 필자는 처음에 두 개의 매개 변수를 취하는 함수와 하나를 취하는 함수의 두 가지 버전을 만들려고했지만 파이썬은 오버로드를 지원하지 않습니다. 인수 목록을 전달하고 인수의 수를 확인할 수는 있지만 꽤 못생긴 것입니다 (Perl처럼 보일 수 있습니다!). 문제는, 만약 내가 라인을 넣으면 head = self.head 이 함수 본문 안에 있고, 그것은 모든 재귀 호출 동안 호출 될 것이고, 그것은 필자가 필요로하지 않는 행동이다. None은 head 변수에 유효한 값이기 때문에 기본값으로 전달할 수 없습니다. 기본적으로 -1을 사용하여 초기 함수 호출에 있고 재귀 호출에 있음을 알고 있습니다. 나는 두 개의 함수를 작성할 수 있다는 것을 알았습니다. 하나는 다른 하나의 함수를 쓰지 만, 하나의 재귀 함수에 모든 것을 포함시켜야합니다. 나는 누군가가 pythonic 접근법으로 나를 도와 줄 수 있을지에 관해서 여기에 기본적인 pythonic 원리를 놓치고 있다고 확신한다.

감사합니다.

+0

표시 기능의 들여 쓰기를 수정하십시오. –

답변

2

코드에 무엇이 잘못되었는지 실제로 알 수 없습니다. head에 대한 위증 기본값을 선택한 경우 다음을 수행 할 수 있습니다. head = head or self.head이 더 간결합니다.

그렇지 않으면, 이것은 기본 인수를 처리하기 위해해야 ​​할 일입니다. 또는 kwargs :

def display(self,**kwargs): 
    head = kwargs.get("head", self.head) 

    if not head: 
     return 

    print head, 

    self.display(head=head.link) # you should always name an optional argument, 
           # and you must name it if **kwargs is used. 
+0

나는 이것을 다음과 같이 작성하려고 시도했다. def display (self, head = self.head)는 허용되어야 하는가? 제 해석기가 '자기'가 무엇을 의미 하는지를 알지 못한다고 불평합니다. (철학적 인 딜레마의 한 종류입니다.) – user2418063

+0

@ user2418063 아니, 그게 가능하지 않기 때문에 나는 그것에 대해 이야기하지 않습니다. 기본값은 함수 호출 시간이 아니라 클래스 생성시 평가되므로 가능하지 않습니다. – Marcin

+0

함수 매개 변수의 기본값은 해석되고 함수가 해석되고 함수 개체로 변환 될 때 고정됩니다. 그때, '자기'는 존재하지 않으며, 게다가, 어쨌든 당신이 원했던 것처럼 그것은 역동적 인 가치가 아닐 것입니다. 'self'는 관례에 따라 바운드 멤버 메서드의 암시 적 첫 번째 인수를 받기 위해 사용되는 이름이며, 고유 한 특별한 의미가 없으며 정의 된 범위, 즉 그것이있는 메서드 내에서 존재하지 않습니다 논증. –

관련 문제