오경석의 개발노트

Python_for문 본문

프로그래밍 언어/Python

Python_for문

OHSAYU 2022. 7. 28. 11:34

파이썬의 직관적인 특징을 가장 잘 대변해 주는것이 for문이다. while문과 비슷한 반복문인 for문은 매우 유용하고 문장 구조가 한눈에 들어온다. for문의 기본 구조는 다음과 같다.

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...

리스트나 튜플, 문자열의 첫번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 "수행할 문장1", "수행할 문장2" 등이 수행된다. 예제를 직접 입력해보자.

test_list = ['one', 'two', 'three']
for i in test_list:
    print(i)
>>> one
>>> two
>>> three

 ['one', 'two', 'three']리스트의 첫번째 요소인 'one'이 먼저 i 변수에 대입된 후 print(i) 문장을 수행한다. 다음에 두번째 요소 'two'가 i 변수에 대입된 후 print(i) 문장을 수행하고 리스트의 마지막 요소까지 이것을 반복한다.

a = [(1,2), (3,4), (5,6)]
for (first, last) in a:
    print(first + last)
>>> 3
>>> 7
>>> 11

enumerate() 함수

위 예는 a 리스트의 요솟값이 튜플이기 때문에 각각의 요소가 자동으로 (first, last) 변수에 대입된다.

리스트(배열)등의 요소를 인덱스(카운터)와 함께 얻으려면 enumerate()함수를 사용

mylist = ["A", "B", "C"]
for i, name in enumerate(mylist):
    print(i, name)
>>> 0 A
>>> 1 B
>>> 2 C

enumerate()함수의 두 번째 인수는 시작 값. 0부터가 아니라 시작이 임의의 정수 값부터 시작

mylist = ["A", "B", "C"]
for i, name in enumerate(mylist, 1):
    print(i, name)
>>> 1 A
>>> 2 B
>>> 3 C

enumerate()함수에 step을 지정하는 인수는 없지만, 다음과 같이 코딩하면 똑같이 흉내낼 수 있다.

step = 2
mylist = ["A", "B", "C"]
for i, name in enumerate(mylist):
    print(i * step, name)
>>> 0 A
>>> 2 B
>>> 4 C

zip() 함수

list 개체의 요소를 여러 변수로 정리하고 싶다면 zip() 함수를 사용

name = ["James", "Yuri", "Amanda"]
country = ["America", "Korea", "UK"]
age = [24, 35, 33]

for name, country, age in zip(name, country, age):
    print(name, country, age)
>>> James America 24
>>> Yuri Korea 35
>>> Amanda UK 33

enumerate(), zip() 함수

LIST의 여러 개체(목록)에서 요소와 인덱스(카운터)를 동시에 얻으려면 enumerate(), zip()함수를 함께 사용

name = ["James", "Yuri", "Amanda"]
country = ["America", "Korea", "UK"]
age = [24, 35, 33]

for i, (name, country, age) in enumerate(zip(name, country, age)):
    print(i, (name, country, age))
>>> 0 ('James', 'America', 24)
>>> 1 ('Yuri', 'Korea', 35)
>>> 2 ('Amanda', 'UK', 33)

reversed() 함수

요소를 역순으로 얻으려면 reversed() 함수 사용. enumerate(), zip() 함수는 reversed() 함수 적용 불가. range() 함수는 가능

list_1 = [1, 2, 3]

for i in reversed(list_1):
    print(i)
>>> 3
>>> 2
>>> 1

reversed() 함수 안에 enumerate() 함수는 사용 불가하지만 list() 함수를 삽입하면 가능

list_1 = [1, 2, 3]

for i in enumerate(reversed(list_1)):
    print(i)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_7588/2298013888.py in <module>
      1 list_1 = [1, 2, 3]
      2 
----> 3 for i in reversed(enumerate(list_1)):
      4     print(i)

TypeError: 'enumerate' object is not reversible
list_1 = [1, 2, 3]

for i in reversed(list(enumerate(list_1))):
    print(i)
>>> (2, 3)
>>> (1, 2)
>>> (0, 1)

zip() 함수도 마찬가지로 reversed() 함수 안에 zip() 함수 바깥에 list() 함수를 삽입하면 반대로 출력이 가능

name = ["James", "Yuri", "Amanda"]
country = ["America", "Korea", "UK"]
age = [24, 35, 33]

for name, country, age in reversed(list(zip(name, country, age))):
    print(name, country, age)
>>> Amanda UK 33
>>> Yuri Korea 35
>>> James America 24

for문 응용문제

"총 5명의 학생이 시험을 보았는데 시험 점수가 60점 이상은 합격, 미만은 불합격이다. 합격여부 결과를 나타내시오."
학생 점수 리스트 : score = [30, 50, 70, 80, 100]
# Q1
score = [30, 50, 70, 80, 100]

number = 0
for i in score:
    number += 1
    if i >= 60:
        print("%d번 학생은 합격입니다." %number)
    else:
        print("%d번 학생은 불합격입니다." %number)
>>> 1번 학생은 불합격입니다.
>>> 2번 학생은 불합격입니다.
>>> 3번 학생은 합격입니다.
>>> 4번 학생은 합격입니다.
>>> 5번 학생은 합격입니다.

각각의 학생에게 번호를 붙여 주기 위해 number 변수를 사용하였다. 점수 리스트 score에서 차례로 점수를 꺼내어 number라는 변수에 대입하고 for문 안의 문장들을 수행한다. 우선 for문이 한번씩 수행될 때마다 number는 1씩 증가한다. 이 프로그램을 실행하면 score가 60 이상일 때 합격 메시지를 출력하고 60을 넘지 않을때 불합격 메시지를 출력한다.

continue

for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.

0~10까지 출력하는 for문에서 5를 제외한 나머지를 출력하는 문장을 continue문을 사용해 작성해보자.

for i in range(11):
    if i == 5:
        continue
    print(i)
>>> 0
>>> 1
>>> 2
>>> 3
>>> 4
>>> 6
>>> 7
>>> 8
>>> 9
>>> 10

숫자가 5일때인 경우에는 i == 5가 참이 되어 continue문이 수행된다. 따라서 print문을 수행하지 않고 for문의 처음으로 돌아가게 된다.

break

for문 중간에 프로세스를 종료하려면 break를 사용

for i in range(11):
    if i == 5:
        break
    print(i)
>>> 0
>>> 1
>>> 2
>>> 3
>>> 4

else

for문 루프가 종료된 후 어떤 작업을 수행하려면 else를 사용

for i in range(4):
    print(i)
else:
    print("END")
>>> 0
>>> 1
>>> 2
>>> 3
>>> END

break에 의해 중간에 종료된다면 else는 실행되지 않는다.

for i in range(4):
    if i == 1:
        break
    print(i)
else:
    print("END")
>>> 0

continue의 경우 for 루프가 끝까지 실행되므로 else가 실행됨

for i in range(4):
    if i == 1:
        continue
    print(i)
else:
    print("END")
>>> 0
>>> 2
>>> 3
>>> END

for문과 함께 자주 사용하는 range 함수

for문은 숫자 리스트를 자동으로 만들어주는 range 함수와 함께 사용하는 경우가 많다. range 함수의 간단한 사용법을 보자

a = range(10)
a
>>> range(0, 10)

range(10)은 0부터 10 미만의 숫자를 포함하는 range 객체를 만들어준다.

시작 숫자와 끝 숫자를 지정하려면 range(시작 숫자, 끝 숫자) 형태를 사용하는데, 이때 끝 숫자는 포함되지 않는다.

a = range(1, 11)
a
>>> range(1, 11)

for문으로 list() 요소도 출력할 수 있다.

print(list(range(3)))
>>> [0, 1, 2]

또한, 1이 아니라 특정 숫자만큼 증가하고 싶다면 range(start, stop, step)와 같이 3개의 인수를 지정

print(list(range(2,11,2)))
>>> [2, 4, 6, 8, 10]

range 함수의 예시 살펴보기

Q1. 1부터 10까지의 자연수 더하기

add = 0
for i in range(1, 11):
    add += i
    
print(add)
>>> 55

Q2. 1부터 10까지의 자연수 중 홀수만 더하기

result = 0
for i in range(1,11,2):
    result += i
print(result)
>>> 25

Q3. 입력값을 받고 입력값까지의 합을 더하기(100을 입력했을때, 5050을 출력하는지 확인)

a = int(input('입력값 : '))
result = 0
for i in range(a+1):
    result += i
print('입력값의 합 : ', result)

range(1, 11)은 숫자 1부터 10까지(1 이상 11 미만)의 숫자를 데이터로 갖는 객체이다. 따라서 위 예에서 i 변수에 리스트의 숫자가 1부터 10까지 하나씩 차례로 대입되면서 add = add + i 문장을 반복적으로 수행하고 add는 최종적으로 55가 된다. 또한 앞에서 "60점 이상이면 합격"이라는 문장을 출력하는 예제도 range 함수를 사용해서 바꿀 수 있다. 다음을 보자.

# Q2
score = [30, 50, 70, 80, 100]
for number in range(len(score)):
    if score[number] < 60:
        continue
    print("%d번 학생 축하합니다. 합격입니다." %(number+1))
>>> 3번 학생 축하합니다. 합격입니다.
>>> 4번 학생 축하합니다. 합격입니다.
>>> 5번 학생 축하합니다. 합격입니다.

len 함수는 리스트 안의 요소 개수를 돌려주는 함수이다. 따라서 len(score)는 5가 될 것이고 range(len(score))는 range(5)가 될것이다. number 변수에는 차례로 0부터 4까지의 숫자가 대입될 것이고, score[number]는 차례대로 30, 50, 70, 80, 100 값을 갖게 된다. 결과는 Q1과 동일하다.

for와 range를 이용한 구구단

for와 range 함수를 사용하면 소스 코드 단 4줄만으로 구구단을 출력할 수 있다. 들여쓰기에 주의하며 입력하자.

for i in range(2, 10):
    for j in range(1, 10):
        print(i*j, end=" ")
    print("")
>>> 2 4 6 8 10 12 14 16 18 
>>> 3 6 9 12 15 18 21 24 27 
>>> 4 8 12 16 20 24 28 32 36 
>>> 5 10 15 20 25 30 35 40 45 
>>> 6 12 18 24 30 36 42 48 54 
>>> 7 14 21 28 35 42 49 56 63 
>>> 8 16 24 32 40 48 56 64 72 
>>> 9 18 27 36 45 54 63 72 81

위 예를 보면 for문을 두 번 사용했다. 첫번째 for문에서 2부터 9까지의 숫자(range(2, 10))가 차례로 i에 대입된다. i가 처음 2일때 두번째 for문을 만나게 된다. 두 번째 for문에서 1부터 9까지의 숫자(range(1, 10))가 j에 대입되고 그 다음 문장 print(i*j)를 수행한다. 따라서 i가 2일때 2*1, 2*2, 2*3, ... 2*9까지 차례로 수행되며 그 값을 출력하게 된다. 그 다음으로 i가 3일때 역시 2일때와 마찬가지로 수행될것이고 i가 9일때까지 계속 반복된다. print(i*j, end=" ")와 같이 매개변수 end를 넣어 준 이유는 해당 결괏값을 출력할 때 다음줄로 넘기지 않고 그 줄에 계속해서 출력하기 위해서이다. 그 다음에 이어지는 print("")는 2단, 3단 등을 구분하기 위해 두 번째 for문이 끝나면 결괏값을 다음 줄부터 출력하게 해주는 문장이다.

리스트 내포 사용하기

리스트 안에 for문을 포함하는 리스트 내포(List comprehension)를 사용하면 좀더 편리하고 직관적인 프로그램을 만들 수 있다. 다음 예제를 보자.

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

위 예제는 a 리스트의 각 항목에 3을 곱한 결과를 result 리스트에 담는 예제이다. 이것을 리스트 내포를 사용하면 다음과 같이 간단히 해결할 수 있다. 

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

만약 [1, 2, 3, 4]중에서 짝수에만 3을 곱하여 담고 싶다면 다음과 같이 리스트 내포 안에 "if 조건"을 사용할 수 있다.

a = [1, 2, 3, 4]
result = [num * 3 for num in a if num % 2 == 0]
print(result)
>>> [6, 12]

리스트 내포의 일반 문법은 다음과 같다. "if 조건" 부분은 앞의 예제에서 볼 수 있듯이 생략할 수 있다.

[표현식 for 항목 in 반복가능객체 if 조건문]

for문을 2개 이상 사용하는것도 가능하다.

[표현식 for 항목1 in 반복가능객체1 if 조건문1
        for 항목2 in 반복가능객체2 if 조건문2
        ...
        for 항목n in 반복가능객체n if 조건문n]

구구단의 모든 결과를 리스트에 담고 싶다면 리스트 내포를 사용하여 다음과 같이 간단하게 구현할 수도 있다.

result = [x*y for x in range(2,10) 
               for y in range(1,10)]
print(result)
>>> [2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 
4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45,
6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63,
8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

 

 

출처 : https://wikidocs.net/22

 

03-3 for문

파이썬의 직관적인 특징을 가장 잘 대변해 주는 것이 바로 이 for문이다. while문과 비슷한 반복문인 for문은 매우 유용하고 문장 구조가 한눈에 쏙 들어온다는 장점이 ...

wikidocs.net

출처 : https://codingcoding.tistory.com/1103

 

파이썬 for문(반복 루프) 사용법 12가지

Python for문을 활용한 루프 처리 방법을 설명합니다. 기본적인 문법 Python for문 기본 사용법 조건에 따라 중간 종료 : break 특정 요소 처리를 생략 : continue for 루프 완료 후 처리 : else for 문에서 사용

codingcoding.tistory.com

출처 : 

'프로그래밍 언어 > Python' 카테고리의 다른 글

Python_모듈 정의  (0) 2022.08.24
Python_버전 확인 방법  (0) 2022.08.23
Python_저장 경로 확인  (0) 2022.08.17
Python_함수 정의  (0) 2022.07.04
Python_주석  (2) 2022.05.29
Comments