10. for
이터너블(순회 가능한) 요소를 하나씩 꺼내서 실행 블록에 전달하는 반복문
동일한 작업의 반복 실행시켜 가독성과 유지보수를 올리고 자동화, 대량처리에 사용된다.
이렇게 써먹기 위함이다.
리스트로 생성, 반복
fruits = [ 'apple' , 'banana' , 'cherry' ]
for fruit in fruits : #fruit = 리스트 안에 있는 개체 명칭 의미
print ( f "I like { fruit } " )
리스트 요소대로 출력
문자열 반복
my_str = "apple"
for char in my_str :
print ( char )
쪼개서 내준다.
문자열은 문자 하나하나가 반복대상인데, 문자열은 순서있는 시퀸스이니 인덱스 접근, 반복문 순회 둘 다 가능하다.
#튜플 반복+ 변수 값 분해
coords = [( 1 , 2 ),( 10 , 15 ),( - 6 , 10 )]
#언패킹 (X,Y)구조 (구조 분해 가능)
for x , y in coords :
print ( f "x 좌표 { x } y 좌표 { y } " )
튜플의 경우 구조 분해를 활용해 동시에 여러 값을 unpack 가능
#딕셔너리 반복 -key 순회 : dict 파일에서 한번 복습, 이해하기.
person = {
"name" : "kim" ,
"age" : 15 ,
"address" : "seoul"
}
# 기본
for key in person :
print ( f "key: { key } , value: { person [ key ] } " )
# value 만 가져오기
for value in person . values ():
print ( f "value: { value } " )
# items 가져오기
for key , value in person . items ():
print ( f "key: { key } , value: { value } " )
딕셔너리 정보를 입력하고, for문으로 나눠서 지정 가능하다. key만 하면 key로 저장된 것만.
딕셔너리{key}는 자료 인덱스 지정처럼 key가 인덱스 좌표로 인지되어 value 값으로 출력되는 거다.
#set 반복
my_set = { 1 , 2 , 3 , 4 }
for key in my_set :
print ( key )
set은 순서 없고, 중복도 없는 자료형이나 반복문이 된다. 단 출력할 때 순서는 예측할 수 없다.
#리스트 값을 두 배로 변환
numbers = [ 3 , 6 , 1 , 8 , 4 ]
for number in numbers :
print ( number * 2 )
#모범 답안
이건, 리스트의 2배 결과물을 새 리스트에 저장한다 문제여서 이런 코드를 작성하는 게 모범이라고 써둔 듯 하다.
numbers = [ 3 , 6 , 1 , 8 , 4 ]
doubled = [] #새 리스트 생성
for number in numbers :
doubled . append ( number * 2 ) #새 리스트에 바뀐 변수값을 넣겠다는 뜻
print ( doubled ) #[6, 12, 2, 16, 8] 출력
위에 쓴 코드와, 모범답안 코드도 확연히 다르다...
예전에 요소는 하나하나 입력해야 알아듣는다고 했는데 그럴 필요 없다!
#문자열 길이 구해서 새 리스트 만들기
words = [ "apple" , "banana" , "kiwi" , "grape" ]
for word in words :
length = len ( word ) #새로운 리스트를 생성해서 저건 word(변수)의 길이값이다 함.
print ( length )
문자열의 개수를 각각 세주고 있다.
# 좌표 튜플에서 x, y 좌표나누기
#이 문제 읽고 만들었던 코드는 이랬고.
coordinates = [( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 ), ( 7 , 8 )]
for x_values , y_values in coordinates :
print ( f "x 좌표 { x_values } y 좌표 { y_values } " )
#모범답안은 달랐는데 해당 리스트 만들어서 추가해 출력으로 봐야 하나보다.
coordinates = [( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 ), ( 7 , 8 )]
x_values = []
y_values = []
for x , y in coordinates :
x_values . append ( x )
y_values . append ( y )
print ( x_values , y_values )
리스트에 저장된 것만 출력하면 되니 요소만 나왔다.
for 문과 range()
range 함수 : 지정된 범위의 정수 시퀀스 생성
기본 문법
range(start,end,step)
start: 생략 가능, 기본 0 / end: end -1까지 생성 / step: 생략 가능 기본 값 1
for i in range ( 1 , 5 ):
print ( i )
#동일한 맥락이다.
for i in [ 1 , 2 , 3 , 4 ]:
print ( i )
둘 다 똑같이 작동한다.
#start 생략
for i in range ( 11 ):
print ( i )
0-10까지 출력
#간격(step) 지정
for i in range ( 0 , 11 , 2 ):
print ( i )
0 2 4 6 8... 출력
for i in range ( 11 , 0 , - 2 ):
print ( i )
11 9 7 ... 출력. 음수로 지정하면 역순으로 출력한다.
이제 이를 활용한 실습 코드.
실습 1 입력받은 수의 합 구하기
num = int ( input ( "수 입력: " )) #먼저 사용자가 입력할 값 구한다.
num_total = 0
for n in range ( num + 1 ):
num_total += n
print ( num_total )
1+2+3+4+5 = 15
for i in range ( 11 ): 에서 10까지만 출력되는 것처럼 for n in range(6)으로 계산해야 5까지 반복한다.
#구구단 만들기
이건 전체 구구단 만드는 것 (a와 b 범위 지정 곱하기)
for a in range ( 0 , 10 ):
for b in range ( 1 , 10 ):
print ( a , '*' , b , '=' , a * b )
반복문 만들 때 연습하기 좋은 건 구구단인 모양이다. 반복문 중첩시켜서 만들었는데.
a = int ( input ( "숫자를 입력하세요: " )) #입력 값 만들기
for b in range ( 1 , 10 ):
print ( f " { a } , '*' , { b } , '=', { a * b } " )
어차피 b는 1-9까지 반복해야 하니까 a값만 지정해주고 b만 반복문 돌리면 원하는 구구단 숫자가 나온다.
산술식도 금방 적용되니까... 당시에 이 생각 못한 걸 보면 많이 버벅인 모양이다.
3의 배수의 합 구하기
total = 0 #현재 총합
for n in range ( 1 , 101 , 3 ): #1부터 100까지의 3의 배수를 반복
total += n #n에서 3배수로 할당한 값들을 더했다.
print ( f "합 { total } " )
#이것도 똑같이 작동된다.
for n in range ( 1 , 101 ):
if n % 3 == 0 : #3을 나눴을 때 0이 된 값만,조건문
total += n
#짝수이면서 5의 배수인 수 출력
C = int ( input ( "숫자를 입력하세요: " ))
for c in range ( 0 , C + 1 , 5 ):
print ( c )
#실습 후 보여준 답안
for c in range ( 0 , C + 1 ):
if c % 2 == 0 and n % 5 == 0 : #짝수이면서 5배수란 조건을 빼먹었다...
print ( c )
루프 제어문
특정 조건 하에서 작동하도록 구현
#break : 반복문 즉시 중단
for i in range ( 10 ):
if i == 5 :
break
print ( i )
print ( "반복 종료1" )
stop-1까지 출력이니 4까지만 나온다.
#continue : 현재 반복을 넘어감, 다음 반복으로 실행한다.
for i in range ( 5 ):
if i == 2 :
print ( "건너뜀" )
continue
print ( i )
print ( "반복 종료2" )
if가 2되니 건너뜀을 출력하고, 컨티뉴가 다시 반복시켰다.
#pass
for i in range ( 10 ):
pass
일단 할당되지 않았으니 넘어간단 명령어다.
for - else 구문
반복이 정상적으로 모두 수행된 경우 else 블록을 실행한다.
for i in range ( 5 ): #5면 4까지만 출력한단 뜻
if i == 2 :
break
print ( i )
else :
print ( "반복 종료3" )
여기서 이렇게 짜면 2에서 브레이크 걸려 멈춘 거기에 else까지 가지 않는다.
중첩 for 문
하나의 for 문 안에 다른 for 문이 들어있는 구조
#이중 for문
for i in range ( 5 ):
for j in range ( 5 ):
print ( "i,j" , i , j )
print ()
안쪽에서 돌리고, 바깥이 횟수 올라가는 식으로 전개된다.
#실습
구구단만들기 for문 중첩 활용해서.
for a in range ( 2 , 10 ):
print ( f " { a } 단" )
for b in range ( 1 , 10 ):
print ( a , 'x' , b , '=' , a * b )
#또는 print(f"{a} x {b} = {a*b}")
# 중첩 for 문 별 찍기
a = int ( input ( "몇 줄?: " ))
#for n in range(0,a):
# print("*" * (n+1)) #별표를 n+1값 만큼 곱한 걸 출력한다.
for i in range ( 1 , a + 1 ):
for j in range ( i ):
print ( "*" , end = "" )
#중앙 정렬
a = int ( input ( "몇 줄?: " ))
for n in range ( a ):
print ( " " * (( a - 1 ) - n ), end = "" ) #공백의 수를 ((10-1)-1(시작 수)) 만큼 만든다.
print ( '*' * ( 2 * n + 1 )) #*을 (a의 시작수+1의 2배) 만큼 곱한다
#역삼각형은?
a = int ( input ( "몇 줄?: " ))
for n in range ( a ):
print ( " " * ( a - ( n + 1 )), end = "" )
print ( '*' * ( n + 1 ))
#a값을 지정하고, a=10 - (n+1)=a의 시작점+1 만큼의 여백을 만든다.
#공백을 줄바꿈으로 정리
for i in range ( 1 , a + 1 ):
#공백 출력
for j in range ( a - i ):
print ( " " , end = "" )
for j in range ( i ):
print ( "*" , end = "" )
print ()
#받은 답안 비교용 원본
# 오른쪽 정렬
n = int ( input ( "몇 줄?:" ))
for i in range ( 1 , n + 1 ):
for j in range ( n - i ):
print ( " " , end = "" )
for j in range ( i ):
print ( "*" , end = "" )
print ()
리스트 컴프리헨션
for 문을 리스트에 한 줄로 축약하여 새 리스트를 생성하는 문법
[표현식(리스트의 원소) for 변수 in 반복대상 if 조건문] <= if 조건문 없어도 괜찮다.
표현식 : 값을 유도하는 식(표현)
for문 이용
squares = []
for x in range ( 1 , 6 ):
squares . append ( x ** 2 )
print ( squares )
출력 값
리스트컴프리헨션 사용 시
squares2 = [ x ** 2 for x in range ( 1 , 6 )]
print ( squares2 )
리스트 명 = 컴프리헨션 문법 적용. 구조다.
아직 미숙한 내게 컴프리헨션은 쓰일 일이 적을 듯 하다.
# 실습
1부터1 0까지의숫자에 대해, 각 수의 제곱값을 요소로 갖는 리스트를 리스트 컴프리헨션
cphs = [ n ** 2 for n in range ( 1 , 11 )]
print ( "답" , cphs )
n을 **(제곱)할때 n의 값 1-10까지 반복해서 출력 느낌이다. 산술 기호를 정확히 기억하고 있어야 헷갈리지 않는 문제다.
3의 배수만 출력하는 컴프리헨션은
cphs2 = [ x for x in range ( 0 , 51 ) if x % 3 == 0 ]
#앞의 표현식은 변수값(x)만 두고 없어도 딘다.
# x % 3 == 0 < 3으로 나눴을때 0이 된다 = 3의 배수다.
print ( cphs2 )
출력 값
문자열 리스트에서 길이가 5이상인 값만 출력하는 컴프리헨션
fruits = [ "apple" , "fig" , "banana" , "plum" , "cherry" , "pear" , "orange" ]
cphs3 = [ f for f in fruits if len ( f ) >= 5 ]
#변수 f만 나오게, fruits 중의 f(변수)가 글자수(len) 5보다 같거나 크게란 뜻
print ( cphs3 )
반복 실행할 때 글자수가 5이상인 (if len(f)>=5) 것을 기준으로 f변수만 나오게 해라. 그런 축약인데 헤맸다.
for문은 함수에서 자주 사용되고 여러 조건문을 반복 처리하기 위해 쓰이기도 하니 꽤 눈에 보이는데, 이때는 for 문을 이해했지만 문제 읽고 어캐 써야 할지 모르겠어의 연속이었다. 그래서 질문하고, 코드가 이리 진행된다고 자판 두드렸던 기억이 났다. 이제 반복문을 백업 했으니 이만 마무리 하겠다.