Oxygen Cherry - Pencil
본문 바로가기

공부, 연구/개발

for 반복문, while 반복문 - [파이썬 기초 5일차]

728x90

 

[프리코스] 파이썬 기초 특강 5일차 

❇️ 오늘 배운 내용 
1. for 반복문 
2. while 반복문 
3. 반복문 인수 - break, continue 

 

 

 

주요 개념

 

for 반복문  break    리스트 컴프리헨션   
while 반복문         

 

 

 

어제자 간단 복습 

 

  1. 리스트 - 인덱싱[ ], 재할당, POP 제거, append 추가  
  2. 리스트 슬라이싱[첫, 끝, 간격] (0, 마지막 위치+1)
  3. 문자열 " " , 문자열 포매팅 f"ddd {변수, 연산식 등} ddd" 
  4. 튜플 - 문자열의 특징(수정x) + 리스트의 특징(여러 자료형 ㅇ)
  5. range() 수열 뽑는 거
  6.  in / not in
  7. for 반복문  

 

<복습 문제> 

# 문자열 리스트의 원소를 반복문으로 정수(int)로 변환하고 출력하라. 

n = [ "1", "2", "3"] 


# 내가 풀어봄
for i in n: 
	int(i)
    type(i)
    
이러면 
int
int
int
로 나올듯


# 리스트 컴프리헨션으로 하면 이렇게 하는 거. 강사님이 맞다고 하셨음. 

[int(i) for i in [ "1", "2", "3"]]

 

 

강사님의 풀이 

원래 숫자랑 타입이랑 같이 하나씩 뽑는 방법인듯. 

 

1 int 

2 int

3 int 

이케 나올듯. 

 

---

이거 보고 리스트 컴프리헨션이라고 아는 척 했더니 

강사님이 컴프리헨션은 안쓴다고 하셨다. 

 

어리둥절해서 찾아보니까 

내가 어제 til에 적은 건 잘못된 내용이었다. 참고한 자료가 잘못된 게 아니라, 내가 잘못 알았던 거임... 

>>> a = [1,2,3,4]
>>> result = []
>>> for num in a:
...     result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]

어제 til에 이거 자체는 for문임. 컴프리헨션이 아님.. 

 

[i*10 for i in range(5)]

 

대충 이런 식으로 만드는 게 컴프리헨션인가봐. 속도 빠르게 하는 방법이래. 

 

조건문이랑 반복문으로 걸러낸 것만 리스트에 넣으려면 

컴프리헨션 방식으로 하는 게 더 효율적이다~ 그런 내용임. 

 

관련 설명: https://bio-info.tistory.com/28 

 


for 반복문의 유형 

 

강사

 

 

💠 range 반복문 

[range로 반복문 맹글기]

#기본 원리
- range는 리스트 안만들어줘도 모아서 출력함. 
- range 자체가 일종의 리스트 같은 거기 때문!
- 원래 for문 안에 print 넣으면 하나씩 뽑아주니까, for문 밖에 있는 리스트 변수를 가져와서  
리스트 변수 이름.append(for문에 쓰인 가상 변수, 대체로 v나 i라고 씀) 
이칸 다음에 for문 밖에서 리스트 출력하든 해야 되는 거였다~ 


#문제. 2부터 20까지 짝수만 뽑아라 

for i in range(2, 21, 2): 
   print(i)
   
   
# FOR 안의 내부 변수 생략하는 법: 언더바(_)

for _ in range(5): 
	print("크크루삥뽕")

이러면 이제 크크루삥뽕이 5번 나옴.

 

end = ""는 왜 붙인 거지. 띄워쓰기 용인가? 원소 끝에 한칸씩 띄워준다는 거겠지? 

 

 

 

[핵심]

  • range는 하나의 리스트 같은 거라서 알아서 모든 원소 합쳐서 뽑아준다. 
  • print(리스트나 레인지 등 복합 원소 자료형, end= " ") 
    print 인수로 end = 를 쓰기! 

 

 

💠 list 인덱스 위치를 활용한 반복문 

#len(리스트) - 리스트의 길이(갯수)를 알려주는 함수 
- 리스트의 끝위치: 리스트의 길이 - 1 


len(list1)
→ 4

end = len(list1)
(파이썬 수열에서 끝 정수는 포함 안되니까 -1를 할 필요는 없음.) 


list = [1, 2, 3, 4, 5, 6, 7]

#
for i in range(0, end)
	print(i)
    
 
# 인덱스 값으로 원소에 접근해서 뽑아내는 것. 
for i in range(0, end)
    print(list1[i])

- range로 첫번째 순서의 값(인덱스 값 0)부터 
리스트의 길이인 end까지 반복하는 수열을 만든 다음 
그거 하나하나로 인덱스를 해서 리스트를 뽑는 것. 

list1 안에 원소가 총 4개면 길이가 4겠지. 
그럼 range는 정수 수열을 뽑는 거니까 0 1 2 3 까지 뽑을 거야. (마지막은 안쳐줌) 
그걸 인덱스로 활용해서 리스트에 위치값으로 쓴 거지.... 


#인덱스로 접근하는 게 왜 필요한가요? 
- 문제. 위치가 3 이상인 것만 뽑아라. 

list2 = [0, 4, 1, 7, 2, 9, 10] 


-- 아래는 내가 풀어본 것들임. 강사님께 여쭤봄 

-- 전부 모아서 출력하는 방법들  

print(list2[3:])  ◯

or 

print(list2[3:len(list2)]) ◯

or 

end = len(list2)
print(list2[3:end]) ◯

or 

end = len(list2)
print(list2[3:-1])  X 


왜냐면.. -1이 끝이잖아.. 근데 마지막 거는 처리 안해주니까 -2까지만 뽑아줌.... 
그럼 (-1)+1 하면 안되나?! 0은 맨첨이잔아 



-- 하나씩 따로 출력하는 방법 

for i in list2: 
   print(i[3:])     X 

or

end = len(list2)

for i in range(3, end): 
   print(list2[i])    ◯



---
range(0, len(list)) 혹시 이래도 되나?

그럼 어떤 리스트든 그 길이만큼 횟수를 반복하게 하려면.. 
len() 안에 리스트가 어떤 거든 들어갈 수 있게... 

def 해서 함수를 만들어야 하나?? 

def 함수()
해가지고 

for ... in len(x)
이러면 그 길이만큼... 아 근데 원소를 하나씩 넣어야 해서 안되겟다 
n회 반복하게 하려면 range로 정수 목록 만드는 수밖에 없나

 

 

< 강사님 풀이 >  

정석 풀이 

 

조건문 써서 거르는 법 

 

 

확인해볼 것 

  • print 인수 end 말고도 잇겟지..   

 

  • range는 하나의 리스트 같은 거라서 알아서 모든 원소 합쳐서 뽑아준다. 
    • 그럼 in에다가 range 넣었는데 원소 하나씩 출력하고 싶을 땐 어떻게 함? 걍 따로 밖에서 변수에다가 range 할당하는 수밖에 없나? 
    • 그럼 in에다가 list를 넣으면 그것도 하나로 모아서 출력해줌? 
      for i in [1, 2, 3]: 
      print(i + 1)
      이러거나 
      i = i +1
      print(i) 이러면은... 

      관련한 궁금증 어제자 til에 적긴 했음. for 문 밖인가 안인가에 따라 다를까 해서... 
      어제거는 range 였지만. 

 

 

 

추가 설명

  •  ㄹㄹ 

 


while 반복문 

 

FOR은 반복해야 할 횟수나 범위가 정해져 있을 때. 

WHILE은 어떤 조건만큼 반복하고 싶을 때. 

 

💠리스

 

1 하

 

 

# while 조건문 주의할 점 
- 적절한 변화구를 안넣으면 영원히 반복됨. 
for문은 얼마나 반복할 건지를 list나 range로 지정해주니까 괜찮은데 
while은 그렇지 않아서 조건이 변화하도록 해야 함. 
- 아님 break를 잘 넣던가. 
- 조심하지 않으면 컴 터짐. 


# 예제
n = 1 

while n != 11: 
	print(n)
    n = n + 1 
    
1씩 증가하면서 넘버의 값을 넣겠다. 

1
2
3 
... 
10 
나옴 

10 뽑고 그걸 11로 바꿔줬으니 
11에 걸려서 끝난 거임. 


while n != 11: 
   n = n + 1 
   print(n)

2
3
4
...
11
나옴 

10일 때 그걸 11로 만들어서 뽑은 다음 
11에 걸려서 끝남.



#문제. 2를 곱한 값을 출렬하는데 1000이하여야 함. 
n = 2고 출력값은 2 4 8 16 32... 여야 됨. 

while n <= 1000:
	print(n)
    n = n *2 
    

---
for n in range(2,1001):
	print(n)
	n = n *2 
    
이러면 2 3 4 ...가 될 거 같은데.. 
왜냐면 range를 하나씩 넣으니까...
=> 강사님께 여쭤보니 2 3 4 이케 나오는 거 맞다고 함. 

그러면 for문으로는 어떻게 만들지...

 

 

강사님이 풀이해주신 부분 

이 문제는 while 쓰는 게 효과적이지만 그럼에도 for문 써서 푸는 법은 이러함. 

 

for n in range(2,1001):
	print(n)
	n = n *2

이게 틀린 이유

 

내부 변수 

n 을 저장안해주는 

 

 

 

💠반복문에 break 쓰기 

# break는 꼭 if 안에 있어야 함. 

--- 
for _ in range(0, 4): 
	print("hello")
    break 
    
하면 아예 반복이 안됨. 


# 헬로우를 3번 외치게 하고 싶다! 
for i in range(0, 4): 
	print("hello")
    if n = 4
   	 break 
이건가? 

#for break 예문 

for n in list3: 
	print(n) 
    if n > 10 
    	break 
        
이케 하면 리스트 안의 원소에서 10보다 큰거 일단 출력하고 종료함. 
그래서 조건 검사를 먼저 해야 함. 

for n in list3:
    if n > 10  
		break 
	print(n)

이럼 for안에 if와 print가 있게 되는 거임. 
리스트 안의 원소들 중에 10보다 적은 거만 뽑아줌. 
(근데, 0, 2, 4, 11, 15 순서가 아니라 0, 2, 11, 4 순서라면? 
저 방식은 11 만나면 바로 깨지자나. 
그럼 먼저 리스트를 정렬부터 해야 하나? 그건 sort였던가? 
아니면 ....)


# while로 break 하기 ?

n = 1 

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

 

 

 

브레이크를 일단 만나면 밑에 코드가 몇개가 있든 작동 안하고 반복문을 강제종료 시킴. 

브레이크는 조건문과 같이 쓴다. 

 

 

#무한 반복

while True: 


#while 반복문과 break 실습 

#문제. 임의의 무한 반복문에서, 변수에 더하기 10한 값을 반복 출력. 100 초과하면 반복문 종료. 


n = 10 
    
n을 출력한 다음 n에다 10을 더하는 코드가 무한히 반복된다. 
그러나 만약 100을 넘어버리면 없애라! 


while True: 
	print(n)
    n = n + 10 
   
   if n > 100: 
   print("만점 달성!")
   	break 
    
이케 하면 100도 뽑히니까 


while True: 
   if n > 100: 
   	break 
    
	print(n)
    n = n + 10
    
    
100 안뽑히게 하려면 이렇게?


#사실 while은 break 안써도 가능함. 당연함 그게 while임 

while n <= 100: 
	print(n)
    n = n + 10

 

리스트 안의 값이 n을 넘으면 그만 하게 하는 거 while로는 어떻게 하지? 

리스트 안의 원소를 하나하나 가상 변수 안에 대입해서 따져주는 게 for이니까 

for로 하거나 부족하면 for 안에 if 넣으면 되는데 

그걸 while로 하려면...? 

인덱스로 원소에 접근을 해서... 

 

for n in list3:
    if n > 10  
		break 
	print(n)

일단 for로는 이렇게인데... 

 

리스트 컴프리헨션으로는 if와 break를 구현 못하나? 

1 2 11 3 4 라고 치면 

위에 코드는 1 2 까지만 나옴. 

 

[ n > 10 for n in list3]인가??? 아니라고 강사님이 하심. 

 

[ n < 10 for n in list3] 라고 하면 1 2 3 4 

(또는 브레이크 안쓰고 이프만 하거나... 또는 정렬 후 이프 브레이크 하거나)

 

 

위에 코드는 10보다 크면 종료한다 = 10보다 크면 출력 안한다 = 10보다 작은거만 뽑겟다 

리스트 컴프리헨션 은 리스트를 생성하기 위한 문법이지, 리스트 내부의 원소를 가지고 뭔가 하는 게 아님. 

이걸로는 1 2 11까지만 못뽑음 (만약 

 

브레이크랑 컨티뉴는 반복문 제어라서 컴프리헨션 안에서 못쓰는 게 맞음. 

브레이크 컨티뉴랑 전혀 상관없음 리스트 컴프리헨션은. 

 

초보 기준에선 헷갈리니까 안쓰는 걸 추천. 

강사님은 절대 수업에서 컴프리헨션 안가르치신다고 함. 

이것의 필요함을 느낄 때 쯤이면 실력이 올라와서 그런 거. 

for의 기초를 잘 익혀야  안헷갈림.. 기초도 잘 모르는데, 이게 좋다면서 쓰면 헷갈리기 딱 쉬움. 

반복문 조건문은 파이썬의 꽃이기도 해서 조금만 복잡해져도 헷갈리니까... 

 

리스트 컴프리헨션은 딱 봐도 누구나 이해할 수 있을만큼 직관적이진 x 

그냥 아는 사람들의 줄임말인 거임. 

직관적이고 간결한 건 걍 주석달기임.... 

 

만약 저대로 쓰면 간단하지만, 복잡한 생성 코드로 리스트 컴프리헨션을 한다면 보기 힘듬. 

차라리 for문으로 풀어쓰는 게 더 이해가 쉬움. 주석을 잘 달면서. 

 

* 성능에 있어서 코드 길이가 중요하지 않음. 

리스트 컴프리헨션이 효율과 성능을 높이는 건 로직이 달라서 그런 거지 짧아져서는 아님. 

약간의 성능 차이라서 초보자 단계에서는 필요없음. 

 

 

 

💠반복문에 break 쓰기 

 

 

질의응답

 

  •  간격이 1이면 소수
    ㄹㄹ
  • ㄹㄹ
    ㄹㄹ

 

 

실습 문제

 

 

 

ide 써서 꼭 실행시키기.. 

코드 블럭은 코드를 쓰는 거라고 생각하면서 쓰기 (설명 꼭 주석 구분해서 적기) 


여담

 

 

1. 나

 

리스트 컴프리헨션 옜날 옜적에 파이썬 기초 수업에서 본 거 같은데... 

그리고 어제 본 참고자료에서 리스트 컴프리헨션이 무엇인지 대충 본듯.. 

어제 빨리 til 써야 해서 마음이 급했긴 했어! 

 

하나를 알 때도 제대로 알아야 더 기억에 남겠다는 생각이 듬. 

 

 

2. til 양식의 한계 - 티스토리의 한계 ㅋㅋ 

 

나 같은 경우는 수업 내용만 딱 적고 끝나는 게 아니라 

꼬리에 꼬리를 무는 질문을 만든다. 

그걸 찾아본 거랑 안찾아서 찾아봐야 하는 걸로 분류해야 한다. 

내가 따로 찾아본 내용이랑 강의에서 배운 내용 어케 구분할 건데... 

 

그리고 실습 문제 

내가 푼 거, 내가 푼 거 맞은 이유(강사님이 쓴 코드랑 다른데도)/틀린 이유, 강사님이 보여준 정답 

 

내가 잘못 알고 적었는데 나중에 보니 맞았던 거

를 적어야 함. 

몬 소리냐면 어제자 til에 '리스트 컴프리헨션' 이거래! 라고 적었어 

근데 그게 아닌 거를 오늘 수업에서 알게 되었어 (만약 오늘 수업에서 컴프리헨션 배웠다 쳐) 

그러며는 갱신이 되어야 할 거 아냐? 

 

먼 미래의 내가 

아 컴프리헨션 배웠는데 뭐드라~ 해가지고 블로그에 검색해. 

최초로 나온 학습 노트에서 기초 개념이 나와있겠거니 하고 봐. 그렇게 잘못 알게 돼. 

 

좀 아니자나? 

 

이 문제를 해결해주는 필기 방식 없나? 

 

일단 그 뭐냐 개발자들 많이 쓰는 초록색 블로그는 목차 기능 있어서 유용해보이던데.... 

728x90