본문 바로가기
파이썬 독학일지

파이썬 독학일지-C4(주피터 노트북/인트로덕션 투 파이썬)

by 통합메일 2021. 7. 31.
반응형

C4-1.for문으로 5의 배수가 아닌 수를 출력하라!

대강 이해는 간다. 30마다 엔터

200~800 사이의 범위에서 수열을 만들고

수열이 5의 배수가 아닐 때마다만 print("%d" %i, end=" ")로 정수 나열하고 한 칸씩 띄운다.

그때마다 count를 세고

count가 30이 될 때마다 print()로 엔터를 친다.

10마다 엔터

근데 여기서 if count%10==0:의 위치가 중요하더라

이게 무슨 차이일까. 두번째 if를 앞으로 당기면 이런 증상이 생긴다.

if만 앞으로 보냈을 뿐인데.. 왜 20번마다 엔터를 한 번씩 더 칠까?

if가 뒤에 있는 거랑 앞에 있는 거랑 무슨 차이일까?

 

count=0

for i in range(200, 801):
    if i%5!=0:
        print("%d" %i, end=" ")
        count=count+1
    
        if count%10==0:
            print()

이렇게 쓰면 if 밑에 if가 들어가니까.. 뭔가 맨 윗줄에 있는 count=0의 영향을 안 받는 것 같고

count=0

for i in range(200, 801):
    if i%5!=0:
        print("%d" %i, end=" ")
        count=count+1
    
    if count%10==0:
            print()

이건 맨 윗 줄의 count=0의 영향을 받는 것 같다.

실험을 해보자

count=0을 for문 아래로 내렸다. 그랬더니 if count%10==0: print()가 하나도 안 먹는다. -_-;;

for로 명령이 반복될 때마다 count가 0으로 리셋되면서 매 횟수마다 count+1을 하니까 count는 언제나 1이 되는 것이다. 그러니까 if count%10==0: print()이 작동할 여지가 없다. 그러니까 count를 for 밑으로 내리면 안 된다. 그러면 count를 쓰는 이유가 없어진다.

 

그럼 다시 문제는 원점으로 돌아간다. 다시 따져보자 if가 if 밑에 있는 거랑, for 바로 밑에 있는 거랑 무슨 차이가 있는 걸까? 이건 함수니까 함수대로 해봐야겠다.

 

  i       count(if아래)       count(for아래)

200 X     0                        0

201       1(동작 안 함)          1 

202       2(동작 안 함)          2

203       3(동작 안 함)          3

204       4(동작 안 함)          4

205 X                               4

206       5(동작 안 함)          5

207       6(동작 안 함)          6

208       7(동작 안 함)          7

209       8(동작 안 함)          8

210 X                               8

211       9(동작 안 함)          9

212       10(엔터)                10(엔터)

213       11(동작 안 함)        11

214       12(동작 안 함)        12

215 X                               12

216       13(동작 안 함)         13

217       14(동작 안 함)         14

218       15(동작 안 함)         15

219       16(동작 안 함)         16

220 X                               16

221       17(동작 안 함)         17

222       18(동작 안 함)         18

223       19(동작 안 함)         19

224       20(동작 안 함)         20

225 X                                20

위에 있는 거랑 똑같은 결과다. 참고용으로 다시 붙임.

아니 근데.. if가 for 밑에 있어서 첫if랑 두번째 if랑 동위에 있다 하더라도.. count는 201부터 들어간다.

Solution!

: 하위if를 하지 않을 경우 첫번째 if가 작동되지 않음에 따라 count가 한 번 제자리 걸음을 하는 순간이 있는데.. 4 8 12 16 20의 템포로 흘러가는데 그렇다보니까.. 10마다 엔터를 치게 만드면 4 8 12 16 20....의 경우 20번에 한 번씩 엔터를 두번 치게 되는 것이다. 그렇다면 만일 4마다 엔터를 치게 만들면 매 행마다 엔터를 두번 치려나?

그렇다 예상대로 4마다 count+1의 제자리걸음이 발생해서 매 행마다 엔터를 두 번 치게 된다.

그렇니까 이러한 현상의 원인은 결국 5의 배수가 아닐 경우 if가 작동하지 않고, 그런 상황에서 하위if를 걸치 않으면 count가 제자리걸음을 하는 순번이 발생하는데 그런 순번들ㅈ ㅜㅇ 10의 배수인 순번에서는 10이 두번 나오니까 엔터를 두 번 치게 되면서 이런 문제가 발생하는 것이다. 따라서 이러한 문제를 해결하기 위해서는 하위 if를 이용해서 count가 제자리 걸음하지 않게, 그러니까 i가 5의 배수가 아닐 경우에는 if count%4==0: print()도 작동하지 않도록 해야한다.

 

그럼 혹시 count=count+1을 for와 첫if 사이에 두면 어떨까?

그럴 경우에는 첫if에 상관없이 별도의 count에 따라 10마다 엔터를 칠 것이고 좀 개판이 되지 않을까?

다행히 완전 개판은 아니고

다만 내가 의도했던 대로 10마다 엔터를 치는 게 아니라

8마다 엔터를 치게 된다. 5의 배수가 아닌 순번이 두 번 발생하니까.

(와 그나저나 하위 if 띄어쓰기 좀 틀렸다고 곧 바로 에러가 나냐)


C4-2.for문으로 길이 환산표를 만들어라

 

 

 


C4-3.for문으로 별표(*)트리를 만들어라!

 

 

 


C4-4.C4-3의 트리 모양을 변경하라!

 

 

 


C4-5.for문으로 홀수의 개수를 카운트하라!

 

 

 


C4-6.for문으로 무게 단위 환산표를 만들어라

 

 

반응형

댓글