IT_Python

[파이썬기초] 반복문 for. for + if/enumerate/break/continue/for 중첩

soyounism 2021. 12. 15. 10:15

for 반복문

  • while은 스스로 제어를 해야했다면
  • for는 순회가 가능한걸 자동적으로 순회할 수 있게
  • 리스트, 문자열 등등 순회 가능한 객체를 순회하면서 값을 처리할 때 사용
  • 아래와 같은 문법으로 사용
  • 여기서 i는 매번 수행 될 때마다, a의 아이템으로 순차적으로 변경 됨
  • 모든 아이템이 순회되면 for 블록 종료
# while보다는 좀 수월함.
#while에는 인덱스를 넣어서 제어했고, 실수하면 무한루프가 발생
#for는 각 원소를 그때그때 가져오기때문에

a = [1, 2, 4, 3, 5]
for i in a: 
#a를 순회하는데, 각 원소를 i에 대입하겠다
    print (i, i * 2)
print('for문 끝')

결과:

1 2

2 4

4 8

3 6

5 10

for문 끝

 

#number는 현재의 원소. i로 해도되고 그냥 변수로 생각
a = [1, 2, 4, 3, 5]
for number in a:
    print(number)
print('hahah')

결과:

1

2

4

3

5

hahah

 

문자열의 아이템 출력하기

  • 문자열의 경우 순회 가능, 리스트의 유사하게 순회 가능
#정수형은 순회x. 
#순회할 수 있다는 것은 순서가 있다, 인덱스가 있다.
for x in 10:
  print(x)

결과:

#문자열은 순회할 수 있으니까. 뭐 리스트나

for x in 'hello world':
    print(x)


#같은 코딩

# a = 'hello world'
# for character in a:
#     print(character)

결과:

h

e

l

l

o

 

w

o

r

l

d

 

리스트 아이템 출력하기 (for + if)

#짝수인경우: /2의 나머지 출력
#홀수인경우: +1 값 출력

a = [1, 10, 3, 4, 5]
for num in a:
    if num % 2 == 0: #(조건)나머지가 2인것이면,
        print('짝/2', num/2) #/2 의 값
    else:
        print('홀+1', num+1)

결과:

홀+1 2

짝/2 5.0

홀+1 4

짝/2 2.0

홀+1 6

 

 

dict의 아이템 출력하기

  • dictionary의 경우 기본적으로 순회 하게 되면 key값을 참조
  • keys()함수를 이용하여 key 값만 순회 가능
  • values()함수를 이용하여 value 값만 순회 가능
  • items()함수를 이용하여 tuple형태로 key, value 순회 가능
#dict 순환가능하지만, 그냥하면 키만 가져옴 
a = {'korea': 'seoul', 'japan': 'tokyo', 'canada': 'ottawa'}
for k in a:
    print(k) #키만 출력

print('----')

for k in a:
    print(k, a[k]) #a[k]로 값을 가져오자

결과:

korea

japan

canada

----

korea seoul

japan tokyo

canada ottawa

 

#함수로 호출
for v in a.values(): #values()함수로 값만 출력
# for v in a.keys(): 키만 출력
    print(v)

결과

seoul

tokyo

ottawa

 

*참고

https://s-s-o-story.tistory.com/48

 

 

a.items()
list(a.items()) #튜플을 원소로 갖는 리스트

결과

[('korea', 'seoul'), ('japan', 'tokyo'), ('canada', 'ottawa')]
 
 
#튜플인경우에는 ' , '를 이용해서 두개의 값을 한꺼번에 받아올수 있다
for k, v in a.items():
    print(k, v)
 
결과
korea seoul
japan tokyo
canada ottawa
 
 

for에서 index 사용하기

  • 기본적으로 for에 리스트를 순회하는 경우, 값만 추출 함
  • 아래와 같은 코드로 인덱스와 값 모두 사용 가능(enumerate 함수 이용)

 

#인덱스와 값 둘다 가져오기

#while경우에는 index를 가지고 제어. 증가시키면서 진행.
#for가 인덱스가 필요한경우 in enumerate를 쓰자!

a = [1, 2, 3, 4, 5]
for i, num in enumerate(a):  #인덱스, 값 둘다 가져올 수 있다
  print(i, num)

 결과

0 1

1 2

2 3

3 4

4 5

 

#while로 했을때
a = [1, 2, 3, 4, 5]
i=0
while i<len(a):
  print(i, a[i])
  i+=1

 위와 같은 결과

a = [1, 2, 3, 4, 5]

for i, x in enumerate(a): 
    if i > 2:  #인덱서 3번자리부터. 
              #인덱스가 같이나오니까 인덱스로 조건 제어 가능!
        print(i, x)

결과

3 4

4 5

 

break

  • for의 경우에도 특정 조건일 때, loop 종료가 가능
a = [100, 90, 80, 70, 60, 50]
for num in a:
    print(num)

 결과

100

90

80

70

60

50

 

a = [100, 90, 80, 70, 60, 50, 81]
for num in a:
    if num < 80:#값이 80보다 작으면 종료하고싶어.
        break
        
    print(num)

#80보다 작은 70,60,50값이 출력되지 않음
#가장 마지막 81은 출력되지 않았음. 80보다 작은 70에서 코드 중단

 결과

100

90

80

 

continue

  • 해당 아이템을 건너 뛰고 싶을 때 사용
a = [100, 90, 80, 70, 60, 50, 81]
for num in a:
    if num >= 60 and num <= 70: #60<=num<=70 건너뛰겟다
        continue
    print(num)

#60이상 70이하인 60, 70은 빠짐.
#마지막 81도 출력됨

 결과

100

90

80

50

81

 

 

loop 중첩

  • 반복문의 경우에도 중첩하여. (여러 뎁스에 걸쳐서.) 반복에 반복! 사용 가능
  • 중첩이라는 것은 반복문 블록의 코드안에 또 반복문의 코드가 작성되는 것을 의미
  • 이런 경우, 내부 루프는 외부 루프가 수행되는 만큼 반복 수행 됨
  • 또한 중첩의 경우 무한히 가능
a=[1,2,3]
for i in a: #1.
  for j in a: #2.
    print(i*j)

#1. a리스트를 i변수로 순회. 처음 i=1
#2. a리스트를 j변수로 순회. 처음 j=1 -> 1*1출력

#3. 2번for로 가서 j=2(i=1인상태) -> 1*2출력
#4. 다시 2번 for로 가서 j=3(i=1인상태) -> 1*3출력
#=> 2번 for에서 리스트 1,2,3을 모두 돌았으니까, 1번for로 감

#a리스트 i=2로 다시 수행

#결과적으로 9개 출력
#i가 1일때-> j: *1, *2, *3
#i가 2일때-> j: *1, *2, *3, 
#i가 3일때-> j: *1, *2, *3

 결과

1

2

3

2

4

6

3

6

9

 

 

구구단 출력하기

# 2 * 1 = 2
# 2 * 2 = 4
# 2 * 3 = 6
# ...
# 2 * 9 = 18
# 3 * 1 = 3
# ..
# 3 * 9 = 27
# ...
# 9 * 1 = 9
# ...
# 9 * 9 = 81
 
x = [2, 3, 4, 5, 6, 7, 8, 9] #몇단
y = [1, 2, 3, 4, 5, 6, 7, 8, 9] #곱할수

for i in x: #단
    for j in y: #곱할수
        print(i, 'x', j, '=', i*j)


# while문으로도 바꿀 수 있어. for와 while차이거의 없어 그냥 구문의 차이일 뿐

 위 구구단 결과

2 x 1 = 2

2 x 2 = 4

2 x 3 = 6

2 x 4 = 8

2 x 5 = 10

 ...

 

i = 1  #i단
while i < 10:
    i = i + 1
    j = 1
    while j < 10: #곱할꺼
        print(i, 'X', j, '=', i*j)
        j = j + 1

 결과 동일

 

 

collection의 길이

  • 문자열, 리스트, dict 등, 값을 담고있는 것들은
    • len() 내장함수로 계산 가능
    • 내장함수란 파이썬 내부에 구현되어 있어서, import하지 않고도 사용 가능한 함수를 의미
    • abs, len, type, range 등이 있음 (과정 진행하면서 필요할 때마다 다룰 예정)
a = [1, 2, 3, 4, 5, 1]
print(len(a))
len('hello world')

결과

6

11

 

range 함수

  • 리스트를 쉽게 만들 수 있는 내장함수
  • 주어진 값에 따라 다양한 결과를 반환

 

  • 1 - 100까지의 리스트 생성하기
range(10)
 결과
 
range(0, 10)
 
 
#리스트로 변환해주면, 숫자에 해당하는 리스트로 만들어줌
list(range(10))
 
결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
a = list(range(2, 10)) #2부터~ 마지막 숫자 전까지
print(a)
 
결과
 
[2, 3, 4, 5, 6, 7, 8, 9]
 
 
 
  • 연습문제 1부터 50사이의 5의 배수만을 갖는 리스트를 생성하시오
list(range(5, 51, 5)) #마지막에는 건너뛰는 숫자
 
 결과
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
 
 

if & for 연습문제

  1. 구구단을 2 - 9단까지 출력하시오.
  2. 1 - 100까지 정수 중 2의 배수 또는 11의 배수를 모두 출력하시오.
  3. a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 최대값과 최소값을 찾으시오. (sorted, sort 사용 금지)
  4. a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 평균을 구하세요.

 

  1. 구구단을 2 - 9단까지 출력하시오.
#이전에 for문에서 구구단 출력하기
x = [2, 3, 4, 5, 6, 7, 8, 9] #몇단
y = [1, 2, 3, 4, 5, 6, 7, 8, 9] #곱할꺼

for i in x:
    for j in y:
        print(i, 'x', j, '=', i*j)
 
x=2 #2단부터
while x<=9: #9단까지
  y=1 #y는 계속 초기화가 되야되. 그래서 여기에
  while y<=9:
    print(x,'*', y, '=', x*y)
    y+=1
  x+=1 #바로뒤에 while문 다돌면, +1단해서 다시 돌아야지. 2~9단까지 1씩 증가​

 

 

2. 1 - 100까지 정수 중 2의 배수 또는 11의 배수를 모두 출력하시오.

#1 - 100까지 정수 중 2의 배수 또는 11의 배수를 모두 출력하시오.

n=list(range(1,100)) #1~100까지 정수들 list
for x in n: #리스트 원소를 x로 잡아서
  if x%2==0 or x%11==0: #2의 배수(/2나머지0) 또는, 11의 배수(/11나머지0)
    print(x)

결과

2

4

6

8

10

11

...

 

 

 

3. a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 최대값과 최소값을 찾으시오. (sorted, sort 사용 금지)

# sort 함수(정렬)을 사용한 경우
a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45]
a.sort()
a[0], a[-1]

결과

(1, 99)

 

#방법 : 처음 만나는 숫자를 최소값으로 생각하고
#다음숫자로 넘어가면서 지금 숫자보다 작으면 그 숫자를 최소값으로 업데이트 하는 구문

a = [22, 98, 54, 76, 34, 3, 45]

mini=a[0] #a[0]초기값. a리스트의 첫번째 값.
for x in a: #a리스트의 원소 x를 반복할껀데 
  if x < mini: #만약 초기값mini가 x보다 작으면,
    mini=x  #mini가 x로 업데이트. 작을 경우 그 작은 값으로 업데이트
  print('mini값 변화', mini)
print('마지막mini. 최소값', mini)

결과

mini값 변화 22

mini값 변화 22

mini값 변화 22

mini값 변화 22

mini값 변화 22

mini값 변화 3

mini값 변화 3

마지막mini. 최소값 3

 

# 최대 최소 동시에

a = [22, 98, 54, 76, 34, 56, 9, 7, 5, 3, 45]

mini=a[0]
maxi=a[0]
for x in a:
  if x<mini:
    mini=x
  if x>maxi:
    maxi=x
print(mini, maxi)

3 98

 

 

 

4. a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45] 에서 평균을 구하세요.

a = [22, 1, 3, 4, 7, 98, 21, 55, 87, 99, 19, 20, 45]


#while


i=0
isum=0 #평균 담을 변수
while i<len(a):#돌아야지
  isum+=a[i] #isum 변수0에 반복해서 a를 하나씩 더해줘 a[0]인 22부터
  i+=1
print(isum/len(a))

결과

37

 

# for

#for에서는 인덱스 필요없고 
isum=0
for x in a :
  isum+=x
print(isum/len(a))

결과 동일