25.10.16 6일차 [ 파이썬 기초 개념 강의_(반복문+조건문, 컴프리핸션, break, continue, else, while문, 함수 개념)]
Datadesigner2025. 10. 16. 17:49
오늘은 어제에 이어서
for 반복문 + 조건문 활용
컴프리핸션
break, continue, else
while문
함수 개념
에 대해서 배우고
파이썬을 연습할 때 가장 좋은 방법이라는 게임 만들기를 단계별로 나눠서 수행하였다.
게임은 오늘 다 못 만들고 추후 복습시간이나 집에서 연습하라고 하셨다.
게임 내용은 1~100까지의 수를 랜덤으로 제공받고 맞춰보며 조건문과 반복문을 이용해서 맞추고 결과가 나오는 것까지 설계하는 내용이다.
for문 + 조건문 활용
요구사항 3단~6단까지 for문을 써서 출력하시오 단, 5단은 제외할 것 단, 3 x 3 , 4 x 4, 6 x 6 은 제외할 것
for n in range(3,7): for m in range(1,10): print( f'{n} x {m} = {(n * m)}')
이게 기본 코드다, 여기서 두 가지 필터링이 존재한다. 1. 5단은 제외할 것 이를 수행하려면 첫 for문에서 5단을 제외하며~인 조건문을 추가해주면 된다
for n in range(3,7): if n != 5: pass for m in range(1,10): print( f'{n} x {m} = {(n * m)}')
이렇게 if 문을 추가하면 출력값에서 5단이 빠지는 것을 볼 수 있다. n != 5 는 n이 5가 아니면 출력하고, n이 5라면 출력하지 말라는 뜻이다.
2. 3 x 3, 4 x 4, 6 x 6 은 제외할 것 이 필터링 또한 if n != m: pass 를 추가하여 필터링 할 수 있다.
for n in range(3,7): if n != 5: pass for m in range(1,10): if n != m: pass print( f'{n} x {m} = {(n * m)}')
왜냐하면 if 한 줄만 들어가도 else라면 출력하지 않는다는 뜻이 생략되어있기 때문이다.
key = 첫 번째 for문 안으로 if문이 들어가고, 두 번째 for문 안으로 if문이 들어가는 그 위치가 아주 중요하다.
컴프리핸션
간결하게 반복문을 처리하여, 데이터를 직관적으로 일괄 처리
리스트 | 딕셔너리 컴프리핸션
결과 중심으로 표현 <- 구현 자체를 결과를 두고 진행
요구사항 3~4단 구구단 결과를 리스트에 담으시오, 변수명은 temps, 구구단 포맷은 동일하게
리스트에 애초에 함수를 담아서 f포맷팅으로 만들어버리는것이다
temps = [ f'{n} x {m} = {n * m:>2}' for n in range (3, 5) for m in range (1,10) ] temps 출력값은 리스트에 3단과 4단이 담긴 형태로 출력된다. 순서만 변경된 것 같지만 데이터가 바로 리스트에 담겨서 출력된다는 점에서 데이터 처리 속도면으로 아주 유용한 기술이라고 한다.
break
반복문을 중단(탈출)
break를 감싸고 있는 가장 가까운 반복문 탈출
continue
continue를 감싸고 있는 가장 가까운 반복문으로 점프 -> 다음 반복문 진행
else
for ~else~
while ~else~
반복문이 중단없이 정상적으로 마무리되면 else로 진입함 -> 반복문이 강제로 종료되었는지 점검 가능
필요할때만 사용
어떤 변수 없이 그대로 반복문(예외처리)가 진행되면 진입 - 뉘앙스
break
#목적 #임시적 코드, 샘플링을 위해 사용함, 1회성 작동방식
for n in range(10): print(n) break 출력값 0 -> 한번만 돌고 바로 break로 반복문을 빠져나갔기 때문이다 for n in range(10): if n >3: break print(n) 출력값 0 1 2 3 -> n이 3을 넘어가지 않아서 계속 수행한 것이고 만약에 (if) n이 3보다 커졌기 때문에 break가 수행되어 나가게 된 것이다.
for n in range(10): print(n) if n >3: break -> 여기서 순서가 중요하다, 순서가 바뀌면 0 1 2 3 4 로 나오는데 이는 3까지 출력하고 4까지 출력된 이후 if문이 작동하여 break가 수행됬기 때문이다,
continue
반복문을 모두 수행한다. for n in range( 2, 6 ) if not n % 2: continue print(n) 이 결과는 어떻게 될까? for문에서 2, 3, 4, 5가 돈다. 이때 부정을 부정하는 not 연산자가 들어가서 if not 2 % 2가 돌아간다. 그 값은? 나머지가 0 이니까 False다, 근데 not이 들어가서 True로 값이 바뀌어서 조건을 만족하였으므로 continue로 출력되지 않고 다시 1번 for문으로 돌아간다.
고로 이 값은 홀수만을 출력하는 반복문이 된다. 3 5
else
for i in range( 3 ) : print ( 'A' , i) if i == 1: print( 'B' , i) continue print('C' ,i) else: print('continue 사용시 else에 진입한다')
for에서 순서대로 0, 1, 2가 내려온다. 이 때 for 문에는 'A' 출력과 'C'출력이 걸려있는것이다. 이 때 0 == 1 은 False이므로 'B'는 출력되지 않는다. 그 이후 1 == 1 이므로 B가 출력된 이후 continue를 통해서 다시 for 문으로 돌아간다. 그리고 2 == 1 False 이므로 다시 A 와 C 만 출력된다. 마지막으로 반복문이 문제없이 돌아갔기 때문에 else절이 출력되는것이다.
while문
언제 끝날지 모르는 반복 수행 상황에서 사용한다.
무한 루프를 잠재
0 ~ 무한대
무한대로 코딩할 순 없으니 반드시 탈출 코드가 필요하다.
조건문 + break
while문의 조건식에 변수를 조정
플레그변수(기능)을 이용하여 탈출
탈출용 변수 준비
중복 반복문에서 유용하다.
조건식에 걸린 변수값의 변화에 의해서 탈출
문법
while 조건식:
statements(수행문)
datas = [11, 12, 13]
while len(datas) > 0: print(datas.pop())
13 12 11 -> 이는 datas에 있는 데이터가 0이 될때까지 한개씩 꺼내는 함수 pop()을 사용해서 꺼낸 것이다. 잘 꺼내졌는지 확인하기 위해서 print(datas.pop())으로 본 것이고 datas의 값이 0인것을 확인하기 위해서 len(datas) > 0 으로 데이터가 0이 되어서 반복문을 종료한 것이다.
종합
a = [1,2,3,4,5]
while a:
tmp = a.pop()
if tmp % 2 == 0:
continue
print( tmp,len(a))
iflen(a) == 1:
break
else:
print('반복문이 정상적으로 종료되었다.')
이 코드의 결과값을 예측해볼 것
답
수행문의 순서에 따라 5부터 꺼내져서 밑의 코드를 흘러간다 5 % 2 == 0 이 아니니 5는 프린트된다, 그럼 len(a)는 [1, 2, 3, 4] 총 4이므로 첫 행은 5 4 가 된다 그리고 4가 꺼내지는데 4%2 == 0 맞으므로 continue를 통해서 출력되지 않고 돌아간다. 이렇게 5 4 3 2 1 0 이 되고 마지막에 len(a) == 1인 적이 없으므로 break는 수행되지 않는다. 그래서 else행이 출력되어 5 4 3 2 1 0 반복문이 정상적으로 종료되었다. 가 되는것이다!
함수
개요
목적
절차적 코드의 단점
중복 표현(반복적 표현)이 많이 발생함
기존 코드를 코드 내에서 재사용할 방법이 없음
흐름제어 난이도가 높아짐(복잡함)
반복문 남발
코드의 깊이가 깊어짐
함수의 장점
절차적 코드의 단점을 보완
특정 단위를 하나의 수행 단위로 구성 가능
재사용성 제공/높임
생산성 향상
함수 구성 원칙
같은 로직 단위 수행문이 코드 여러 지점에서 사용된다면
특정 루틴의 내용이 길면, 함수로 구현
구성 본질
구성
입력
함수를 호출할때 데이터가 전달되는 통로
함수 정의 : 매개변수 , parameter
함수 호출 : 인자, argument
생략 가능
처리
전달된 데이터를 기반으로 연산 수행
함수의 목적
더하기 함수
리스트의 모든 멤버를 합산하는 함수
로그인 처리 함수
LLM에서 프롬프트를 받아서 GPT에게 질의하고 결과를 받아오는 함수
자연어 입력받아서 LLM에게 전달하고 이를 통해 생성된 이미지 링크를 전달하는 함수
생략 가능 -> 무의미한 함수
출력
처리 결과를 반환
리턴값은 X, 1개, N개여도 상관없음
기초 문법 (사용자 정의 함수)
개발자의 필요에 의해 정의한 함수
[ .. ] -> 대괄호는 생략 가능
파이썬 def, JS function, 모바일 앱 func / fun
함수 문법
[ 데코레이터 ] fastapi에서 중점적으로 나옴
def 함수명 ( [ 매개 변수1, 매개 변수2,...] ) :
들여쓰기 (인텐트) 자동 삽입 -> 코드블럭
처리 파트 : statements(수행문)
....
반환 파트 -> 출력값은 없어도 되고, 여러개도 가능
[ return [ 출력값1, 출력값2,.... ]
함수 정의 def test():pass
test() 함수는 호출해야지만 의미를 가짐
기본형
요구사항 - 함수명 : add - 입력 : 정수값 2개, x , y - 처리 : 입력받은 두 수 더하기 -> + - 출력 : 합산한 값을 반환
def add( x , y ): - 함수 선언, 입력 파트 return x + y - 함수 처리, (로직, 함수의 실 기능), 함수 출력( 결과를 반환하는 파트) add( 1, 2 )
출력값 3 함수의 중요성은 만약 구해야 하는 값이 많을 때 식을 수정해야 한다면 ex) 나온 값에서 1을 더해야 한다면?
def add( x , y ): return x + y +1 -> 함수하나를 수정하는 것 만으로도 모든 결과를 다르게 받을 수 있다.
def add2( x, y ) : print ( x + y) add2 ( 1 , 2 ) 3 결과값은 나온다, 하지만 이는 함수로 반환한 것이 아닌 그저 x y 에 정수값을 대입한 것이기 때문에 함수 호출의 결과는 None로 나온다.
위 이미지를 보면 더 이해가 잘 될것이다
여러개의 값 반환 ( 튜플 )
def multi_oper ( x , y ): return x + y, x - y, x * y, x / y multi_oper(1, 2) 3, -1, 2, 0.5 함수의 세팅에 따라 한 쌍의 정수로도 여러가지 값을 반환받을 수 있다. 이 때 이 결과는 튜플로 반환된다. 보통은 이렇게 함수를 세팅한 이후
res_add, res_sub, res_mul , res_div = multi_oper( 1 , 2) 등으로 각 값을 분해하고 대입하여 적용하는것이 일반적인 사용법이다.
매개변수, 인자 : 가변인자 (튜플)
가변인자
함수에 데이터를 전달할 때 (매개변수 사용) n개를 자유롭게 전달하고 싶다면
print()
print() print(1) print(1, 2) print(1, 2, 3) print(1, 2, 3, 'hi') print(1, 'hi') 출력값 1 1 2 1 2 3 1 2 3 hi 1 hi 요구사항 - 함수명 : add_ex - 입력 : 가변인자 (*인자명) , x - 처리 : 입력된 모든 인자를 합산 - 반환 : 합산 결과
def add_ex( *x ): print ( sum(x) , type(x))
add_ex(1) add_ex(1, 2) add_ex(1, 2, 3) 1 3 6 여긴 아직 안 끝났다
오늘은 while문 부터 게임 단계 함수까지 어디 하나 빠지지 않고 멘탈이 완전히 나가버렸다.
분명 수업중에는 이런 순서대로 가면 어떤 기능이랑 어디에 뭐가 있는지 자연스레 말씀하시는데 그때는 이해가 가도 혼자서 해결하려 생각해보면 방법 자체가 생각 자체가 안난다.
내 머리속에서 익숙한 기능들만 생각이 나고 다른 기능들은 아예 박혀있지가 않다.
예전부터 이어졌던 나의 안 좋은 습관인것 같다, 오후에는 정말 멘탈이 나가서 나 자신한테 화가 날 정도였다.
정말 이 쪽으로 재능이 없나, 지금이라도 다른걸 찾아봐야 하나, 내가 좋아하고 잘 할수 있는 다른게 분명히 있을것 같은데...
나는 노는것, 기획, 놀랍게 만들고 주목받는걸 좋아하는데 이 과목이, 그리고 이 수업이 나에게 정말 맞는 길일까...
혼자서 잡생각하며 마지막 교시에 집중도 못하다가 문득 정신을 차렸다, 아니 일주일때 수업도 못 따라가서 포기하면 다른 곳에서 다른 일을 배운다고 잘 할거같아? 좋아하는 일 하면 니가 잘 할거같아?
나는 원래 이런 사람이 아니었는데, 누구보다 잘하고 이기고싶어서 매일 밤을 새고 더 공부하고 결국 이겨내던 사람이었는데.
예전엔 꽤나 똑똑하고 생각이 많은 사람이라고 자부하고 살았는데 쉬면서 뇌가 완전히 녹아버린 것 같다.