AI데이터 엔지니어, 새싹

2주차(4) - [python]함수, 클래스,모듈과 패키지

Leetora 2023. 9. 13. 18:12

1. 함수

  • 입력 X값에 대한 결과 Y값을 Return하는 기능을 하나의 묶음
  • Input X → Output Y
  • 반복적 루틴을 효율화 시키기 위함
  • 코드를 진행할 때, 함수 이름이 언급되지 않으면 실행되지 않는다

위 사진으로 쉽게 이해할 수 있다

예제

#함수 선언하기
def sum(a, b):
	result = a+b
	return result

#함수 호출하기
a = sum(3,4)
print(a) -> 7
  • 선언을 했을 때는 아무런 일도 일어나지 않음
  • 함수를 호출해야만 결과가 출력된다

(예제1) 입력값이 있는 함수

def sum1(num1, num2):
  result = num1 + num2
  return result

sum1()

sum1(3,4) -> 7

sum을 그냥 실행할 경우 이런 메세지가 뜬다. 즉 값을 저장해달라는 의미

sum() missing 2 required positional arguments: 'num1' and 'num2'

return의 의미

def sum2(num1, num2):
	print(num1+num2)
sum2(3,4) -> 7
  • return을 해야만 값을 뱉어준다
    • return이 없다면 그냥 print만 해주는 것
    • return을 해야만 그 값을 사용할 수 있다

(예제2) 입력값이 없는 함수

def say():
return 'Hi

즉, num1과 num2의 정의가 있지 않다는 내용이다. 에러가 뜨지 않게 하기 위해선 어떻게 해야할까?

sum(3,4) -> 7

값을 집어넣으면 이렇게 결과값이 나온다

함수의 기본 구조

sum(3,4)
sum(num1 = 3, num2 = 4)
#기본적으로 순서가 들어가 있음
#파라미터를 명시한다면 순서가 지켜지지 않아도 된다

예제

def say_myself(name, old, man = True):
	print(f'나의 이름은 {name}입니다')
	print(f'나의 나이는 {old}입니다')
	if man:
		print('남자입니다')
	else:
		print('여자입니다')

say_myself('서준범',26) #아래 구문과 동일
say_myself('서준범',26,True)
say_myself('서이준',27,False)
say_myself(old = '10', name = '뽀로로')
  • 제일 끝에 True로 쓰면?
    • 파라미터를 넣지 않아도 True라는 의미
    • 여자라면 false를 기입
    • 디폴트를 man으로 했으니 적지 않아도 됨
  • 파라미터를 따로 정의한다면 순서를 지키지 않아도 됨

전역변수 vs. 지역변수

  • 전역변수: 함수 외부에서 선언된 변수, 프로그램 전체에서 사용 가능
  • 지역변수: 함수 내부에서 선언된 변수, 해당 함수 내부에서만 사용 가능
def test():
  local_var = 20
test()
----
print(local_var)-> error

지역변수 예제

  • local_var는 함수 안에서만 나오는 것이기 때문에 바깥에서 사용 불가
def test2():
  local_var = 20
	return local_var

a = test2()
print(a) -> 20
  • 지역변수지만, return을 통해 값이 나옴
  • local var를 return했기에, 20이라는 값이 나옴
def test3():
	global local_var = 20
	local_var = 20
test3()
----
print(local_var)-> 20
  • 지역변수를 전역 변수로 활용하려면 global
  • 추천하는 방법은 아님

args 함수: 입력개수 상관없이 변수를 삽입할 수 있음

def means(*args):
	return args
print(means(1,2,3))
print(means(1,2,3,4,5,6))
  • args를 통해 튜플 형태로 여러가지 값을 산출할 수 있어야 함

Example 2-9. 입력하는 모든 수의 평균을 계산하는 함수 만들기

입력 개수에 상관없이 사용하기 위해, 함수 입력 값 자리에, *args를 사용

def means(*args):
	sum1 = 0
	count1 = 0
	for i in args:
		sum1 = sum1 + i
		count1 += 1
	result = sum1/count1
	return result

print(mean(1,2,3))

Example 2-10. 두 수를 입력 받아 사칙연산(+,-, x, /)을 하는 함수 만들기

def four(num1, num2):
	plus = num1 + num2
	minus= num1 - num2
	multiple = num1 * num2
	divide = num1 / num2
	return plus,minus,multiple,divide

2. 클래스

클래스

  • 함수가 반복해서 사용하기 싫어서 선언
  • 클래스 / 인스턴스 / 속성
    • 클래스: 객체(클래스) 자체를 만들기 위한 도면
      • 덩어리 같은 느낌,,?
    • 인스턴스: 설계 도면(클래스)으로 만든 집
class Calculator:
	def __init__(self):
		self.result = 0
	def adder(self, num):
		self.result += num
		return self.result

result1 = Calculator()
result2 = Calculator()
  • 클래스( 붕어빵 틀 ) → Calculator
  • 인스턴스(결과물, 붕어빵) = 객체 → result1 / result2
  • 속성( Attribute, 붕어빵 속재료, 속성) → result

안보고 작성이 가능한 정도

  • 클래스: Person
  • 인스턴스: Alice / Bob
  • 속성: Person 클래스의 속성
    • name / age / gender
  • method: 클래스 내부의 함수
    • walk가 메서드
  • self: 인스턴스 자기 자신을 의미
    • init에서 뭘 만들지 모르니 자기 자신을 지칭
  • init: 생성자
    • 속성 값을 미리 정해줄 수 있는 것
    • 클래스 만듬과 동시에 생성하기 위해
    • 인스턴스 생성자를 돕기 위한 것

예제

class FourCal:
  def set_data(self, num1, num2)
		self.num1 = num1
		self.num2 = num2
	def add(self):
		return self.num1 + self.num2
a = FoulCal() # -> a라는 인스턴스 클래스를 사용
a.set_data(10,20)

print(a.num1, a.num2)
print(a.add())
  • add메서드에서 self에서 이미 지정을 해줬기 때문에 return self.num1 + self.num2만 해줘도 됨

생성자

class FourCal:
  def __init__(self, num1, num2)
		self.num1 = num1
		self.num2 = num2
	def add(self):
		return self.num1 + self.num2
	def abst(self):
		return self.num1 + self.num2
	def multi(self):
		return self.num1 * self.num2
	def divis(self):
		return self.num1 / self.num2

a = FoulCal(10,20) # -> a라는 인스턴스 클래스를 사용
  • __init__ 생성자를 통해 자기 자신을 지칭
  • 인스턴스 생성 동시에 초기 작업 수행 가능
  • 코드 중복을 최소화

예제

  1. BackAccount 이름 클래스 생성
  2. 생성자 메서드로, 계좌 번호, 예금주 이름, 초기 잔액을 받아 계좌를 생성합니다.
  3. 입금, 출금, 현재 계좌의 잔액을 반환하는 메서드를 생성합니다.
class BackAccount:
  def __init__(self,num, name, default):
    self.num = num
    self.name = name
    self.default = default

  def deposit(self, money):
    self.default = self.default + money 

  def withdraw(self, money):
    self.default = self.default- money 

  def check(self):
    print(f'{self.name}님의 잔고는 {self.default}입니다.')

a = BackAccount('122333','서준범',10000)

a.check()

3. 상속

  • 상속?: 부모 클래스의 내용(속성 or 메서드)을 물려받는 자식 클래스가 갖게 되는 것
class FourCal:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
    def add(self):
        return self.num1 + self.num2
    def abst(self):
        return self.num1 - self.num2
    def multi(self):
        return self.num1 * self.num2
    def divis(self):
        return self.num1 / self.num2
a = FourCal(20, 30)

class MoreFourCal(FourCal):
  pass
a = MoreFourCal(4,2)
a.add()
  • 자식 클래스는 add 메서드를 정의하지 않았지만 FourCal을 상속받아 사용할 수 있다

오버라이딩

b = FoulCal(2,0)
b.divis() --> 0이기 때문에 오류가 뜸

class MoreFourCal(FourCal):
	def divis(self):
		if self.num2 == 0:
			return 0
		else:
			return self.num1/num2
  • 0이기 때문에 오류가 뜸
  • 즉, 부모의 메서드를 자식 클래스에서 변경하는 것
    • 덮어쓰기
    • 부모 클래스가 문제가 생길 때 사용할 수 있음

4. 모듈과 패키지

모듈

  • 파이썬 코드를 담고 있는 파일
  • 코드의 함수 , 클래스 , 변수 등을 정의하고 다른 파이썬 프로그램에서 재사용
  • .py 확장자로 저장
  • import문을 통해 불러올 수 있음

패키지

  • 모듈들을 디렉토리 구조로 묶어놓은 것
  • 패키지: 모듈의 계층적 구조 형성
  • 폴더 안에는 __init__.py파일이 있어야 함
    • 현재는 __init__.py 없어도 됨

main.py

## import my_package.math_operations as mo
from my_package import math_operations as mo

# math_operations의 함수들을 사용할 수 있음

result = mo.add(3,5)
print(result)

result2 = mo.sub(3,5)
print(result2)

math_operations.py

def add(a,b):
    return a + b

def sub(a,b):
    return a - b

def mul(a,b):
    return a * b

def div(a,b):
    return a / b

5. 데이터 베이스

행(row) 튜플(tuple) 레코드(record)

열(column) 필드(field) 속성(attribute)

  • 데이터를 어떻게 저장할 것인가
  • 데이터를 어떻게 가져올 것인가

데이터를 쓰는 입장인 우리는, 어떻게 데이터를 가져올 것인가를 알아야 함