ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Tree demo
    코딩/Python 2022. 12. 22. 14:17
    728x90

    재귀함수와 `name == 'main' 최상위 코드 환경 예제

    #!/usr/bin/env python3
    """      turtle-example-suite:
                 tdemo_tree.py
    
    고전적인 LOGO 트리 프로그램에 대비한 '너비 우선 트리'를 표시
    
    방법:
    (1) 제너레이터가 그림을 그리는데, 그 그림은 어떤 의미에서는 부작용으로 이해될 수 있다.
    왜냐 하면 제너레이터는 항상 None을 생성하기 때문이다.(의역, 문장을 이해하기 힘들었음)
    (2) 터틀 복제: 각각의 가지치는 점에서 현재 펜을 복제. 최종적으로 1024개의 터틀이 생성됨.
    """
    from turtle import Turtle, mainloop
    from time import perf_counter as clock
    
    def tree(plist, l, a, f): # tree() 함수 정의
        """ plist is list of pens
        l is length of branch; 가지 길이
        a is half of the angle between; 2 branches 두 가지 사이 각도/2
        f is factor by which branch is shortened; 가지가 줄어드는 비례치
        from level to level."""
        if l > 3:
            lst = []
            for p in plist:
                p.forward(l) # move forward for distance l
                q = p.clone() # p와 같은 pen 복제
                p.left(a) # p는 왼쪽으로 a 회전
                q.right(a) # q는 우측으로 a 회전(좌우 대칭)
                lst.append(p) # lst[]에 p 추가
                lst.append(q) # list[]에 q 추가
            for x in tree(lst, l*f, a, f): # 재귀함수. l이 3보다 작아질 때까지 계속
                yield None # generator, None
    
    def maketree(): # maketree() 함수 정의
        p = Turtle() # Turtle 클래스 오브젝트 생성
        p.setundobuffer(None) # 실행취소 버퍼 비활성화
        p.hideturtle() # 거북이 숨기기
        p.speed(0) # 가장 빠르게 움직이기; 선 그려지는 것이 보이지 않게 한다
        p.getscreen().tracer(30,0)
        # 거북이가 그리는 TurtleScreen 객체를 30번마다 갱신. 지연시간 0
        p.left(90) # 90도 회전
        p.penup() # 펜 들어올림
        p.forward(-210) # -210만큼 전진
        p.pendown() # 펜 내림
        t = tree([p], 200, 65, 0.6375)
        # tree() 함수 실행; 펜 리스트 [p], 길이 200, 각도 65, 비례치 0.6375
        for x in t: # t 반복
            pass
    
    def main(): # main() 함수
        a=clock() # 실행 시작 전 시간 a
        maketree() # maketree() 실행
        b=clock() # 실행 후 시간 b
        return "done: %.2f sec." % (b-a) # 총 실행시간 반환
    
    if __name__ == "__main__": # 최상위레벨 코드 환경
        msg = main() # main 실행
        print(msg) # main 실행 후 반환된 시간
        mainloop()
        # 모든 것을 화면에 뿌린 후 사용자의 입력 대기
        # 클릭하면 종료
    728x90

    댓글

Designed by Tistory.