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__ 생성자를 통해 자기 자신을 지칭
- 인스턴스 생성 동시에 초기 작업 수행 가능
- 코드 중복을 최소화
예제
- BackAccount 이름 클래스 생성
- 생성자 메서드로, 계좌 번호, 예금주 이름, 초기 잔액을 받아 계좌를 생성합니다.
- 입금, 출금, 현재 계좌의 잔액을 반환하는 메서드를 생성합니다.
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)
- 데이터를 어떻게 저장할 것인가
- 데이터를 어떻게 가져올 것인가
데이터를 쓰는 입장인 우리는, 어떻게 데이터를 가져올 것인가를 알아야 함