👨🏻‍💻

ch1 - 2. 파이썬 구조 및 기초 - 2

2.1 반복문

Index

  1. while문
  1. for문
  1. break
  1. continue
  1. else
  1. 중첩 반복문
 

Turorial 1.1 while

 
a=1 while a<10 : print(a) a+= 1
 

while 문을 사용하면 코드를 반복해서 실행하지 않아도 됩니다.
while문은 조건이 참인 동안에 명령을 반복해서 수행합니다. 반복할 명령은 들여쓰기로 구분되며 조건이 거짓이면 들여쓰기로 구분되어 있는 반복 구문을 탈출합니다.
위의 예제에서 9를 출력하고 마지막 a+=1이 연산(할당연산)되면 a=10이 되어 조건이 거짓이 되므로 루프를 탈출 합니다. 다음 a의 값이 10이 된다는 것 잊지 마세요.
 
while문의 구조 while 조건문 : 수행할 문장1 수행할 문장2
 
반복문 순서도 (Flowchart)
while 문
notion imagenotion image
 

Turorial 1.1.1 무한반복 while, break

a=1 while True: print(a) a+=1 if a=9: break
위의 코드의 실행결과는 아래와 같습니다.
1 2 3 4 5 6 7 8 9
 
while 문의 조건을 부분에 bool형인 True가 오게 하면 반복문은 무한 반복되게 됩니다. 무한 반복하면 프로그램이나 서비스가 죽는 사태가 발생되기 때문에 조건을 탈출할 수 있는 구문을 중간에 입력하거나 메모리 공간을 확보할 쉬는 시간을 주어야 합니다.
여기서는 break 문으로 조건을 탈출하도록 설계하였습니다.

Tutorial 1.1.2 while, else

예시 1)
a=1 while a<3: print(a) a+=1 if a ==5: break else: print('good job')
위의 코드의 실행결과는 아래와 같습니다.
1 2 good job
 
예시 2)
a=1 while a<6 : print(a) a+=1 if a==5: break: else: print('good job')
위의 코드의 실행결과는 아래와 같습니다.
1 good job 2 good job 3 good job 4
else문은 다양하게 활용(특히 if문에서)됩니다. while문에서 else는 루프가 정상종료 되었을 때와 처음부터 while의 조건문이 False일 경우 실행됩니다. 위에 두번째 예제에서 a==5인 경우 break문을 만나면 else 문을 실행하지 않고 빠져나옵니다.
 

Tutorial 1.2 for

while 문은 '조건'을 가지고 반복을 실행할지를 판단했습니다. for문은 순서열을 순회하며 순서열의 끝에 도달하면 반복을 멈추게 됩니다.
for문은 객체를 처음부터 끝까지 하나씩 추출하며 순회하기 때문에 일반적으로 가장 많이 사용되는 반복문 입니다.
 
for x in(1,2,3): print(x)
위의 코드의 실행결과는 아래와 같습니다.
1 2 3
 
위의 코드를 실행하면 변수x 에는 튜플(1,2,3)의 요소가 순서대로 출력됩니다. 위 예제에서 튜플의 길이는 3이므로 for문 은 반복을 3번 수행합니다.
여기서 x는 앞에서 초기화 하지 않아도 작동합니다. while이 비교할 변수를 먼저 선언 해주는것에 비해 간편하고 직관적이기 때문에 자주 사용됩니다.
 
for 문의 구조 for (변수명) in (순회 가능한 객체) : 수행할 문장1 수행할 문장2
 
for 문의 범위로 사용되는 것은 시퀀스 자료형 자료 또는 반복 가능한 자료형이어야 합니다.
 
반복문 순서도 (Flowchart)
for 문
notion imagenotion image
 
1.String(문자열)을 범위로 지정한 예시
알파벳 = 'abc' for a in 알파벳 : print(a)
a b c
 
2.List(리스트)를 범위로 지정한 예
과일 = ['사과','바나나','포도'] for a in 과일: print(a)
사과 바나나 포도
 
3.Dictionary(사전)을 범위로 지정한 예
회원정보 = {'이름': '홍길동', '연락처':'0101111222', '주소':'서울시', '출생': '930101'} for a in 회원정보: print(a)
이름 연락처 주소 출생
 
위의 예제에서 Dictionary(사전)형 자료의 경우에는 key(키) 만을 가져오게 됩니다.
key(키)에 해당하는 value(값)또한 가져 오시고 싶으시다면 튜플 언패킹을 사용해 아래와 같이 사용할 수 있습니다.
for key,value in 회원정보.items(): print("{0}:{1}".format(key,value))
위의 결과는 아래와 같습니다.
이름:홍길동 연락처:0101111222 주소:서울시 출생:930101
위에 예시된 튜플, 리스트, 문자열 보다도 for 문에 가장 많이 사용되어지는 순서열은 range 로써 특정 값의 범위를 만들기 위해서 range함수를 사용할 수 있습니다. (*range는 2.x에서는 선언하는 즉시 list가 되었으나 3.x으로 넘어오면서 range는 list로 변환해주어야 list가 됩니다. 이는 2.x에서 썼었던 xrange와 같은 함수입니다.)
 
range 함수는 연속하는 수열을 만듭니다. range(시작 값 : 종료 값: 연속하는 두 수의 차)형식으로 선언되며 아래 예제를 보며 자세히 설명해 드리도록 하겠습니다.
 
시작 값: 0, 종료 값:5, 연속하는 두수의차 : 1
for a in range(0,5,1): print(a)
0 1 2 3 4
 
시작값 0과 멈춤값 5 사이의 연속하는 두수의 차 1을 가지고있는 요소들이 생성되었습니다. 생성된 range의 마지막 요소가 멈춤값 보다 한 단계 작다는 사실에 주의하세요.
 
시작 값:0, 종료 값: 10, 연속하는 두수의차: 2
for a in range(0,10,2): print(a)
0 2 4 6 8
 
시작 값 0과 종료 값 10 사이의 연속하는 두수의 차 2를 가지고 있는 요소들이 생성되었습니다.
생성된 레인지의 마지막 요소가 종료 값보다 한 단계 작다는 사실에 주의하세요. range()함수의 마지막 매개변수인 연속하는 두 수의 차는 생략할 수 있습니다. 생략할 시 연속하는 두수의 차는 1입니다.
 
시작 값:0,종료 값: 5, 연속하는 두수의 차:생략
for a in range(0,5): print(a)
위 결과값은 아래와 같습니다.
0 1 2 3 4
 
마지막 매개변수인 연속하는 두 수의 차를 생략하고 range()함수를 호출하였습니다. 이 경우 range()함수는 마지막 매개변수 연속하는 두수의 차는 1이 됩니다.
 
시작 값:생략, 종료 값: 5, 연속하는 두수의 차:생략
for a in range(5): print(a)
0 1 2 3 4
또한 range() 함수는 종료 값만을 입력하여 호출할 수 있습니다. 종료 값만 입력했을 시에는 시작값은 0이되며 두 수의 차는 1이 됩니다.
 
 
for 문에 사용될 수 있는 시퀀스형 자료는 문자열,리스트, 튜플이 있습니다. 이 자료형은 클래스 안 매서드로 __iter__와 __next__를 가지고 있으며 이 두개의 매서드로 순회가 가능하게 합니다.
이는 아래와 같이 iter()함수와 next(함수로도 실행을 할 수 있습니다.
 
listx= [100,200,300,400] strx= 'abcd' listxlter = iter(listx) strxlter= iter(strx) print(next(listxlter),next(listxlter),next(listxlter),next(listxlter)) print(next(strxlter),next(strxlter),next(strxlter),next(strxlter))
위 결과값은 아래와 같습니다.
100 200 300 400 a b c d
 

Tutorial 1.2.1 for, else

 
for i in range(5): print(i) if i ==3: break else: print('good job')
위 결과값은 아래와 같습니다.
0 1 2 3
 
for i in range(5): print(i) if i ==10: break else: print('good job')
위 결과값은 아래와 같습니다.
0 1 2 3 4 good job
 
while,else의 경우처럼 for에서도 else를 사용할 수 있습니다. else는 루프가 정상종료 되었을 때, 처음부터 자료형이 비어있었을 때 실행됩니다. while, else와 마찬가지로 break문을 만나면 else 문을 실행하지 않고 빠져나옵니다.

Tutorial 1.2.2 지능형 리스트의 for

#1 x= [i for i in range(1,10)] print(x) #2 y=['{}X{}={}'.format(i,j,i*j) for i in range(2,10,) for j in range(1,10)] print(y) #3 def sumthingFunction(i): if i % 100 ==0: return i else: return 0 기존리스트= [100,200,300,101,202,303] 새로운리스트= [sumthingFunction(i) for i in 기존리스트] print(sum(새로운리스트))
위 결과값은 아래와 같습니다.
#1 output [1,2,3,4,5,6,7,8,9] #2 output 구구단 리스트 출력 #3 output 600
 

Tutorial 1.2.3 다중인자 리스트 순회

#다중 리스트 for문 math=[ ('호준',100), ('준호',20), ('승엽',70), ('창삼',40), ('민성',30) ] for i,j in math: print(i,j)
위 결과는 아래와 같습니다.
호준 100 준호 20 승엽 70 창삼 40 민성 30
 
#하나만 리스트여도 쌍이면 상관없이 잘 돌아감 science = [ ('호준',100,'A'), ('준호',20,'F'), ('승엽',70,'C'), ('창삼',40,'D'), ('민성',30,'D') ] for i,j,k in science: print(i,j,k)
호준 100 A 준호 20 F 승엽 70 C 창삼 40 D 민성 30 D

Tutorial 1.2.4 enumerate

for i,j in enumerate([x*100 for x in range(5)]): print(i,j) print('\n') for i,j in enumerate([x*100 for x in range(5)],1): print(i,j) print('\n') for i,j in enumerate(range(100,201,10),100): print(i,j)
위 결과값은 아래와 같습니다.
0 0 1 100 2 200 3 300 4 400 1 0 2 100 3 200 4 300 5 400 100 100 101 110 102 120 103 130 104 140 105 150 106 160 107 170 108 180 109 190 110 200
 

Tutorial 1.3 break

 
break는 흐름을 끊어 중단할 때 사용합니다. 특정 코드를 반복하고자 for,while 문을 이용하여 반복문(loop)을 만들었다면 break 문을 사용하여 반복문을 중단할 수 있습니다.
 
반복문(loop) 순회 주에 break 문을 만나면 반복문의 내부 블록을 벗어나게 됩니다. 그러나 예제 1번과 같이 조건문 안에 어떠한 장치 없이 break를 넣으면 반복문이 반복하지 않으므로 예제 2번과 같이 주로 조건 안에 넣어 실행합니다.
예제1) while 조건: 반복 실행할 코드 break #while 구문을 탈출함
for 변수 in 범위: break # for 반복문 탈출
예제2) while 조건: 반복 실행할 코드 if 조건: break #while 구문을 탈출
for 변수 in 범위: 반복 실행할 코드 if 조건 : break # for 반복문 탈출
 
break문
시간 = 0 현재온도=int(input("현재 온도를 입력하세요:")) 희망온도=int(input("희망 온도를 입력하세요")) if 현재온도 < 희망온도: print('희망온도가 현재온도보다 높기 때문에 에어컨을 종료합니다.') else: while True 현재온도-=1 시간+=1 print('{}시간이 지나 {}도가 되었습니다'.format(시간,현재온도)) if 현재온도 == 희망온도: print('현재온도가 희망온도가 되었으므로 에어컨을 종료합니다.') break
 
현재 온도를 입력하세요 : 10 희망 온도를 입력하세요 : 9 1 시간이 지나 9도가 되었습니다. 현재온도가 희망온도가 되었으므로 에어컨을 종료합니다.
 
반복문이 실행되다 온도가 내려가 현재온도와 희망온도가 같아지는 경우 에어컨을 종료한다는 메시지를 출력 후 break 문을 통하여 반복문을 빠져나갑니다. 반복문을 빠져나가자 반복문이 중단되어 더 이상 실행되지않으므로 온도도 내려가지않고 시간도 지나가지 않습니다.
 

Tutorial 1.4 continue

 
continue의 사전적 의미를 살펴보면 '계속하다', '계속가다'라는 뜻이 있습니다. 파이썬에서 continue문은 반복문이 실행하는 코드블록의 나머지 부분을 실행하지 않고 다음반복으로 건너가게 흐름을 조정합니다. continue와 pass는 구분해서 사용을 해야 하니 차이점을 잘 정리해 두세요.
 
반복문 순회 도중 continue문을 만날시 continue문은 이후의 나머지 반복문 내부 코드블록을 실행하지 않고 다음 아이템을 선택해 반복문의 내부 코드블록 시작부분으로 이동합니다. break와 마찬가지로 조건이 없이 continue를 사용하는 것은 큰 의미가 없으므로(예제1) 주로 조건문을 달아 실행(예제2)합니다.
 
예제 1) while 조건: 반복 실행할 코드 continue #while 다음 반복문 수행 조건(continue) 사용시 무시되는 코드 for 변수 in 범위: 반복 실행할 코드 continue #for 다음 반복문 수행 조건(continue) 사용시 무시되는 코드
예제 2) while 조건: 반복 실행할 코드 if 조건 : continue #while 다음 반복문 수행 continue 사용시 무시되는 코드 for 변수 in 범위: 반복 실행할 코드 if 조건: continue # for 다음 반복문 수행 continue 사용시 무시되는 코드
수험번호_점수= [ (1001,90), (1002,80), (1003,70), (1004,60), (1005,58), (1006,90) ] for 수험번호,점수 in 수험번호_점수: if 점수<60: continue print('수험번호{}님은 {}점으로 합격하셨습니다.'.format(수험번호,점수))
위 결과는 아래와 같습니다.
수험번호1001님은 90점으로 합격하셨습니다. 수험번호1002님은 80점으로 합격하셨습니다. 수험번호1003님은 70점으로 합격하셨습니다. 수험번호1004님은 60점으로 합격하셨습니다. 수험번호1006님은 90점으로 합격하셨습니다.
 
점수가 60점 미만인 학생의 경우에는 점수<60 이 참(true)가 되어 continue문을 실행합니다.
따라서 나머지 코드블록인 합격메시지를 출력해주는 print문을 실행하지않고 다시 for 반복문의 내부 코드블록 시작부분으로 돌아갑니다.
 
여기서 continue라고 되어 있는 부분을 pass로 바꾸면 수험번호 1005번의 58점도 출력하는 것을 볼 수 있습니다. 반복 중간에 continue를 만나면 다음 반복으로 넘어가지만 pass를 만나면 그 라인만 지나치고 아래 문장을 그대로 실행합니다.
 

Tutorial 1.5 else

 
앞서 살펴본 것처럼 Python에서는 while,for 문에서도 else 문을 사용할 수 있습니다. 여기서의 else는 if에서의 else처럼 '그렇지 않으면'이라는 의미 보다는 '그런 다음'이라는 의미가 더 강하기 때문에 than으로 쓰여야 된다는 논의가 있기도 했습니다.
 
반복문이 break등에 의해 중단없이 정상적으로 반복이 종료된 후 특정 코드를 실행하게 해야할때 while~ else, for~ else를 사용할 수 있습니다. 또한 if문에서 else는 '그렇지 않으면'이라는 의미로 조건이 거짓일 때 쓰이고, try~except~else문에서 else는 예외가 발생하지 않을 때 쓰입니다.
 
while 조건: 반복 실행할 코드 else:
for 변수 in 범위: 반복 실행할 코드 else: for 반복문이 모두 실행되어 종료 되고 실행할 코드
 
for i in range(4): print(i) else: print('good job')
0 1 2 3 good job
for i in range(4): if i == 2: break print(i) else: print('good job')
0 1
 
위 코드에서 1번 예제처럼 break문 없이 정상종료 되었을 때에는 else문이 실행이 됩니다. 그러나 2번 예제처럼 break 문이 있을 경우에는 else문을 실행하지 않게 됩니다.
if 조건: 조건이 참일 경우 실행문 else: 조건이 거짓 일 경우 실행문
i=2 if i <4: print('i는 4보다 작습니다') else: print("i는 4보다 크거나 같습니다")
i는 4보다 작습니다
 
try: 실행문 except: 예외 발생 시 처리문 else: 예외 발생하지 않을 경우 실행문
try: i=1 j=1 x=i/j except: print("error") else: print(x)
1.0
 

Tutorial 1.6 중첩반복문

 
반복문 내부에 또 다른 반복문이 있을 경우, 중첩되었다고 얘기합니다. 중첩반복문이란 반복문 안에 반복문이 들어가 중첩된 것을 얘기합니다. 중첩 반복문에서는 종료되는 값을 항상 확인하세요.
i =2 while i <10 : k=1 while k < 10: print(i,"*",k,"=",i*k) k+=1 i+=1
위 코드의 결과값은 아래와 같습니다.
2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 1 = 3 ... ... ... 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
 
구구단은 2단부터 시작하기에 변수 i를 2로 설정해줍니다. 9단을 수행한 후 종료할 수 있도록 10미만이라는 조건을 설정해주었습니다. i는 구구단의 단을, k는 순차적으로 반복될 곱의 수이며 while문을 하나 더 이용하여 반복될 곱의 수를 1씩 순차적으로 더해주었습니다.
 
여기서 중요한 것은 종료되는 값입니다. k가 10이 된 상태로 안에 반복문이 종료되기 때문에 3단을 하기 위해서는 다시 k를 1로 초기화 시켜주어야 합니다.
 
for문과 range 함수를 이용하면 좀 더 간단하게 구구단을 출력할 수 있습니다.
 
for i in range(2,10): print("---{0}단---".format(i)) for k in range(1,10): print(i,"*",k,"=",i*k)
---2단--- 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 ---3단--- 3 * 1 = 3 3 * 2 = 6 ... ... 중략
 
for문을 중첩 사용하면 좀 더 간결하고 직관적인 코드를 작성할 수 있습니다.
 
첫 번째 for문에서 range 함수를 이용하여 2단부터 10단까지 차례로 i에 대입됩니다. 두 번째 for문에서 곱해지는 수를 k에 넣고 구구단을 출력하고 있습니다.
 
while과 달리 k의 값이 for문 안에서 자동으로 초기화가 되기 때문에 while문처럼 k=1을 두 번째 for문 위에 넣을 필요는 없습니다.

2.2 흐름제어

Index

  • if
  • if,else
  • if,elif,else

Tutorial 2.1 if

#1 x=2 if x>0 ande x<5: print('True')
True
if True: print('True')
True
 
if문은 조건을 판단하여 조건이 참이라면 해당 조건에 맞는 것을 실행하는 것입니다. if문의 구조는 아래와 같습니다.
 
#if 문의 기본구조 if 조건문 : #조건문을 확인해서 만약 '참'이면 if 문 다음에 문장들을 수행합니다. 수행할 문장 1 수행할 문장 2
 
위의 첫번째 예제 코드는 x변수에 할당된 2라는 값이 0보다 크고, 5보다 작기 때문에 True가 되어 안에 문장이 실행됩니다. 두번째 예제 코드처럼 직접 bool문을 넣을 수도 있습니다.
 
참고로 and는 'x >0'와 'x<5'를 둘 다 만족해야 True가 됩니다. or은 하나라도 만족하면 true를 반환합니다.
 

Tutorial 2.2 if, else

 
x= int(input('비교할 수를 입력하세요 :')) y= int(input('비교할 수를 입력하세요 :')) if x>y: print('첫번째 입력한 값이 더 큽니다.') else: print('두번째 입력한 값이 더 크거나 같습니다.')
비교할 수를 입력하세요:3 비교할 수를 입력하세요:5 두번째 입력한 값이 더 크거나 같습니다.
 
#if,else문의 기본구조 if 조건문: #조건문을 확인해서 만약 '참'이면 if 문 다음에 문장들은 수행합니다. 수행할 문장 1 수행할 문장 2 else: #if문의 조건이 거짓이면 else 문이 실행됩니다. 수행할 문장 3 수행할 문장 4
 

Tutorial 2.3 if, elif, else

x= int(input('비교할 수를 입력하세요 :')) y= int(input('비교할 수를 입력하세요 :')) if x>y: print('첫번째 입력한 값이 더 큽니다.') elif x<y: print('두번째 입력한 값이 더 큽니다.') else: print('두 값이 같습니다.')
비교할 수를 입력하세요 : 5 비교할 수를 입력하세요 : 5 두 값이 같습니다.
 
#if,elif,else문의 기본구조 if 조건문: #조건문을 확인해서 만약 '참'이면 if 문 다음에 문장들은 수행합니다. 수행할 문장 1 수행할 문장 2 elif: #if문의 조건이 '참'이 아니라면 elif 문의 조건문을 확인하고 수행할 문장 3 #elif 문의 조건문이 참이라면 수행한다. 수행할 문장 4 else: 수행할 문장 5 # if 문과 elif 문의 조건문이 거짓이면 else가 실행됩니다. 수행할 문장 6
만약 x>y 조건문이 참이라면 "첫번째 입력한 값이 더 큽니다."를 출력해주고 거짓일 경우 "두번째 입력한 값이 더 크거나 같습니다."를 출력합니다.
 
여기서 첫번째 조건문을 만족하지 않기 때문에 elif로 넘어오게 됩니다. 여기서 두번째 조건인 x<y 조건문도 만족하지 않기 때문에 마지막 else문으로 넘어가 두 값이 같다는 문장을 출력하게 됩니다.
 

2.3 기타제어문

 

삭제

del

앞서 리스트에서 데이터를 삭제할 때 소개가 되었습니다. del 은 객체를 삭제하는 역할을 합니다.
 
class Coffee: menu = [ "Americano", "Cafe Mocha" ] # 삭제 하기 전 print(Coffee) # 삭제 후 del Coffee print(Coffee)
[OUTPUT] # class 출력 <class '__main__.Coffee'> # 삭제된 class를 출력하려고 하자 에러 메시지 발산 Traceback (most recent call last): File "/studyLab.py", line 9, in <module> print(Coffee) NameError: name 'Coffee' is not defined
 
삭제 명령을 내리기 전에는 정상적으로 coffee 클래스가 출력되지만, 삭제 명령을 내린 후에는 Coffee 는 정의되지 않았다고 출력되는 모습을 볼 수 있습니다.
 

예외

try ~ except ~ else ~ finally

위와 같이 에러가 발생하는 경우에는 프로그램이 멈추는 등 심각한 문제를 초래할 수 있습니다.
따라서 프로그램이 멈추지 않도록 에러가 발생하지 않도록 처리를 해주어야 합니다.
이를 예외처리라고 합니다.
 

try

try블록 안에서는 실질적인 프로세스가 진행됩니다.
만약 프로세스 진행 중에 오류가 발생한다면 except블록으로 넘어가 진행됩니다.
정상적인 로직이 실행된다면 except 블록을 건너뜁니다.
 

except

try블록에서 오류가 발생한다면 넘어와 except에 있는 프로세스가 실행됩니다.
가능하면 except안에서는 오류가 발생할 로직을 설정하지 않는 것이 좋습니다.
except구문이 실행된다면 다음에 있을 else구문(만약 존재한다면)은 건너 뜁니다.
 

else

정상적인 로직이 실행되었을 때 except구문을 건너뛰고 else구문이 존재한다면 실행됩니다.
좀더 명확히 로직을 나눌 필요가 있을 때 만들면 좋습니다.
 

finally

항상 최종적으로 실행되는 구문입니다.
except 구문과 마찬가지로 여기에서도 오류가 발생할 로직은 설정하지 않는 것이 좋습니다.
대체로 상황을 초기화를 하거나, 파일 입출력 연결 혹은 데이터베이스 연결을 종료할 때 자주 사용됩니다.
 
먼저 삭제되지 않고 정상적으로 출력되는 상황에 대한 예제입니다.
 
selected_menu = "Ice Americano" try: print("메뉴를 입력받습니다.") print(selected_menu) except: print("존재하지 않는 메뉴입니다.") else: print("메뉴가 정상 처리 되었습니다.") finally: print("안녕히 가세요!")
[OUTPUT] 메뉴를 입력받습니다. 메뉴가 정상 처리 되었습니다. 안녕히 가세요!
 
다음 예제는 메뉴를 입력받았지만, 중간에 삭제되어버렸다고 가정한 내용을 짧게 축약한 것입니다.존재하지 않는 변수를 print 메소드로 출력하지만 에러 메시지가 뜨지 않고, 계속 진행되는 것을 볼 수 있습니다.
 
selected_menu = "Ice Americano" del selected_menu try: print("메뉴를 입력받습니다.") print(selected_menu) except: print("존재하지 않는 메뉴입니다.") else: print("메뉴가 정상 처리 되었습니다.") finally: print("안녕히 가세요!")
[OUTPUT] 메뉴를 입력받습니다. 존재하지 않는 메뉴입니다. 안녕히 가세요!
 

raise

raise문은 프로그래머가 직접 에러를 발생할 수 있도록 하는 것입니다.
모듈을 작성할 때에 직접 논리적인 오류를 발생시킴으로 개발하는데에 도움을 주거나 혹은 논리적인 오류의 발생을 미연에 방지할 수 있습니다.
 
raise NameError("잘못된 이름을 가리키고 있습니다.")
[OUTPUT] Traceback (most recent call last): File "/studyLab.py", line 1, in <module> raise NameError("잘못된 이름을 가리키고 있습니다.") NameError: 이름에 대한 에러가 발생했습니다.
 
파이썬에 내장되어 있는 예외는 다음 문서를 참조하시길 바랍니다.
 

with

with 구문은 ContextManager 프로토콜에 따라 시작시에 __enter__(self)와 종료시에 __exit__(self) 구문을 자동으로 호출해주는 역할을 담당하고 있습니다.
파일을 연결하거나, 데이터베이스에 연결할 때에 사용하면 코드의 길이을 좀더 짧게 줄일 수 있습니다.
try-finally를 활용한 코드
try: menu = open("coffee_menu.txt", mode="wt", encoding="utf-8") menu.write("americano\n") menu.write("mochaccino\n") finally: menu.close()
with open("coffee_menu.txt", mode="wt", encoding="utf-8") as menu: menu.write("americano\n") menu.write("mochaccino\n")
 

switch Class

dispatch method

 
파이썬에서는 switch-case 문을 공식적으로 지원하지 않습니다.
Python 공식 FAQ의 기록으로는 다음과 같은 이유를 답변하고 있습니다.
 
  1. if-elif-else 문으로 충분히 가능하다.
  1. switch-case 구문에 대한 표현 방법은 여러가지 제안이 올라온 것은 있으나, 아직 정해진 바가 없다.
 
그리고 다음과 같은 대체 방법을 제시하고 있습니다.
 
  1. 사전 자료형을 통해 switch-case를 쉽게 구현할 수 있다.
  1. 내장함수 getattr 을 통해 switch-case 구문을 흉내낼 수 있다.
 
이 중 getattr을 통한 switch-case 구문을 흉내낸 클래스를 구현해보겠습니다.
 
먼저 getattr의 인자 구성은 다음과 같습니다.
 
  1. 속성에 대한 값, 혹은 함수를 파악할 클래스(여기서는 자기 자신이므로 self)
  1. 속성명, 함수명 문자열
  1. 속성이 없을 경우 찾을 기본값, 혹은 함수
 
이 때 기본값으로 처리될 3번 매개변수가 존재하지 않으면서 동시에 해당하는 속성을 찾지 못할 경우에는 아무 처리하지 않고 넘어가게 됩니다. (오류를 발생하지 않습니다.)
 
class Menu: def selectMenu(self, arg): self.case = getattr(self, str(arg), self.unknown) return self.case() def americano(self): print("주문하신 아메리카노 나왔습니다.") def restritto(self): print("주문하신 레스트리또 나왔습니다.") def lungo(self): print("주문하신 룽고 나왔습니다.") def unknown(self): print("존재하지 않는 메뉴입니다.") cafe = Menu() cafe.selectMenu("americano") cafe.selectMenu("restritto") cafe.selectMenu("lungo") cafe.selectMenu("Cafe Mocha")
[OUTPUT] 주문하신 아메리카노 나왔습니다. 주문하신 레스트리또 나왔습니다. 주문하신 룽고 나왔습니다. 존재하지 않는 메뉴입니다.
 

pass

 
pass 문은 아무것도 하지 않습니다. 문법적으로는 문장이 필요한데 프로그램이 특별히 할 일이 없을 경우에 사용합니다.
 
가령 예외처리를 할 경우에 예외가 발생했을 때 그 어떠한 행위도 하고 싶지 않을 때에 사용할 수 있습니다. (except 안에 아무 구문도 들어가지 않으면 문법 오류가 발생합니다!)
 
x = "10" del x try: print(x) except: pass
 
공식 문서에는 다음과 같은 예를 소개하고 있습니다.
 
while: True # Busy-wait for keyboard interrupt (Ctrl+C) pass
 
이런 구문이 완성되었을 경우 프로그램은 강제종료(Ctrl + C)를 하기 전까지 무한 반복하며 아무 일도 하지 않습니다.
 
또한 최소한의 클래스를 만들 때에 클래스명만 정의해서는 문법 오류가 발생하는데 이때 pass를 넣어두면 문법 오류가 발생하지 않습니다.
 
class Coffee: pass
 
pass 가 사용될 수 있는 다른 장소는 새 코드를 작업할 때 함수나 조건부 바디의 자리를 채우는 것인데, 여러분이 더 추상적인 수준에서 생각할 수 있게 합니다. pass 는 조용히 무시됩니다.
 
def coffee_menu(*args): pass # Remember to implement this!
 

assert

 
assert 문은 프로그램에 디버깅 어서션(debugging assertion)을 삽입하는 편리한 방법입니다.
assert 문은 주로 단위 테스트를 할 때에 사용됩니다. 대규모 어플리케이션 등에서 특정한 영역에 수정이 필요할 경우 수정 후에 오류가 발생할 가능성을 개발과정 중에서 미리 체크해볼 필요가 있습니다. 이런 경우 assert 문을 통해 미리 테스트 준비를 마쳤다면 조금 더 안전하게 수정할 수 있습니다.
assert 문 바로 뒤에 오는 값은 boolean 으로 평가된 값이 False라면 에러를 발생시킵니다.
 
selected_number = "americano" menu_set = { 0: "espresso", 1: "ristretto", 2: "lungo" } assert type(selected_number) is int, "정수로 된 값을 넣어주세요." assert len(menu_set) > selected_number, "선택한 값보다 작은 수를 넣어주세요" print(menu_set[selected_number], "를 선택하셨습니다.")
[OUTPUT] Traceback (most recent call last): File "/studyLab.py", line 7, in <module> assert type(selected_number) is int, "정수로 된 값을 넣어주세요." AssertionError: 정수로 된 값을 넣어주세요.
 

return

 
return 은 문법적으로 클래스 정의에 중첩된 경우가 아니라, 함수 정의에만 중첩되어 나타날 수 있습니다.
표현식 목록이 있으면 값을 구하고, 그렇지 않으면 None 으로 치환됩니다.
return 은 표현식 목록 (또는 None)을 반환 값으로 해서, 현재의 함수 호출을 떠납니다.
return 이 finally 절을 가진 try 문에서 제어가 벗어나도록 만드는 경우, 함수로부터 진짜로 벗어나기 전에 그 finally 절이 실행됩니다.
제너레이터 함수에서, return 문은 제너레이터가 끝났음을 가리키고, StopIteration 예외를 일으킵니다. return 문에 제공되는 값은 (있다면) StopIteration 의 생성자에 인자로 전달되어 StopIteration.value 어트리뷰트가 됩니다.
비동기 제너레이터 함수에서, 빈 return 문은 비동기 제너레이터가 끝났음을 알리고,  StopAsyncIteration 예외를 일으킵니다. 비동기 제너레이터 함수에서, 비어있지 않은 return 은 문법 에러입니다.
 

yield

 
yield는 제네레이터의 일종입니다. iterator와 비슷하게 사용되어 보이지만 yield가 선언된 지점에서 잠시 해당 함수의 실행을 멈춘 후에 호출했던 함수로 돌아가서 실행하고 다시 돌아와서 실행하는 큰 차이가 있습니다.
def yield_test(): print('FUNCTION START') for i in [1, 2, 3]: print('BEFORE YIELD') yield i print('AFTER YIELD') print('FUNCTION CLOSED') print('START') for i in yield_test(): print('YIELD: ', i) print('END')
[OUTPUT] START FUNCTION START BEFORE YIELD YIELD: 1 AFTER YIELD BEFORE YIELD YIELD: 2 AFTER YIELD BEFORE YIELD YIELD: 3 AFTER YIELD FUNCTION CLOSED END
 

nonlocal

 
nonlocal 문은 한 단계 더 높은 scope 의 범위를 가지고 있음을 알려줍니다.
 
nonlocal 문은 나열된 식별자들이 전역을 제외하고 가장 가까이서 둘러싸는 스코프에서 이미 연결된 변수를 가리키도록 만듭니다. 이것은 중요한데, 연결의 기본 동작이 지역 이름 공간을 먼저 검색하는 것이기 때문입니다. 이 문장은 캡슐화된 코드가 전역 (모듈) 스코프 외에 지역 스코프 밖의 변수들에 재연결할 수 있도록 합니다.
nonlocal 문에 나열된 이름들은, global 문에 나열된 것들과는 달리, 둘러싼 스코프에서 이미 존재하는 연결들을 가리켜야만 합니다 (새 연결이 어떤 스코프에 만들어져야만 하는지 명확하게 결정할 수 없습니다).
nonlocal 문에 나열되는 이름들은 지역 스코프에 이미 존재하는 연결들과 겹치지 않아야 합니다.
 
price = 2000 def how_much(): price = 5000 def on_sale(): nonlocal price price -= 500 print("on_sale:", price) on_sale() print("how_much:", price) how_much() print("global:", price)
[OUTPUT] on_sale: 4500 how_much: 4500 global: 2000
 

모듈(Module)

 
파이썬은 import 를 활용하여 모듈을 불러올 수 있습니다.
 
모듈이란 클래스나 함수를 다른 파일 등에 미리 작성하여 사용할 때에 가져와서 사용할 수 있게 만든 것입니다.
 
특히 프로그램이 길어졌을 경우, 한 파일에 모든 함수나 클래스들을 작성하여 정의해두면 수정이 필요할 때에 찾아 확인하기가 매우 어렵습니다. 때문에 다른 파일에 저장해 두었다가 필요할 때에 호출하여 사용하는 것입니다.
 
import os os.system('mkdir Assets')
 
위의 예시와 같이 자신이 만든 함수나 클래스 뿐만 아니라 파이썬에서 제공하는, 혹은 제 3자(Third Party)에서 제공해주는 모듈들을 불러와서 이용할 수 있습니다.
 

2.4 Bulit-in Functions

1. PYTHON 내장함수

notion imagenotion image
위 표는 공식사이트에서 소개하고 있는 내장함수들을 나타낸 표입니다. 언급되는 내장함수들은 꼭 필요하다고 판단되는 것만 기술해 두었습니다.
 

파일 읽어보기

먼저 알아볼 것은 파이썬으로 파일을 읽고(read) 쓰는(write) 것입니다. 구름 IDE 상에 open.py라는 파일을 만들어 다음 코드를 입력해 저장합니다.
("를 쓰든, '를 쓰든 특별한 차이는 없습니다)
 
f = open("인공지능캠프.txt", 'w') f.close()
 
그 후 콘솔창에 python open.py라고 입력하면 콘솔창에서는 아무 변화가 없지만 화면 좌측에 인공지능캠프.txt라고 텍스트 파일이 생성된 것을 볼 수 있습니다.
 
notion imagenotion image
파이썬의 파일을 생성할 때 open()이라는 내장함수를 사용합니다. 이 때 생성할 파일의 이름과 읽기 모드를 같이 입력해 주어야 합니다.
 

읽기 모드에 관하여

f = open("인공지능캠프.txt", 'w') f.close()
위와 같이 f = open("열어볼 파일 명+확장자명", '원하는 읽기모드')와 같은 형식으로 나타냅니다.
 
읽기 모드에는 다음과 같은 것들이 존재합니다.
notion imagenotion image

파일 쓰기

방금 생성된 '인공지능캠프.txt'파일을 보시면 빈 파일이라는 사실을 알 수 있습니다. 내용을 넣지 않고 생성만 했기 때문인데요. 이번에는 파일을 쓰는(write) 방법에 대해 알아보겠습니다.
 
write.py 파일을 생성하고 다음 코드를 입력해봅시다.
f = open("인공지능캠프.twx", 'w') for i in range(1, 6): data = "%d명 참여 중입니다. \n" % i f.write(data) f.close()
그리고 콘솔창에 python write.py를 입력하시면 역시 마찬가지로 콘솔 창에선 아무 변화가 없지만 '인공지능캠프.txt' 파일을 다시 열어보시면 아까는 없던 글이 쓰여 있는 것을 볼 수 있습니다.
 
notion imagenotion image

파일 읽기

파일을 읽는 방법에는 4가지 방법이 있습니다.
 
첫번째, readline()
readline() 함수를 이용하여 방금 생성한 파일을 일어보도록 하겠습니다. readline.py 파일을 생성하고 다음 코드를 입력해봅시다.
f = open("인공지능캠프.txt", 'r') line = f.readline() print(line) f.close()
 
그 다음 콘솔창에 다음과 같이 입력해보시면 '인공지능캠프.txt' 파일의 맨 첫번째 줄이 출력된 것을 볼 수 있습니다.
 
notion imagenotion image
 
두번째, readall()
readline()은 말 그대로 파일의 텍스트 한 줄을 출력해 줄 뿐이지만, readall은 파일의 전체 텍스트를 읽어옵니다. readline.py 파일에 다음 코드를 입력해봅시다.
f = open("인공지능캠프.txt", 'r') while True: line = f.readline() if not line: break print(line) f.close()
그 후 콘솔창에 다음과 같이 입력하시면 파일 전체를 읽어온 것을 볼 수 있습니다.
 
notion imagenotion image
 
세번째, readlines()
다른 방법에 대해서도 알아보도록 하겠습니다. readlines.py 파일을 생성한 후 다음과 같이 입력해 보도록 하겠습니다.
f = open("인공지능캠프.txt", 'r') lines = f.readlines() for line in lines: print(line) f.close()
그 후 콘솔창에 다음과 같이 입력하면 파일 전체를 읽어온 것을 볼 수 있습니다.
 
notion imagenotion image
 
네번째, read()
하지만 가장 파일 전체의 내용을 읽어오는 방법이 있습니다. 바로 read() 함수를 사용하는 것입니다. read.py 파일을 생성하고 다음과 같이 입력해 봅시다.
f = open("인공지능캠프.txt", 'r') data = f.read() print(data) f.close()
그 후 콘솔창에서 확인해 보시면 더 간단한 방법으로 파일 전체를 읽어본 것을 확인할 수 있습니다.
 
notion imagenotion image

내용 수정

다음은 이미 생성된 파일에 내용을 수정하는 방법입니다. adddata.py 파일을 생성하고 다음과 같이 입력하세요.
f = open("인공지능캠프.twx", 'a') for i in range(6, 11): data = "%d명 참여 중입니다. \n" % i f.write(data) f.close()
그 후 콘솔창에 다음과 같이 입력하시면 콘솔창에는 아무 변화가 없지만 '인공지능캠프.txt'를 열어보면 텍스트가 추가된 것을 볼 수 있습니다.
 
notion imagenotion image
 

파일 생성과 내용 추가를 동시에

위에서 파일을 생성하고 그 파일에 텍스트를 쓰는 방법에 대해 배웠습니다. 하지만 파일을 생성하면서 바로 글을 추가하는 방법은 없을까요? with 함수를 사용하여 간단하게 텍스트를 포함된 파일을 생성할 수 있습니다. with.py 파일을 생성한 후 다음과 같이 입력해봅시다.
with open("text.txt", 'w') as f: f.write("Life is too short, you need python")
그 후 콘솔창에 다음과 같이 입력하면 마찬가지로 아무 변화가 없지만 생성된 test.txt 파일로 들어가면 텍스트가 포함되어 있는 것을 알 수 있습니다.
 
notion imagenotion image