언어/Python

선발대 심화 3주차(재귀함수, class 심화)

JM Lee 2023. 4. 27. 12:11
728x90

재귀함수(self) : 자기 자신을 설정하는 함수

 

재귀함수의 조건

1. 반복문으로 구현이 가능해야 함  (효율적 변경을 위해 반복문 >> 재귀함수로 바꾸는 것)

2. 종료 조건을 설정 : 반드시 끝나는 지점이 있어야 함

   - 종료 조건이 없을 시 복잡도가 한 없이 증가

# 예시 1

def recursional(n):
    if n >=5:
        print(n)
        recursion(n+1)

recursional(1) # 1 2 3 4
# 예시 2

def recursion(n):
    if n <=0:
        return 0
    return n + recursion(n-1)

print(recursion(4)) # 10

예시에서는 if문을 사용해서 종료 시점을 정해주었다.

# 팩토리얼 계산법

def factorial(a):
    if a == 0:
        return 1
    return a * factorial(a-1)
print(factorial(16))

 

만약 종료 시점을 정해주지 않는다면, 아래와 같이 야무진 에러코드가 나타날 것이다.

RecursionError: maximum recursion depth exceeded while calling a Python object

 


method overriding : 부모 클래스에서 정의한 method를 자녀 클래스에서 재정의하는 것

 

# method overriding

class Animal:
    def __init__(self) -> None:
        pass
    def speak(self):
        print("동물 소리")
        
class dog(Animal):
    def speak(self):
        print("개소리")

class cat(Animal):
    def speak(self):
        print("야옹")

Dog = dog("강아지")
Cat = cat("고냥이")

끄느트리 블로그에서 인용 좀... 하자면

# 모델 class에서의 오버라이딩

from django.db import models

class MyModel(models.Model):
	name = models.CharField(max_length=100)
    
    # save 메서드를 오버라이딩하여 저장하기 전 특정 작업 수행
    def save(self, *args, **kwargs):    	
        self.name = self.name.upper() # name 속성의 값을 대문자로 변환
        super(MyModel, self).save(*args, **kwargs) # 저장

Model에서 name 값만 가져와서 save 함수를 이식하는 오버라이딩

from django.db import forms

class MyForm(forms.Form):
	name = forms.CharField(max_length=100)
    
    # clean_name 메서드를 오버라이딩하여 입력값을 검증하거나 처리하는 등의 작업 수행
    def clean_name(self):    	
        name = self.clean_data['name']
        return name.capitalize() # name 필드 값의 첫 글자를 대문자로 변환

Form에서 name 값만 가져와서 clean_name 함수를 이식하는 오버라이딩

 

추상 클래스 : 부모 클래스에서 정의하지 않고, 자녀 클래스에서 정의하게 하는 클래스

 

부모 클래스에서는 그냥 우리 자식클래스들은 다 이런 이름의 함수를 가지고 있다~라고 추상적 설명만 하고

실제 내용은 자식 클래스들이 각각 따로 갖고 있을 때 추상 클래스를 사용하는 것으로 보인다.

# 추상 클래스
import abc

class Animal(abc.ABC)
    @abc.abstractmethod # 얘가 핵심 명령어.
    def tear(self):
        pass # 함수만 만들고 자녀 클래스에서 알아서 정의하라고 패스