[패스트캠퍼스python] 예외처리

파이썬 인강 : 예외처리

완벽한 코딩은 없다. 여러 사람이 함께 작업한다한들 예외는 언제든지 나타날수있다
만약 미세한 코딩으로인해 수백명이 결제하는 회사 시스템에 예외가 발생해버린다면 그 손해는 막심할 것이다.

1. 예외 종류

  • SyntaxError
  • TypeError
  • NameError
  • IndexError
  • ValueError
  • KeyError.. 등등

요즘은 문법적으로 에러는 없지만 코드 실행(런타임) 프로세스에서 발생하는 예외 처리가 중요하다
에디터에서 linter가 문법적인 에러를 잡아주기때문에 걱정없지만 런타임에서 발생하는 에러에 주의해야한다

항상 예외가 발생하지 않을 것으로 가정하고 먼저 코딩
그 후 런타임 예외 발생 시 예외처리 권장(EAFP 코딩 스타일)

1. SyntaxError : 잘못된 문법

문법적인 에러는 보통 linter가 잡아준다

1
2
3
4
5
print('test)     # ' 누락

if True # : 누락
pass
x => y # 작거나 같다는 >=로 해야함

2. NameError : 참조 변수 없음

1
2
3
a = 10
b = 15
print(c) # 예외 발생

3. ZeroDivisionError : 0 나누기 에러

모든 언어에 있는 에러이고 런타임에서 발생하는 에러이기에 중요하다

1
print(10 / 0)

4. IndexError : 인덱스 범위 오버

자주 발생하는 에러

1
2
3
4
5
6
7
8
9
x = [10, 20, 30]

print(x[1])
print(x[3]) # 예외 발생
print(x.pop())
print(x.pop())
print(x.pop())
print(x.pop()) # 예외 발생
print(x.pop(50)) # 예외 발생

5. KeyError

주로 딕셔너리에서 나오는 에러이다

1
2
3
dic = {'name': 'Kim', 'Age': 33, 'City': 'Seoul'}

print(dic['hobby']) # 키가 존재하지 않으면 예외

이런 에러를 방지하기 위해 get매서드를 사용하면 좋다

1
print(dic.get('hobby')) # 안전

6. AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용시에 예외

1
2
3
4
x = [1, 2, 3]
print(x.append(4))
print(x)
print(x.add(10))

출력값은

list는 add가 없기에 AttributeError발생한다

7. ValueError : 참조 값이 없을 때 예외

1
2
3
4
t = (10, 100, 1000)

print(t.index(100))
print(t.index(7)) # 예외 발생

8. FileNotFoundError

외부파일을 불러와서 처리할때 자주 발생

터미널에 보면 디렉토리 내에 찾을 수 없다고 나온다

9. TypeError : 자료형에 맞지 않는 연산을 수행 할 경우

1
2
3
4
5
6
x = [1, 2]
y = (1, 2)
z = 'test'

print(x + y) # 예외 발생(튜플과 리스트를 결합할수없다 -> 그래서 형변환이 중요)
print(sum([1,2,3],10,1)) # 예외 발생(자료형불일치)

2. 예외 처리 기본

아래 예외 처리는 기본중의 기본이므로 꼭 알아둬야한다.

1
2
3
4
5
6
try               에러가 발생 할 가능성이 있는 코드 실행
except 에러명1: 에러가 발생하면 여기서 처리(여러 개 가능)
except 에러명2:
except 에러명3:
else: try 블록의 에러가 없을 경우 실행
finally: 항상 실행

이를 활용한 예시

1
2
3
4
5
6
7
8
try:
z = 'Kim' # 'Cho' 예외 발생
x = name.index(z)
print('{} Found it! {} in name'.format(z, x + 1))
except: # 모든 에러를 처리(Exception)
print('Not found it! - Occurred ValueError!')
else:
print('ok! else!')

ITWILL : 아이디와 비번입력, 새로고침location.reload(), 주석한번에 단축키, switch문 출력문 한줄리팩토링

ITWILL학원 : 5강 JS기초 BY 정규태강사

1.아이디와 비번체크

location.reload()는 새로고침의 역할을 한다

  1. 아이디와 비번을 존재유무 동시에 체크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const id = "itwill001"
const pw = "it8030909"
let inputId = prompt("아이디를 입력하세요", "")
let inputPw = prompt("비밀번호를 입력하세요", "")

if(id === inputId){
if(pw === inputPw){
alert(inputId+"님 환영합니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
  1. 아이디 존재유무 먼저 체크후 비번 체크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const id = "itwill001"
const pw = "it8030909"
let inputId = prompt("아이디를 입력하세요", "")

if(id === inputId){
if(pw === inputPw){
alert(inputId+"님 환영합니다")
let inputPw = prompt("비밀번호를 입력하세요", "")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}

DB를 쓰면 알게되겠지만 2번방법은 아이디한번 비번한번 두번을 가져와야해서 비효율적이다
1번을 사용하는 것을 권장한다

  1. html내에서 id로 가져와서 로그인페이지 완성
    내가 궁금해져서 네이버처럼 로그인페이지를 만들어봤다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<img src="https://lh3.googleusercontent.com/proxy/kn4y-1fat85W8voylUnkZF1DBTCAwtNwaTwxKJZ-GYiWk83N6rAd2fKqIzdaPSSZKupHKxA-xyZttfXhyO6EQHKxEQ2NTEeByNqAEZaCdJScbyZcUB3nak6TlxWlKv_lRgwfZtY8gWCwjusDnUmRThBUCTYf7ElOwOvnnj772zC02yDGOB5uI-B4rkSeKZjcw0i6FpG3xsATsSvDIw4A28QN"
width=100%, height=100%>
<input id="id" type="text" size="40px" placeholder="아이디를 입력하세요"><p>
<input id="pw"type="text" size="40px" placeholder="비밀번호를 입력하세요"><p>
<button id="login"> 로그인 </button><p>
<input type="checkbox" checked>항상 아이디 기억하기


<script type="text/javascript">

let id = document.querySelector('#id');
let id = document.querySelector('#id');
let loginbtn = document.querySelector('login')

loginbtn.addEventListener('click', ()=>{
console.log(id, pw)

if( id === "it"){
if(pw === "321"){
alert(id1 + "님, 반갑습니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
})

querySelector로 input태그 ID와 PW를 가져오려고 했으나 “존재하지 않는 회원입니다”라는 에러만 겁나 났다

querySelector가 안되는 이유는 Jquery태그를 추가해야한다고했다

그래서 다른 방법인 getElementById()로 진행해봤다.

  1. getElementById(‘id’)만 가지고 왔는데도 전혀 입력값을 가져오지못했고 “존재하지 않는 회원입니다”라는 에러
  2. getElementById(‘id’).value : 그래서 value를 끝에 추가했지만 그래도 가져오지 못했다
    왜지….
  3. 알고보니 결국 스코프 문제였다 addEventListener안에 넣었더니 정상적으로 실행되었다 뿌듯!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<img src="https://lh3.googleusercontent.com/proxy/kn4y-1fat85W8voylUnkZF1DBTCAwtNwaTwxKJZ-GYiWk83N6rAd2fKqIzdaPSSZKupHKxA-xyZttfXhyO6EQHKxEQ2NTEeByNqAEZaCdJScbyZcUB3nak6TlxWlKv_lRgwfZtY8gWCwjusDnUmRThBUCTYf7ElOwOvnnj772zC02yDGOB5uI-B4rkSeKZjcw0i6FpG3xsATsSvDIw4A28QN"
width=100%, height=100%>
<input id="id" type="text" size="40px" placeholder="아이디를 입력하세요"><p>
<input id="pw"type="text" size="40px" placeholder="비밀번호를 입력하세요"><p>
<button id="login"> 로그인 </button><p>
<input type="checkbox" checked>항상 아이디 기억하기

<script type="text/javascript">

let loginbtn = document.getElementById('login')

loginbtn.addEventListener('click', ()=>{
let id = document.getElementById('id').value;
let pw = document.getElementById('pw').value;
console.log(id, pw)

if( id === "it"){
if(pw === "321"){
alert(id1 + "님, 반갑습니다")
}else{
alert("비밀번호가 일치하지 않습니다")
location.reload();
}
}else{
alert("존재하지 않는 회원입니다.")
location.reload();
}
})

2. JS주석 한번에 단축키

  • ctrl + shift + / : 한번에 주석설정
  • ctrl + shift +\ : 한번에 주석제거

3. switch문 출력문 한줄 리팩토링

입력받은 정보를 가지고 학점을 나타내는 switch문을 만들어보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
let score = prompt('점수를 입력하시면 학점이 계산됩니다')

switch (Math.floor(score/10)){
case 10 :
case 9 :
document.write("A학점")
break;
case 8 :
document.write("B학점")
break;
case 7 :
document.write("C학점")
break;
case 6 :
document.write("D학점")
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
document.write("F학점이라니")
break;
default : document.write("0~100사이의 점수를 입력하세요")
}

자세히보면 반복되는 출력문이 보인다
이걸 리팩토링해보자
아주 간단하다! 변수만 만들어주면 된다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//switch case 출력문 한번쓰기
document.write('<hr>')
let score = prompt('점수를 입력하시면 학점이 계산됩니다')
let grade = ""; //변수만들기

switch (Math.floor(score/10)){
case 10 :
case 9 :
grade ="A"
break;
case 8 :
grade ="B"
break;
case 7 :
grade ="C"
break;
case 6 :
grade ="D"
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
grade ="F"
break;
default : document.write("0~100사이의 점수를 입력하세요")
}
document.write(grade + "학점")

[ITWILL : java]Scanner라이브러리와 equals()를 이용한 사칙연산계산기, if문과 switch문 변환 예시, 반복문과 break

ITWILL학원 : 3강 JAVA BY 윤미영강사

1. Scanner 라이브러리

기능 : 키보드로부터 데이터를 받아온다.
java.util 패키기에 있는 중요한 라이브러리이므로 사용법은 암기필수.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1. 선언
import java.util.Scanner;
// import라는 예약어는
// 단축키는 ctrl + shift + O 누르면 자동으로 import 생성됨

Scanner sc = new Scanner(System.in);
// 의미는 나는 이제부터 스캐너라이브러리를 변수명(ex: sc)이라는 이름으로 불러서 사용하겠다는 의미
// System.in 자바의 표준입력으로 키보드를 의미한다. 즉 키보드로부터 데이터를 받아오겠다라는 의미

System.out.println("단어를 입력하세요");


//2. 변수 s에 저장
String s = sc.next();
// 콘솔창에 입력한 것들이 변수 s에 저장된다.


//3. 출력
System.out.println(s);


//4. 예시
System.out.println("이름을 입력해주세요");
String s = sc.next();

System.out.println("연락처를 -없이 입력해주세요");
int i = sc.nextInt();

System.out.println("입력하신 "+ s +"님의 휴대폰번호 0"+ i +" 가 맞습니까?");

다른 명령어들은 아래와 같다

1
2
3
4
5
6
7
8
sc.nextInt()
//키보드로부터 정수데이터를 가지고 옴

sc.next()
//키보드로부터 string(한단어)를 가지고 옴

sc.nextLine()
//키보드로부터 string(공백을 포함한 한줄전체)를 가지고 옴

2. Scanner 라이브러리를 이용한 사칙연산계산기 만들기

처음 떠오른 코드는 아래와 같다.

1
2
3
4
5
6
7
8
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int convertOper = int(operator);
int data2= sc.nextInt();

System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + convertOper+ data2)+"입니다")

그런데 string으로 연산자를 받으니까 연산이 되지않으니까 int로 형을 바꿀려고했는데 Cannot cast from String to int 에러가 났다.

사칙연산자들의 데이터타입이 무엇인지 구글링했는데 그래도 잘 모르겠어서
강사님께 여쭈어보니 string을 int로 받아도 해결할 수 없다고 한다.

if문을 써서 equals()를 쓰는게 낫다고 했다
equals()를 어떻게 쓰는지 찾아본 뒤 바로 적용해보았다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int data2= sc.nextInt();

if("+".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + data2)+"입니다");
}else if("-".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 - data2)+"입니다");
}else if("*".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 * data2)+"입니다");
}else if("/".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 / data2)+"입니다");
}else{
System.out.println("또 잘못입력함? 다시 입력해주세요")
}

작동 잘된다! 역시 가르쳐주는 사람이 있으니까 좋다
switch문으로 바꾸어보자

1
2
3
4
5
6
7
8
9
10
11
switch(operator){
case "+" : System.out.println("덧셈결과는 " + (data1+data2));
break;
case "-" : System.out.println("뺄샘결과는 " + (data1-data2));
break;
case "*" : System.out.println("곱셈결과는 " + (data1*data2));
break;
case "/" : System.out.println("나눗셈결과는 " + (data1/data2));
break;
default : System.out.println("또 잘못입력함? 다시 입력해주세요");
}

3. 제어문 종류

  • 조건문
    • if(조건문)
    • switch(값)
  • 반복문
    • for(반복횟수)
    • while(조건식)

4. 조건문 : Switch문

정수식안에는 변수, 숫자, 문자, 조건들이 들어갈 수 있다.
case안의 값에는 and연산자, Boolean, 실수는 아예 들어갈 수 없다.
break;문이 없을 경우 다음 break;를 찾을때까지 모든 문장을 실행한다.
default문은 가장 마지막 작업으로 위의 case 이외의 값인 경우 default문은이 출력되고 Switch문은 끝난다

1
2
3
4
5
6
7
8
9
switch( 정수식 ){ //숫자,문자
case 값 : 출력값1;
break;
case 값 : 출력값2;
break;
case 값 : 출력값3;
break;
default : 출력값4;
}

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

switch(season){
case "spring" :
System.out.println("봄 사랑 벚꽃 말고 by 아이유");
break;
case "summner" :
System.out.println("party by 소녀시대");
break;
case "autumn" :
case "fall" :
System.out.println("11:11 by 태연");
break;
case "winter" :
System.out.println("Santa tell me by Ariana grande");
break;

default : System.out.println("잘못입력하셨거나 스페..펠..ㄹ..잉 틀리셨나봐요?");
}

5. 조건문 : switch문과 if문 비교

임의의 노래방 점수를 터미널에 입력하면 점수대별로 아래 문구를 출력하고싶다.

100점의 문구 : 실화냐? 가수다! 가수가 나타났다!

80 ~ 99점의 문구 : 노래실력이 아주 좋으신데요~

40 ~ 79점의 문구 : 매력이~ 넘쳐요

40점미만의 문구 : 노ㄹ..아니 박수실력이 나날이 늘어가네요!
그외의 점수들 : 잘못된 숫자를 입력하셨습니다.다시 입력해주세요

  1. if일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Scanner sc = new Scanner(System.in);
    System.out.println("점수를 입력하세요");
    int inputScore = sc.nextInt(10);

    if (inputScore == 100){
    System.out.println("WOW " + inputScore + "점 실화냐? 가수다! 가수가 나타났다!");
    }else if(inputScore >= 80 && inputScore < 100 ){
    System.out.println(inputScore + "점! 노래실력이 아주 좋으신데요~");
    }else if(inputScore >= 40 && inputScore < 80 ){
    System.out.println("내 노래 점수는 " + inputScore + "점! 매력이~ 넘쳐요");
    }else if(inputScore < 40 && inputScore >= 0){
    System.out.println(inputScore + "점! 노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    }else{
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }
  2. switch일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    switch(inputScore/10){
    case 10 :
    System.out.println("100점 실화냐? 가수다! 가수가 나타났다!");
    break;
    case 9 :
    case 8 :
    System.out.println("노래실력이 아주 좋으신데요~");
    break;
    case 7 :
    case 6 :
    case 5 :
    ystem.out.println("매력이~ 넘쳐요");
    break;
    case 4 :
    case 3 :
    case 2 :
    case 1 :
    System.out.println("노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    break;
    default :
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }

6. 반복문 : for문

for문의 기본은 아래와 같다

1
2
3
for(int i=0; 조건식; 증감식){
출력값
}

간단한 예시를 보면서 어떻게 컴파일이 되는지 순서를 보자

1
2
3
for(int i=1; i<10; i++){
System.out.println("Hi");
}
  1. 조건문 확인 : i는 1이고 10보다 작다 ->true
  2. 괄호안의 코드출력
  3. 증감식 확인 : 이제 i는 2
  4. 조건문 확인 : i는 2이고 10보다 작다 ->true
  5. 괄호안의 코드출력
  6. 증감식 확인 : 이제 i는 2
  7. 계속반복
  8. 조건문 확인 : i는 10이고 10보다 작다 -> false
  9. for문 종료

7. 반복문 : break

반복문에서 break를 사용하면 반복문이 바로 종료된다.

구구단 3단 예시를 들어보자

1
2
3
4
5
6
7
8
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27,

출력값의 마지막 컴마를 없애고 싶다.
어떻게 하면 좋을까? if와 break를 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==9){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27

break를 입력하면 if조건이 만족되는 순간 바로 반복문이 종료된다
아래 예시는 구구단 3단 나타내지만 if조건문을 5까지 입력했다
3*5까지 진행하는 구구단이다.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==5){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15

x가 6,7,8,9가 남았지만 if조건을 만족하고 break때문에 반복문이 종료된다.

[패스트캠퍼스python] 파일 읽기

파이썬 인강 : 파일 읽기

txt파일로 읽거나 쓸 줄 알아야 어플리케이션을 만들었을때 중요한 데이터(결과값)을 저장해놓을 수 있다

  • 읽기 모드 r
  • 쓰기 모드 w : 기존 파일 삭제
  • 추가 모드 a : 파일 생성 또는 추가
  • 상대 경로(‘../‘, ‘./‘)
  • 절대 경로 확인(‘C:...’)

참고 링크

중요한 데이터.txt 파일을을 어떻게 읽을 수 있을까?

1. open()과 close() 방법

파일을 열때는 open()을 사용하고 읽어올 것이기때문에 r을 쓰면 된다
open()했으면 반드시 close 리소스 반환해줘야한다. 즉 close()로 꼭 문 닫아줘야한다.
한 번 사용한 리소스를 꼭 닫아줘야한다.

1
2
3
4
5
f = open('./resource/중요데이터.txt', 'r')
contents = f.read()
print(contents)

f.close()

2. with open()방법

파이썬에서는 open()해놓고 close()는 하지않아도 되는 방법이 있다
바로 with문!

1
2
3
4
5
with open('./resource/중요한데이터.txt', 'r') as f:
c = f.read()
print(iter(c)) #iterator함수로 변환하여 for문에서 사용가능
print(list(c)) #리스트형변환가능
print(c)

read는 전체 내용 읽어준다 ex) read(10) : 10글자 읽기

3. with문과 for문 활용

1
2
3
with open('./resource/중요한데이터.txt', 'r') as f:
for c in f:
print(c)

with문과 for문 출력값

출력값을 보면 한 줄씩(line단위) 출력해준다
한줄씩 뛰어쓰기되어 나오는 것은 끝에 |n이 들어가있기때문이다
제거해주려면 어떻게 하면 될까?

1
2
3
with open('./resource/중요한데이터.txt', 'r') as f:
for c in f:
print(c.strip())

|n 입력후 출력

|n을 strip()으로 제거해주면 가독성 좋게 출력된다
위의 출력이미지와 아래의 출력이미지를 보면 가독성이 좋아진 것을 알 수 있다

4. read VS readline VS readline(문자수) VS readlines

  • read : 처음글자부터 끝까지 전체를 다 읽기. read()가 끝나고 나면 커서가 맨 마지막 글자에 있기때문에 한번 출력 후 read()를 또 출력하면 빈 내용이 출력된다
  • readline : 한 줄씩 읽기
  • readline(문자수) : 문자수 읽기
  • readlines : 전체 읽은 후 라인 단위 리스트 저장

응용한 예시를 함께보자
아래 이미지파일과 같은 score.txt파일이 있고 안의 내용의 평균을 for line in으로 구해보자

score.txt파일

1
2
3
4
5
6
7
8
9
10
11
with open('./resource/score.txt', 'r') as f:
score = []
for line in f:
score.append(int(line))
print(score)
print('Average : {:6.3f}'.format(sum(score) / len(score)))
#{6자리고 소수셋째자리까지라는 의미}

# 출력값
[95, 78, 92, 89, 100, 66]
Average : 86.7

5. 파일 쓰기

  1. 빌트인패키지인 random을 이용해서 파일을 써보자
    로또번호와 비슷하게 6개 랜덤번호를 출력하는 예제이다.
1
2
3
4
5
6
7
from random import randint
#랜덤파일로부터 randint함수를 가져와라는 뜻

with open('test2.txt', 'w') as f:
for cnt in range(6): # range(6)은 0~5까지임.
f.write(str(randint(1, 50))) # 1부터50까지
f.write('\n')
  1. writelines : 리스트 -> 파일로 저장

    1
    2
    3
    with open('test3.txt', 'w') as f:
    list = ['Kim\n', 'Park\n', 'Lee\n']
    f.writelines(list)
  2. print로 바로 저장하는 예제이다

    1
    2
    3
    with open('./resource/test3.txt', 'w') as f:
    print('Test Contents!', file=f)
    print('Test Contents!!', file=f)

[패스트캠퍼스python] 모듈과 패키지

파이썬 인강 : 모듈과 패키지

우리가 알게 모르게 사용하고 있었던 모듈에 대해 배워보자

모듈과 패키지

가장 중요한 점은 왜 패키지로 개발/배포/사용해야하는지 그 이유를 명확히 알아야 한다는 점이다.

  • 모듈 : 파일 하나하나가 모듈. 독립적인 파일
  • 패키지 : 모듈들을 파일형태로 관리하는 것을 패키지리고 한다

참고로

  • .. : 부모 디렉토리 이동
  • . : 현재 디렉토리 이동

아래 두가지 파일을 이용해서 모듈과 패키지에 대해 공부해보자
fibonacci.py는 피보나치수열 만드는 파일이다.

fibonacci.py

calculations.py는 아래와같은 세가지의 함수를 가지고 있다

calculations.py

1. 클래스를 가져와서 사용하는 방법

클래스를 가져올 수 있다

  1. 일반적인 방법
1
2
3
4
5
6
7
8
9
10
11
from pkg.fibonacci import Fibonacci #클래스명(fibonacci)

Fibonacci.fib(10)

print("ex1 : ", Fibonacci.fib2(20))
print("ex1 : ", Fibonacci().title) #인스턴스화

# 출력값은
0 1 1 2 3 5 8
ex1 : [0, 1, 1, 2, 3, 5, 8, 13]
ex1 : fibonacci

피보나치수열이 잘 출력되었음을 알수있다.

  1. *을 사용한 방법
    메모리를 많이 사용하기때문에 권장하지 않는 방법이지만 알아둬야한다

별을 이용한 방법

*는 모든 리소스를 다 가져오는 것을 뜻한다.
터미널을 보면 피보나치 수열이 잘 나타남을 확인할 수 있다

  1. as 사용하는 방법
    권장하는 방법으로 계속 class fullname을 사용하는 것보다 가독성이 높기때문이다.
    as는 Alias(엘리아스)의 약자로 별칭이란 뜻이다.
1
2
3
4
5
6
7
8
9
10
11
from pkg.fibonacci import Fibonacci as fb

fb.fib(50)

print("ex3 : ", fb.fib2(60))
print("ex3 : ", fb().title)

# 출력값
0 1 1 2 3 5 8 13 21 34
ex3 : [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
ex3 : fibonacci

2. 함수를 가져와서 사용하는 방법

  1. import + as 조합
    이번에는 클래스말고 함수를 가져와 사용해보자.

import와 as 조합

클래스를 가져왔던 것과

  1. from + import + as 조합
    권장하는 방법으로 모듈의 많은 함수들 중에서 필요한 함수만 가져와서 쓸수있다
    어떠한 언어를 다루던 리소스를 낭비하지 않도록 명확히 코딩하는 것이 좋다
1
2
3
4
5
6
from pkg.calculations import div as d

print("ex5 : ", int(d(100,10)))

# 출력값은
ex5 : 10

3. builtins(빌트인)

1
2
3
import builtins

print(dir(builtins))

출력값이 너무 길어서 이미지파일로 준비했다

builtins 출력값

우리가 빌트인인지 모르고 사용했던 list함수, type함수등이 들어가 있는 것을 확인할 수 있다

4. __init__.py의 필요성

용도 : 해당 디렉토리가 패키지임을 선언할 때 사용한다.
Python 2.x대를 사용하고 있다면 __init__.py가 필수이다
Python3.x : 파일이 없어도 패키지 인식하지만 3.x보다 하위 버전 호환 위해서 생성하는 것이 안전

5. 단위테스트

독립적으로 만든 파일이 독립적으로 잘 실행되는지는 확인하기 위해서 아래 if name문을 써준다
아래 형태로 쓰도록 딱 정해놓았다.
만든함수()부분에 만들었던 함수들을 넣어 독립적으로 실행되는지 체크할 수 있다
if문이기때문에 import으로 가져온 파일에서는 출력이 안된다 GOOD!

1
2
3
4
5
# 단위 실행(독립적으로 파일 실행)
if __name__ == "__main__":
print("This is", dir())
만든함수()
만든함수()