본문 바로가기
빅데이터분석

[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (3) 파이썬 기초문법: 반복문(for, while)

by 모닥불🔥 2024. 2. 16.

오늘도 역시, 메타코드m, 링고 선생님의 데이터분석 프로젝트 입문 강의를 정리하려 한다. https://mcode.co.kr/ 로 접속하면 강의를 구매할 수 있다.

🔥 강의 목차

오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기

 

오늘은 반복문에 해당하는 for문과 while문을 배울 것이다. 내가 대학생이던 시절 방학을 이용해 c, c++ 학원도 다녔었는데 ㅋㅋㅋ for문과 while문, 그리고 모듈?을 넣는 부분이 진짜 1도 이해가 안됐던 기억이 난다. 그때부터 좀 코드를 치고 살았으면 지금 훨씬 더 잘 할 텐데, 후회는 소용 없으니 오늘부터라도 열심히!

 

그런데 이번에 링고 선생님한테 배우니까 엄청 이해가 잘 됐다. python 기초도 여러번 배워서 그런 걸지도 모른다. (python 기초만 한 3번은 본 듯.... 그러나 프로젝트를 하지 않으니 다 까먹더이다..)


🔥파이썬 기초문법: for loop

for 변수 in 시퀀스:
	실행할 코드

 

for 변수 in 시퀀스:를 쓰고 다음 행에 들여쓰기, 실행할 코드를 쓰면 시퀀스를 쭉 돌면서 각 원소에 대해 for문 내부 코드를 실행한다. 시퀀스에는 리스트, 문자열 등이 들어갈 수 있다.

 

먼저 리스트가 무엇인지 알아보자. 리스트란, 순서가 있는 아이템들의 모음이고, 대괄호[] 로 표현된다.

my_list = [1, 2, 3, 4]

 

index를 사용해 리스트 내 원하는 요소에 접근이 가능한데, 위 코드로 my_list라는 리스트를 하나 정의하고 my_list[0]로 조회하면 0번 값(첫번째 값)인 1이 출력된다. my_list[3]은 index 0부터 시작해서 index 3에 해당하는 4가 출력된다. 0부터 센다는 것에 유의!

my_list[-1]처럼 마이너스를 붙여 주면 오른쪽에서부터 index로 조회 가능하다. 이때는 1부터 시작인 것도 헷갈리지 말아야 한다. (my_list[-1]의 출력값은 4)

 

seq = 0
for i in [1, 10, 100, 1000]:
    seq = seq + 1
    print('---start---')
    print(f'시퀀스: {seq}, 아이템: {i}')
    print('---end---')
    print('')

 

for 문은 위와 같이 쓴다.

seq = 0 이라는 값을 지정해 두고, 이걸 for 루프가 돌 때마다 1씩 늘어나도록 하면 몇 번째 시퀀스인지 알 수 있다. f'시퀀스: {seq}' 부분으로 출력됨!

for 변수 in 리스트 형태의 시퀀스를 넣어주었고, 현재 리스트 내 어떤 항목이 돌아가고 있는지 알기 위해 f'아이템: {i}' 부분으로 출력했다.

 

코드가 동작하는 순서를 보려면 https://pythontutor.com/visualize.html#mode=edit 요 사이트에 접속해서 코드를 적은 다음, Visualize Execution을 눌러보면 된다. 단계 단계마다 어떤 항목이 들어갔고, 어떤 결과값이 나오는지 볼 수 있어서 for문을 이해하는 데 많은 도움이 되었다. 링고 선생님 짱!!


🔥파이썬 기초문법: while loop

반복문에는 for문과 while문이 있다고 했다. for문이 in 뒤에 나오는 시퀀스(리스트나 문자열)를 돌리는 거라면, while은 특정 조건이 False가 될 때까지 계속 돌린다.

내가 이해한 걸 바탕으로 정말 쉽게 비유하자면, 아기한테 "이거 1번부터 차례대로 10문제만 풀자~~"라고 말하는 게 for문, "지금부터 덧셈 문제를 풀건데, 덧셈 말고 다른 게 나올 때까지만 풀어~~" 라고 말하는 게 while문... 덧셈만 나온다면 평생을 풀어야 할 수도 있는...

while 조건:
	실행할 코드

 

while문은 while 뒤에 조건문을 넣고 콜론(:)을 찍은 다음, 아래 행에 들여쓰기로 실행할 코드를 적어주기만 하면 된다. for문 보다 구조는 단순해 보인다. True면 실행, False가 되면 멈추고 False가 될 때까지는 계속 코드가 돌아간다. 아래 예를 보자.

i = 0
j = 1
while i < 5:
  bool = i < 5
  i = i + 1
  j = j*10
  print(f'i:{i}, Boolean: {bool}, j:{j}')
print( f'boolean: {i < 5}'  )

 

변수 i에 0, j에 1을 할당했고, i가 5보다 작다. 가 True일 때 돌아가는 while문을 적었다.

 

i가 5보다 작을 때 실행할 코드는

1) i가 5보다 작은지 판단한 True / False 값을 bool이라는 변수에 할당하고,

2) i에 1을 더하고, j에는 10을 곱해서 다시 i, j에 각각 저장한다.

3) i와 bool, j 값을 출력한다.

i가 0부터 시작하여, while문이 돌 때마다 1씩 커지도록 설정했기 때문에 5가 될 때까지 5번의 루프가 돌아간다.

 

i가 5가 되면 while 조건문이 false가 되므로 while문을 빠져 나가고, 마지막줄 print(f'boolean: {i<5}') 가 실행된다.

 

즉, 위 while문의 실행 결과는 이렇게 된다. (while문도 위에서 올린 사이트에 넣어서 과정 확인할 수 있음)


🔥연습문제

1부터 10까지 숫자 중에서, for 루프를 사용하여 모든 홀수의 합을 계산합니다. 동일한 범위에서 while 루프를 사용하여 모든 짝수의 합을 계산합니다.

 

풀어보자구! for문도 while문도 복잡하기 때문에 첨부터 완성된 코드를 적는 것보다는 하나하나 적어보는 것이 좋다.

일단 for문의 기본 구조를 생각하면서 1부터 10까지 돌아가는 for문을 적어 보자.

# 1단계: 1부터 10까지 for 반복문을 만들자.

for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
	print(i)

 

요렇게 치면 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이 출력된다. 반복문은 완성했고, 그다음

# 2단계: 홀수인지 어떻게 판별할까?

sum_odd_for = 0

if sum_odd_for %2 !=0:
	print('홀수')
else:
	print('짝수')

 

짝수는 2로 나누어 떨어지는 수이고, 홀수는 2로 나누었을 때 나머지가 1이 아니다. 이 특징을 이용하여 특정 숫자를 2로 나누었을 때 나머지( 특정값 % 2 )가 0이 아니다( != 0). 라는 코드를 적어주면 홀수인지 판별이 가능하다. 위 코드에서 sum_odd_for 라는 변수에 0을 할당했는데, 다른 숫자를 넣어보면서 코드를 돌려보면 홀수 혹은 짝수가 잘 출력되는 걸 볼 수 있다.

# 3단계: 합쳐서 for문에서 홀수를 판별해 보자.

sum_odd_for = 0
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
	if sum_odd_for %2 !=0:
    	sum_odd_for = sum_odd_for + i

 

일단 for문을 완성했다. 코드를 읽어보자.

sum_odd_for(홀수만 더할거야)라는 변수에 0을 할당했다(홀수가 나올 때마다 홀수 값을 0에다가 더할 생각)

i가 1부터 10일 때까지 for문이 돌아가며,

만약 sum_odd_for %2가 0이 아니면(홀수이면):

sum_odd_for에 i 값(홀수인 값)을 더해준다.

 

이번에는 while문을 구현해 보자.

# 1단계: while문을 구현하자.

i = 1
while i <= 10:
	print(i)
    i = i+1 	# i += 1과 동일

 

위 코드를 실행하면 i = 1부터 시작하여 i가 1씩 늘어나면서 10 이하가 될 때까지 숫자가 출력된다. 즉, 1~10 출력! if문을 사용해서 홀수인지 판별하는 코드가 "특정값 %2 != 0"을 사용했다면 짝수인지 판별하는 코드는 "특정값 %2 == 0"을 사용하면 된다. 2단계 생략, 바로 3단계로 합쳐보자.

# while문으로 1~10까지 짝수 합하기

sum_even_while = 0
i = 1

while i <= 10:
    if sum_even_for %2 == 0:
    	sum_even_while = sum_even_while + i
	i = i+1

 

sum_even_while에 0을 할당했다. 앞으로 짝수가 나오면 그때마다 더할 것이다!

i는 1부터 시작한다.

i가 10 이하인 조건이 참(True)일 때 실행되는 while문이다.

만약에 sum_even_for 나누기 2의 나머지가 0이면(짝수이면):

sum_even_while에다가 해당 값(짝수인 i)을 더한다.

i에 1을 더해서 루프가 돌 때마다 1씩 숫자가 늘어나도록 하자.

 

여기서 i에 1씩 더하기를 안하면 i는 영원히 1이라서 무한히 돌아가니까 꼭 i가 변할 수 있도록 처치를 해주자. :D

## 합쳐서 정리해서 한 번에 적어보기

sum_odd_for = 0
sum_even_while = 0

for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:   ## i는 1에서 10까지
  if i % 2 != 0:                            ## i를 2로 나눴을 때 0이 아니다(홀수)라면,
    sum_odd_for = sum_odd_for + i           ## 0+홀수값

i = 1                                       ## while은 i가 0임을 먼저 정의해 줘야 함
while i <= 10:                              ## i가 10이하인 조건이 true일 때까지
  if i % 2 == 0:                            ## i를 2로 나눴을 때 0이다(짝수)라면,
    sum_even_while = sum_even_while + i     ## 0+짝수값
  i = i + 1                                 ## i값 1씩 늘리기(while문은 리스트를 지정 안하니까)

print('홀수', sum_odd_for)
print('짝수', sum_even_while)

 

이까지 만든 코드를 모두 한 번에 적어보면 위와 같은 코드가 생성된다. 휴~ for문, while문이 힘들었지만, 이제 라이브러리 설치만 하면 파이썬 기초 부분은 끝이다! (감격) 드디어 전처리로 넘어갈 수 있다구!! 🔥🔥🔥

 

2시 반에 자다가 깨서 갑자기 목표 적다가 씻고 블로그를 켜서 글을 쓰고 있는 모닥🔥...ㅎ 괜찮다! 하루만 버티면 주말이니까 :) 잠올 때까지 다음 글을 바로 이어서 써야겠다. 화르륵🔥