본문 바로가기
관리자

Programming-[Backend]/Python

파이썬 기본 - 4. 입력과 출력, 클래스, 모듈, 패키지, 예외처리, 내장/외장 함수

728x90
반응형

1. 입력

input()

파이썬에서 값을 입력받을 수 있는 내장함수는 input()이다.

number = input("숫자를 입력하세요: ")

print(number)

open(), write(), close()

파일을 생성하고, 입력하고, 저장하고, 닫는 함수는 각각 open(), write(), close()이다. open 함수의 두번째 인자값은 파일을 열고 입력 모드를 결정하는 인자인데, 'w'는 입력모드, 'r'은 읽기모드, 'a'는 파일의 마지막에 새로운 내용을 추가할 때 사용하는 추가모드이다.

파일은 open을 했으면 항상 close를 해주어야 문제가 발생하지 않는다. 다만 두번째 코드와 같이 with...as 구문을 사용하면 따로 close를 하지 않아도 된다.

file = open("C:/Temp/새파일.txt", "w", encoding="UTF-8")
for i in range(1,11):
    data = "%d번째 줄입니다.\n" % i
    file.write(data)
file.close()
with open("C:/Temp/새파일.txt", "w", encoding="UTF-8") as file: #with 구문 적용
    for i in range(1,11):
        data = "%d번째 줄입니다.\n" % i
        file.write(data)
#file.close() 생략

결과 파일


읽기모드
읽기모드에서는 read(), readline(), readlines() 메서드로 한 줄씩 파일을 읽어들일 수 있다.

file = open("C:/Temp/새파일.txt", "r", encoding="UTF-8")
lines = file.readlines()
for line in lines:
    print(line)
file.close()


추가모드
기존 파일의 내용에 내용을 추가하고 싶다면 추가모드로 입력해야한다.

file = open("C:/Temp/새파일.txt", "a", encoding="UTF-8")

for i in range(11, 20):
    data = "%d번째 줄입니다. \n" % i
    file.write(data)
file.close()



2. 클래스

클래스 사용하기


반복되는 변수와 메서드를 미리 정해놓은 틀이라고 정의한다. 객체 지향적 프로그래밍에서의 객체 개념이다. 단순히 함수만으로 어떤 기능을 구성한다면, 여러 개가 필요할 때 같은 함수를 여러 번 작성해야하는 번거로움이 발생할 수 있다. 따라서 클래스를 사용하여 인스턴스를 반복적으로 생성할 수 있도록 만든다.

result1 = 0
result2 = 0

def add1(num):
    global result1
    result1 += num
    return result1

def add2(num):
    global result2
    result2 += num
    return result2

print(add1(3))
print(add1(4))
print(add2(3))
print(add2(4))


-> 클래스 형태로 변경 : Calculator를 재활용할 수 있게 된다. 클래스는 class 라는 키워드로 작성하며, 이름은 맨 앞 글자를 대문자로 작성하는 것이 규칙이다.

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator()
cal2 = Calculator()

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(4))



self, __init__(생성자)의 개념

self는 만들어질 인스턴스를, __init__은 생성자를 가르킨다. 아래 예제에서 a는 FourCal 클래스의 인스턴스이다. 이 인스턴스 자체가 FourCal 함수에서 명명하는 self이다. __init__은 자바에서의 생성자와 같다. def로 정의하는 것은 메서드와 같고, 대신 앞뒤로 언더바(_)를 두 개씩 넣어준다.

class FourCal:

    def __init__(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result


a = FourCal(1,2)
print(a.add()) # 3


클래스 상속

부모 클래스 - 자식 클래스로 상속하는 개념 자체는 자바에서의 상속과 같다. 코드 작성법이 약간 다를 뿐이다.

클래스의 인자로 부모 클래스를 넣어주면된다.

class FourCal:

    def __init__(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

class MoreFourCal(FourCal):
    pass


a = MoreFourCal(1,2)
print(a.add())


자바와 다른 점은 super()를 사용하지 않더라도 자식클래스에도 자동으로 부모 클래스의 생성자를 받는다. 변수 추가가 필요하다면 자바처럼 super()를 쓰거나 메서드를 오버라이딩하면 된다.


3. 모듈과 패키지

모듈 import

모듈은 from ... import ... 또는 import로 사용하는 미리 작성해놓은 .py 파일을 말한다.

mod1.py 파일을 작성해놓고, main.py에서 import 한 뒤 main.py를 실행하면 mod1.py가 바로 실행되는 것과 같다.

#mod1.py
def add(a,b):
    return a + b

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

print(add(1,4))
print(sub(4,2))
#main.py
import mod1


만약 이런 결과를 원하지 않는다면, 아래 처럼 __name__ 메서드를 정의하여 특정 이름의 함수일때만 실행되도록 할 수 있다.

#mod1.py
def add(a,b):
    return a + b

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

if(__name__ == "__hello__"): #mod1를 import하는 모듈의 이름이 hello.py 일때만 실행된다.
    print(add(1,4))
    print(sub(4,2))

다른 경로 모듈 import

같은 경로에 모듈들이 있으면 단순 import로 불러올 수 있지만, 만약 다른 경로에 모듈이 있다면 sys.path에 모듈을 추가해줘야 import가 가능하다.

#main.py
import sys
sys.path.append("C:\\Users\chang\PycharmProjects\....")
import mod1
print(mod1.add(3,4))


패키지

패키지는 모듈을 여러 개 모아놓은 것을 의미한다. 만약 아래와 같이 game 이라는 패키지가 있는 구조라면, import를 할 때 package의 경로를 작성해주어야한다. 모듈을 불러올 때와 마찬가지로 구체적으로 불러오면 성능상 유리하고 함수를 사용하기도 편하다.

import mod1
# import game.sound.echo
# from game.sound.echo import echo_test #구체적으로 불러오기
from game.sound.echo import echo_test as e #별칭 지어서 불러오기

# game.sound.echo.echo_test()
# echo_test()
e()


__all__
만약 어떤 패키지 내부에 있는 모든 모듈을 불러오고 싶다면 * 키워드로 import 하면 된다. 다만, 불러와질 모듈의 __init__.py 안에 * 키워드를 썼을 때 어떤 메서드를 불러올지를 __all__에 정의해야만 한다.

hello.py에서 game/sound에 있는 echo.py를 참조하기 위해서 game/sound/__init__.py에 __all__에 echo 클래스를 추가해주었다. 이렇게 하면 game.sound import *로 해당 패키지가 호출되었을 때 어떤 클래스를 참조할 지를 지정한다.

#hello.py
from game.sound import *
echo.echo_test()
#game/sound/__init__.py
__all__ = ['echo']


상대참조
import 구문에 ..을 입력하여 상위 디렉토리로 이동하여 상대참조 방식으로 import를 할수도 있다.

from ..sound.echo import echo_test

def render_test():
    print("render")
    echo_test()



4. 예외처리


파이썬에서의 예외처리 기본 코드 형식은 try-except 구문을 사용한다.

try:
 #오류가 발생할 수 있는 구문
except Exception as e:
 #오류 발생 시 처리 구문
else:
 #오류가 발생하지 않았을 때 처리 구문
finally:
 #맨 마지막에 무조건 실행할 구문


예외 처리 예시 코드

try:
    f = open("없는 파일", "r")
except FileNotFoundError as e:
    print(str(e), "###존재하지 않는 파일입니다.")
else:
    data = f.read()
    print(data)
finally:
    f.close()


except 구문을 여러 개 나눠서 작성하여 여러 에러를 처리할 수도 있다.

try:
    f = open("없는 파일", "r")
except FileNotFoundError as e:
    print(str(e), "###존재하지 않는 파일입니다.")
except ModuleNotFoundError as me:
    print("존재하지 않는 모듈")
else:
    data = f.read()
    print(data)
    f.close()


raise
'raise {에러 이름}' 구문을 통해 일부러 에러를 만들 수도 있다. 아래 예시에서 Bird는 상속받는 경우 fly 메서드를 반드시 오버라이드 하도록 정의한 것이다. 그렇지 않으면 raise 구문에 의해서 NotImplementedError가 발생한다. 마치 자바에서의 인터페이스와 같다.

class Bird:
    def fly(self):
        raise NotImplementedError

class Eagle(Bird):
    def fly(self):
        print("very fast")

eagle = Eagle()
eagle.fly()



5. 추가적으로 알아두면 좋을 내장, 외장함수

내장함수


all() : 전부 참이면 True
any() : 하나라도 참이면 True
dir() : 해당 클래스에서 사용할 수 있는 메서드 반환 ex) dir([1,2,3]) -> append, count 등 메서드 이름 리스트 반환
enumerate() : 리스트를 딕셔너리 형태로 반환
filter(조건, 리스트) : 조건에 해당하는 값들만 반환
map() : 각 요소가 수행한 결과를 반환
list() : 튜플 등을 list로 변환
str() : 문자열로 변환
zip() : 자료형을 묶어준다. ex) list(zip([1,2,3], [4,5,6])) -> [(1,4), (2,5), (3,6)]

외장함수


pickle : 객체를 바로 파일로 저장하거나, 파일을 객체로 꺼내올 수 있게 해준다.

import pickle
f = open("test.txt", 'wb')
data = {1: 'python', 2: 'you need'}
pickle.dump(data, f)
f.close()


time : 시간 관련 외장함수이다.

import time
print(time.time())
#1970년 1월 1일부터 지금까지 소요된 초

print(time.localtime(time.time()))

time.sleep(1)


random : 임의값을 얻을 수 있는 외장함수

import random
lotto = sorted(random.sample(range(1, 46) , 6))
print(lotto)


참조


1. 유튜브 조코딩 채널 - 최신 파이썬 코딩 무료 강의
https://www.youtube.com/watch?v=KL1MIuBfWe0

728x90
반응형