[Python] 4일차 - 함수, 클래스, 예외 처리 등

김민정·2024년 7월 9일

Python

목록 보기
4/4
post-thumbnail

1. 함수

1. 함수의 형태

def_함수 선언 함수 이름 (입력_파라미터):
	함수 내용 (기능)
    출력 또는
    return_함수 종료
print("문장", 함수 이름(입력)_argument)
# argument를 입력하면 argument가 위 입력_파라미터로 들어가게 되어 함수가 진행되고 함수 값이 출력됨.
# 예제 1
def onion():
	print("Get two onions")

def spring_onion():
	print("Get a spring onion")

#함수 호출하기
onion()
spring_onion()

> 출력
Get two onions
Get a spring onion
None None

2. 함수의 작동 순서

함수는 호출해야 작동된다. 아래 예시로 들여쓰기와 작동 순서를 알 수 있다.

def 수확():
	print("올해 비가 많이 왔습니다.")
print("농작물 수확량이 현저히 줄었습니다.")	# 선 출력
수확()	# 후 함수 작동 후 실행

> 출력
농작물 수확량이 현저히 줄었습니다.
올해 비가 많이 왔습니다.

3. 함수의 반환 - return()

함수의 마지막 부분에서 return 다음에 오는 문장은 실행되지 않고 return에서 진행이 종료된다.

def function(x,y):
	z = x+y
    return z

# A 등급 10개, B 등급 2개
print('옥수수와 수박의 수확량 :', function(10,2))

> 출력
옥수수와 수박의 수확량 : 12

4. 함수의 입력과 출력

  1. 함수는 입력값이 없어도 출력이 가능하다.

  2. 함수는 return이 없어도 출력이 가능하다.

    # 예제 1
    def found():
      print("그들이 고라니 2마리를 잡았습니다.")
    
    def function(x,y):
      z = x + y
      print(z)
    
    print("사자와 호랑이의 수 : ', function(5,7))	# return이 없어서 None 출력.
    print(found())	# 입력이 없어도 return이 없으므로 출력 가능.
    
    # 1. function 함수가 가장 먼저 실행되므로 print(z) 출력.
    # 2. 첫 번째 print문 실행, 함수 자체 return 없으므로 None 출력.
    # 3. found 함수 실행되므로 print문 출력.
    # 4. 두 번째 print문 실행, 함수 자체 return 없으므로 None 출력.
    
    > 출력
    12
    사자와 호랑이의 수 : None
    그들이 고라니 2마리를 잡았습니다.
    None
  3. 함수는 return 값으로 수식이 가능하다.

    # 예제 2
    def cal(price, ea):
      return price * ea	# return문에 수식 가능.
    print(cal(1000,5),'원 입니다.')
    
    def cal2(a, b, c):
    	cal_num = a*1000 + b*500 + c*100
      return cal_num
    print(cal2(5, 2, 3),'원 입니다.')
    
    > 출력
    5000 원 입니다.
    6300 원 입니다.
  4. 함수 박의 변수 (전역변수)는 함수 내에서 바로 계산할 수 없다. global을 사용해서 전역변수를 지역변수로 호출할 수 있다.

    • 전역 변수 : main으로 작성하는 곳에서의 변수
    • 지역 변수 : 함수 내에서 생성된 변수
    # 예제 3
    a = 100
    def f():
        global a # 전역변수, 지역변수 어디든 갈 수 있게 해줌.
        a = a + 1
        return a
    f()
    
    > 출력
    101
    # 예제 4
    print("A")
    
    def message() :
        print("B")
    
    print("C")
    
    message()
    
    > 출력
    A
    C
    B
    # 예제 5
    def make_url(x):
        print(f'www.{x}.com')
    make_url("google")
    
    > 출력
    www.google.com
    # 예제 6
    def 함수0(num) :
        return num * 2
    
    def 함수1(num) :
        return 함수0(num + 2)
    
    def 함수2(num) :
        num = num + 10
        return 함수1(num)
    
    c = 함수2(2)	# 12 -> 14 -> 28
    print(c)
    
    > 출력
    28
  5. dict type은 지역 변수로 불러와 사용 가능하다.✨

    # 예제 7
    won = {'A class':1000,'B class':500, 'C class':100}
    def cal3(a, b, c):
        cal3_sum = a * won['A class'] + b * won['B class'] + c * won['C class']
        return cal3_sum
    
    print(cal3(1, 2, 3),'원 입니다.')
    
    > 출력
    2300 원 입니다.

5. 상수

전역 변수를 함수 내 입력값으로 넣어 호출하는 것이 가능하다.

# 예제 1
PI = 3.14
def circle(r, inputpi):
    z = r * r * inputpi
    return z

result = circle(10, PI)
print(result)

> 출력
314.0
# 예제 2
A, B, C, 유물 = 0, 0, 0, 0

def 감자():
    global A
    A += 1

def 양파():
    global A, B, C
    A += 3
    B += 3
    C += 4

def 옥수수():
    global 유물
    유물 += 1

감자()
양파()
옥수수()

합계 = A + B + C + 유물 # 4 + 3 + 4 + 1
print('오늘 수확한 수화물 :', 합계)

> 출력
오늘 수확한 수화물 : 12

6. 함수 안에 함수

# 함수 안에 함수 형태
def  함수이름_1():
	코드 1
    def 함수이름_2():
    	코드 2
# 예제 1
def print_text():
    text = "콩콩팥팥 수확의 기쁨"
    def txt():
        print(text)
    txt()
print_text()

> 출력
콩콩팥팥 수확의 기쁨
# 예제 2
def 수확철():
    야채 = {'A등급':0, 'B등급':0, 'C등급':0}

    def 양파():
        야채['A등급'] += 1
    def 대파():
        야채['A등급'] += 3
        야채['B등급'] += 3
        야채['C등급'] += 4
    def 쪽파():
        야채['금'] = 1 # 새로운 key, value 값 추가.

    양파()
    대파()
    쪽파()

    return 야채

수확철() # {'A등급': 4, 'B등급': 3, 'C등급': 4, '금': 1}
sum(수확철().values())

> 출력
12

7. 연산자의 우선순위

기본적으로 python이 실행되는데 연산자의 우선순위가 있다. 우선순위는 아래 그림과 같다.


2. 클래스

1. 클래스란?

클래스(class)란 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면(과자 틀), 객체(object)란 클래스로 만든 피조물(과자 틀로 찍어 낸 과자)을 뜻한다.

객체에 해당하는 것들은 예시로 게임에서 직업(궁수, 성직자, 기사 등등)이나, 집/나무/자동차, 네이버 홈페이지의 버튼들을 들 수 있다.
인스턴스는 객체와 클래스가 연결된 단어인데 클래스로 만든 객체를 인스턴스라고도 한다.
그렇다면 객체와 인스턴스의 차이는 뭘까?
즉, 인스턴스란 특정 객체(a)가 어떤 클래스(과자틀)의 객체인지를 관계 위주로 설명할 때 사용한다.
'a는 인스턴스'라는 말보단 'a는 객체'라는 표현이 어울리며,
'a는 클래스의 객체'라는 말보단 'a는 클래스의 인스턴스'라는 표현이 훨씬 잘 어울린다.
이 외에도 매서드(method)라는 것이 있는데 이는 클래스 안에서 정의된 함수를 말한다.

클래스의 자세한 설명은 점프 투 파이썬에서 확인할 수 있다.✨

2. 클래스의 선언

  • 기본 형태

    class class_name:
        def method (self):
            code
  • 클래스 안에서 속성

    class class_name:
        def method(self):
            self.attribute = valuse

# 예제 1
class Person:
    def hello(self):
        print("여러분~")

호출 = Person() # 호출에 할당된 것 = instants (인스턴스)
호출.hello()	# Person.hello()

> 출력
여러분~
# 클래스의 변수 및 메소드
print(dir(Person()))

> 출력
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'hello']
*dir() 내장 함수: 어떤 객체를 인자로 넣어주면 해당 객체가 어떤 변수와 메소드(method)를 가지고 있는지 나열해줍니다.
# 예제 2
a = int(10) # 사실 여기 a는 인스턴스, int는 매서드
print(a)

b = list(range(10)) # b도 인스턴스, dict은 클래스
print(b)

> 출력
10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 예제 3
class Person:
    def __init__(self): # __ 사이에 있는 매서드는 매직 매서드 / __init__ 는 초기화.
        self.hello = "안녕하세요"

    def greeting(self):
        print(self.hello)

호출 = Person()
호출.greeting()

> 출력
안녕하세요
  • self: 인스턴스 자기 자신.
  • init함수 매개변수 self에 들어가는 값은 person()이다.

3. 매직 매서드

__del__() : 인스턴스 삭제
__len__() : 인스턴스 길이
__repr__() : 인스턴스 출력
__str__() : 문자열로 형변환
__add__() : +
__sub__() : -
__mul__() : *
__div__() : /
__mod__() : %
__pow__() : **
__eq__() : ==
이 외 등등...

4. 클래스 속 self

  • 기본 형태
    class class_name:
        def __init__(self, 매개변수1, 매개변수2):
            self.attribute1 = 매개변수1
            self.attribute2 = 매개변수2
# 예제 1
class Person:
    def __init__(self, name, age, address):
        self.hello = '안녕하세요.'
        self.name = name
        self.age = age
        self.address = address

    def greeting(self):
        print('{0} 저는 {1} 입니다.'.format(self.hello, self.name)) 
        # {0}에 self.hello가 들어가고 {1}에는 self.name이 들어감.

maria = Person('마리아',20,'서울시 서초구 반포동') # self -> maria / name, age, address 순으로 대입.
# 그럼 maria.name = '마리아' / maria.age = 20 / maria.address = '서울시 서초구 반포동'
maria.greeting() # 여기서도 자기자신을 부르는 매서드 greeting이 입력됐기 때문에
# greeting 매서드 아래에 있는 print문 출력됨.

print('이름:',maria.name)
print('나이:',maria.age)
print('주소:',maria.address)

> 출력
안녕하세요. 저는 마리아 입니다.
이름: 마리아
나이: 20
주소: 서울시 서초구 반포동

5. 클래스의 상속

  • 기반 클래스 (base class) : 기능을 주는 클래스
  • 파생 클래스 (derived class) : 기능을 받는 클래스
# 예제 1
class Car(object):
    maxspeed = 300
    maxpeople = 5
    def move(self, x): # 여기서의 self는 Car? object?
        print("스피드로 달리고 있습니다.")
    def stop(self):
        print("멈췄습니다.")

class HybridCar(Car): # 위에 Car(object) 기능을 가져옴.
    battery = 1000
    batteryKM = 300

class ElectricCar(HybridCar):
    battery = 1000
    batteryKM = 300
    def move(self, x):
        print(self.batteryKM,"만큼 달릴 수 있습니다.")
        print(x, "스피드로 달리고 있습니다.")
        
k5 = HybridCar()
k5.maxspeed	# 300
print(dir(k5)) # 'battery', 'batteryKM', 'maxpeople', 'maxspeed', 'move', 'stop'

electricCark5 = ElectricCar()
electricCark5.maxspeed	# 300
electricCark5.battery	# 1000
electricCark5.move(10) # 위에 있는 move 매서드와 아래 있는 매서드 중에 아래꺼만 작동. → 매서드 오버라이딩.

> 출력
300 만큼 달릴 수 있습니다.
10 스피드로 달리고 있습니다.

3. 파일 읽고 쓰기

1. 파일 입•출력

웹의 경우 파일 입출력 과정은 아래와 같다.

크롤링을 통해 가져오기 → 데이터 베이스에 저장 → 1차 클렌징 → 출력 후 담당자에게 전달 → 2차 클렌징 → 유용한 데이터셋 → CSV 데이터 베이스 입력 → 인공지능 학습
*CSV(comma-separated values) : 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일

  • r : 읽기
  • w : 쓰기 (새로 덮어 쓰기)
  • a : 추가
  • 작성 기능
    - ''' ''' (작은 따옴표 3개) : 여러줄의 주석을 작성할 수 있다.
  • 이 모든 것을 할 때 open과 close는 따라온다.
# 입력 방법
f = open('test.txt','w')
f.write('여러분~ 모두 부우~자 되세요~~')
f.close() # Colab Notebooks 폴더에 텍스트 파일 생성됨.
# 여러줄 입력 방법 1
f = open('test.txt','w')
f.write('''마라탕 먹고 싶다.
마라탕 먹고 싶다.
마라탕 먹고 싶다.
마라탕 먹고 싶다.
마라탕 먹고 싶다.
''')
f.close()
# 여러줄 입력 방법 2
f = open('test.txt','w')
메세지 = ''

for i in range(10):
    메세지 += "탕후루 먹고 싶다.\n"

f.write(메세지)
f.close()
# 저장된 문서 읽어 오기
f = open('test.txt','r')
s = f.read()
print(s)
f.close()
# 한 줄씩 읽어오기
f = open('test.txt','r')
line = f.readline()
print(line)
print(type(line))
f.close()
# 한 줄씩 읽어오는 것으로 저장된 문서 읽기
f = open('test.txt','r')
while line: # 뭐라도 적혀 있으면 True로 아래 반복문 실행. 아무것도 없으면 False로 반복문 실행X
    line = f.readline()
    print(line)
f.close()

f = open('test.txt','a')
f.write('마라탕을 더 먹고 싶다.')
f.close()
#f = open close 문구의 다른 형태
with open('test.txt', 'a') as f:
    f.write("다 먹으면 금방 살찌겠는데...")
# list 요소 입력 방법 1
list = [10, 20, 30]

with open('test.txt', 'w') as f:
    # f.write(list) # 오류 발생. 문자열만 입력 가능.
    f.write(str(list)) # 저 list 요소 그대로 저장됨.

list = [10, 20, 30]

with open('test.txt', 'w') as f:
    f.write('let test =' + str(list)) # let은 변수의 성격을 나타내는 것, 변수의 한에서 중복을 허용하지 않음.(at JavaScript)
    # 여기서는 저 문자 그대로 입력되도 웹상에서는 문법으로 인식되기 때문에 자동화 가능.
# list 요소 입력 방법 2
list = ['10 ', '20 ', '30 '] # 위처럼 숫자로 입력시 아래 writelines에서는 요소 하나하나를 int로 보기 때문에 문자열로 넣기.
with open('test.txt', 'w') as f:
    f.writelines(list) # 10 20 30
#csv 파일 넣는 방법
list = ['10', '20', '30']

with open ('test3.csv', 'w') as f: # 별도의 파일 만듦.
    f.write(','.join(list))

4. 예외 처리

# 예외코드 작성 1
try:
    x = int(input('10을 나눌 숫자를 입력하세요. '))
    y = 10 / x
    print(y)
except:
    print('예외가 발생했습니다.')
    
> 출력
나눌 숫자를 입력하세요. 4
2.5

10을 나눌 숫자를 입력하세요. ㅏ
예외가 발생했습니다.
# 예외코드 작성 2
y = [10, 20, 30]

try:
    index, x = map(int, input('나눌 숫자를 입력하세요.: ').split(',')) # 숫자 2개 입력받는데
    print(y[index]/x) # 첫번째 숫자는 y list의 인덱스 위치로 들어가고, 하나는 나눌 수로 들어감.
except:
    print('오류입니다.')
    
> 출력
나눌 숫자를 입력하세요.: 1, 2
10.0

나눌 숫자를 입력하세요.: 2, 4
7.5

나눌 숫자를 입력하세요.: ㅇ
오류입니다.
# 예외코드 작성 3
y = [10, 20, 30]

try:
    index, x = map(int, input('나눌 숫자를 입력하세요.: ').split(','))
    print(y[index]/x)
except ZeroDivisionError: # 숫자를 0으로 나눴을때 나오는 오류를 처리하는 기능
    print('숫자를 0으로 나눌 수 없습니다.')
except IndexError: # 없는 인덱스를 입력했을 때 나오는 오류를 처리하는 기능
    print('잘못된 인덱스입니다.')

> 출력
10을 나눌 숫자를 입력하세요. 4
2.5
계산 성공!!!

10을 나눌 숫자를 입력하세요. 0
예외가 발생했습니다.
# 예외코드 작성 4
try:
    x = int(input('10을 나눌 숫자를 입력하세요. '))
    y = 10 / x
    print(y)
except:
    print('예외가 발생했습니다.')
else:
    print("계산 성공!!!")
finally: # 무조건 작동하는 코드
    print("코드 실행이 종료되었습니다.")

> 출력
10을 나눌 숫자를 입력하세요. 4
2.5
계산 성공!!!
코드 실행이 종료되었습니다.

10을 나눌 숫자를 입력하세요. ㄴ
예외가 발생했습니다.
코드 실행이 종료되었습니다.
# 임의의 에러 만들기
try:
    x = int(input('10을 나눌 숫자를 입력하세요. '))
    y = 10 / x
    raise # 에러 발생시키는 기능
    print(y)
except:
    print('예외가 발생했습니다.')
else:
    print("계산 성공!!!")
finally: # 무조건 작동하는 코드
    print("코드 실행이 종료되었습니다.")
    
> 출력
10을 나눌 숫자를 입력하세요. 5
예외가 발생했습니다.
코드 실행이 종료되었습니다.

<참고 자료>

  • [오즈스쿨 스타트업 웹 개발 초격차캠프 백엔드 Python 강의]

<후기>

임시 글로 저장해 놓은지 어연 5개월이나 된 것을 이제서야 작성을 완료 했다.ಥ
부트 캠프에서는 당일 교육 진도 나가느라 정신이 없었고 python 배울 땐 강의에서 예제 위주의 수업이었기 때문에 개념 정리를 할 생각을 못했었다. (핑계처럼 보이겠지만,,,(⊙
⊙;)

그래도 이렇게 임시 글 털이를 해서 속이 시원하다!

profile
백엔드 코린이😁

0개의 댓글