본문 바로가기

Data Science/Python

[python] 04.제어문 컴프리헨션 | 제어문(조건문,반복문)과 간단한 제어문(컴프리헨션)을 배워보자

※ 제어문이란?

기본적으로 프로그램은 순차구조를 가지는데 그 실행흐름을 제어하는 구문을 만드는 문법이 제어문

  • logic : 순차적으로 적은 코드
  • 알고리즘 : 해결해야하는 문제에 대한 문제풀이, logic에 따라 순차적으로 작성됨
  • 제어문 : 알고리즘 안에서 실행됨. 순차적으로 작성되는 구조
#순차 구조 - 순차적으로 실행되어야만 함
n1 = input()
num1 = int(n1)
n2 = input()
num2 = int(n2)
oper = input("연산자")
result = num2 + num1
print("결과:",result)

제어문의 종류

1. 조건문(if문) : 연산자로 입력된 값이 무엇이냐에 따라 해야할 일이 달라지는 것
2. 반복문 : 하나의 코드로 여러번의 실행을 하는 것
- while문 : 조건이 True인 동안 반복하는 것, 목표를 달성하기 전까지 무한 반복
- for in 문 : 횟수가 정해진 만큼 반복하는 것, 자료구조와 관련이 있음

 

 

 

 

1) 조건문/분기문(conditional statement)

순서도에서 <조건> 에 따라서 다른 흐름이 발생

1. 조건이 True일 경우에만 특정 구문을 실행 : (if~)

  • 코드블록 : 코드블록은 열개의 실행 명령문을 묶어놓은 것, 같은 들여쓰기 = 같은 코드블록, 공백4칸=tab 사용
if 조건 : #조건은 bool표현식
    명령문1 #조건이 True일 때 실행할 구문
    명령문2

예)
# 1.정수를 입력받는다
num = int(input("정수:"))
# 2. 정수가 0이면 "Zero"를 출력한다.(아니면 아무것도 안한다.)
if num == 0 :
    print("Zero")
    print("영입니다.")
    # 2개의 명령문이 하나로 묶음
    # if문이 False일 경우, 실행되지 않음
# 3."종료"를 출력
print("종료")

 

 

2. 조건이 True일 때 실행하는 구문과 False일 때 실행하는 구문 ( if~esle )

if 조건:     
    명령문1_1 # 조건이 True일 경우 실행할 구문들
    명령문1_2
    ...
else:
    명령문2_1 # 조건이 False일 경우 실행할 구문들
    명령문2_2
    ...


예)
    #1. 정수를 입력받는다.
    num = int(input("정수 :"))

    #2. 2-1: 정수가 0이면 "Zero"를 출력
    #   2-2: 정수가 0이 아니면 "Not Zero"를 출력
    if num == 0 :
        print("Zero")
        print("영입니다.")
    else :
        print("Not Zero")
        print("영이 아님")

    # 3. 종료 출력
    print("종료")

 

 

3. 여러 조건이 있는 문장 - 조건의 순서를 유의 elif

  • 조건을 포함한 조건은 '나중에' 물어야한다. 명령은 순차적으로 인식되기 때문이다.
    앞의 조건이 True면 이후 elif 조건은 실행되지 않는다.
  • if 조건 : 명령문 elif 조건 : #조건2 - 조건1이 False일 때 실행 명령문 elif 조건 : #조건3 - 조건1,2가 모두 False일 때 실행 명령문
  • if 조건을 여러개 쓰는 것은, 쓴 순서대로 실행되긴하지만 각 if문은 독립적이다(!=elif, elif문은 조건문들 사이의 관계있음)2) 반복문
  • #조건이 중첩되는 경우 num = int(input("양수입력:")) if num >= 10000 : print("아주 큰수") elif num >= 1000 : print("큰수") elif num >= 100 : print("보통") elif num >= 0 : #가장 큰 범위를 포함하는 조건 - 마지막 print("양수")
  • 동일한 코드를 여러번 반복

 

 

 

While 문

  • 조건이 True인 동안 반복하는 것, 목표를 달성하기 전까지 무한 반복
  • bool 표현식인 조건식을 사용
while 조건: # 조건은 bool 표현식  
반복할 구문1 # 반복할 구문을 코드블록으로 작성한다.  
반복할 구문2

예)  
limit = int(input("반복횟수:")  
count = 0 #몇 번째 반복일지 저장할 변수 초기화

while count < limit :  
#True -> False로 바뀌는 구문 필요 ex. 증감식(없을 시, 무한 반복)  
count = count +1  
print(f"{count}번째 실행.")

 

 

 

for in문

  • 횟수가 정해진 만큼 반복하는 것, 자료구조와 관련이 있음
  • iterable 객체를 순환조회하는 구문
    = iterable 타입의 객체(대표적으로 List, Tuple, Dictionary, Set, 문자열 등)가 가지고 있는 값들을 각각 조회하여 처리
  for 변수 in Iterable:  
  반복구문  
  반복구문
  예)  
  <while문>  
  l = \[1, 2, 3, 4, 5\] # 리스트 원소들의 값 +10 한 것을 출력

  cnt = len(l) # 원소의 개수를 센다 -> 기준값을 원소의 개수로 설정  
  idx = 0 # index 역할 초기값 설정  
  while idx < cnt :  
  value = l\[idx\] #원소 한개 조회  
  print(value + 10) #조회한 원소를 처리(+10 값을 출력)  
  idx += 1 #index를 증가

  <for in 문 이용>  
  #iterable 객체를 순차적으로 순환하면서 반복적으로 진행할 명령문을 작성한다.  
  #for 변수 in에서 변수를 설정하고 그 변수의 반복문을 작성하면 된다.  
  l = \[1, 2, 3, 4, 5\]

  for v in l : #변수 v  
          print(v+10) #변수 v를 이용한 반복문 작성  


  l = \[1, 2, 3, 4, 5\]

  for value in l: #for 변수 in 리스트 : => 변수 : 원소를 저장할 변수명

      #list안의 원소를 전부 처리할 때 까지 반복
          print(value) 

    참고)  
    # 리스트를 도는 것이 아니라 리스트의 원소의 개수 -> while문의 조건에 들어감  
    l = \[1, 2, 3, 4, 5\] # 리스트 원소들의 값 +10 한 것을 출력

    cnt = len(l) # 원소의 개수  
    idx = 0 # index 변수 초기화  
    while idx < cnt :  
    value - l\[idx\] #원소 한개 조회  
    print(value + 10) #조회한 원소를 처리(+10 값을 출력)  
    idx += 1 #index를 증가

    예)

    # l의 원소 중 2의 배수만 출력

    l = \[1,2,3,4,5,6,10,3,4,12,20,102,111\]  
    for value in l:  
    if value % 2 == 0:  
    print(value)

    # l의 원소 중 2의 배수만 모으기

    l = \[1,2,3,4,5,6,10,3,4,12,20,102,111\]  
    result = \[\] #2의 배수만 모을 빈리스트 초기화 #result = list()  
    for value in l:  
    if value %2 == 0:  
    result.append(value)

 

 

 

중첩 리스트
- for in문을 이용해 모든 원소들을 출력 ---> 리스트의 중첩 횟수만큼 반복문도 중첩한다.

l2 = [
[1,2,3],
[10,20,30],
["가","나","다"]
]
for l in l2 : #외부 리스트의 원소를 조회
# l => 리스트
for value in l: #내부 리스트의 원소를 조회
    print(value)
print("-------------------")


>>
1
2
3
-------------------
10
20
30
-------------------
가
나
다
--------------

 

 

continue와 break를 이용한 반복문 제어
- if문에 작성(continue와 break는 특정 조건에서 실행)
break
반복을 중단
특정 조건에서 반복문을 중간에 중지할때 사용
continue
현재 반복을 중단하고 다음 반복을 진행
특정 조건에서 처리를 멈추고 다음 처리를 반복할 때 사용

 예) break
 #1
 for v in [1,2,3,4,5,6,7]: #반복 조건
    if v == 3 : #if 반복 중지 조건: break - 3에 도달하면 반복을 중지!
        break
    print(v)

  print("종료")

  #2
  t = input("입력:")
  while True : 
      print(f">>{t}")
      if t == "종료":
          break #반복을 멈춘다.
      t = input("입력:")
        예) continue
            result = []
        # -100, 100 에서 양수가 나오면 result 저장, 0이 나오면 종료
        while True : 
            num = random.randint(-100,100)
            if num == 0 :
                break # 반복문 자체를 종료
            elif num < 0:
                continue #다음 반복으로 하러감. 아래 반복을 실행하지 x
                 # num<0를 만족하는 한, 아래 조건문으로 넘어가지 않고, num =          random.randint(-100,100) 계속 진행
            result.append(num) #num이 ==0도아니고, <0도 아닐 경우에만 , 즉 양수일 경우에 result 리스트에 num 추가

 

 

 

 

for in 문 연관 내장 함수 : range,enumerate,zip

1. range()

range([시작값], 멈춤값, [증감값])
: 일정한 간격의 연속된 정수를 제공하는 반복가능 객체

  • 시작값에서 멈춤값-1까지 증감값만큼의 간격으로 반복하는 객체를 생성
  • 시작값 > 멈춤값 이고 증감값이 음수이면 내림차순으로 값을 제공
예) print(set(range(1,10,2)))
>> (1,3,5,7,9)


for i in range(1,10,2):
    print(i)
    >> 1 3 5 7 9

for i in range(10,-10,-1) : #10 ~ -10-(-1): 증감:-1
    print(i, end = ",")
    >> 10,9,8,7,...-7,-8,-9,

#번호. 안녕하세요 => 5번 출력(1.안녕하세요, 2.안녕하세요,...5.안녕하세요)
for i in range(5) : # N번 반복
    print(f"{i+1},안녕하세요.")

사용하지 않을 변수를 구문상 어쩔 수없이 넣어야할 경우 , 관례적으로 변수명을 '_'로 지정(관례)

for _ in range(5):
    print("Hello world")

2. emumerate()

  • 현재 몇번째 값을 제공하는 지(현재 몇번째 반복인지)알고 싶을 때 사용
  • index와 제공하는 원소를 tuple로 묶어서 반환
  • 구문
    : enumerate(Iterable, [, start=정수(index시작값, default = 0)])
names = ["유재석","박명수","홍길동","정준하"]

for name in enumerate(names):
    print(name)
>>> 
(0, '유재석')
(1, '박명수')
(2, '홍길동')
(3, '정준하')

for index,name in enumerate(names, start = 1): #start = 시작 
    print(f"{index}. {name}")
>>> 
1. 유재석
2. 박명수
3. 홍길동
4. 정준하

3. zip()

여러 개의 iterable 객체를 같은index 값끼리 튜플로 묶어 반환.

  • 구문
    :zip(Iterable1, Iterable2, Iterable3)
    각 Iterable이 제공하는 원소의 개수가 다르면, 가장 적은 것의 개수에 맞춰 반복
예)
#네 명의 사람정보를 이름, 나이, 주소별로 따로 저장. 같은 index의 값이 한사람의 정보
names = ['유재석','박명수','홍길동','정준하']
ages = [20,30,40,50]
addresses = ["서울","인천","서울","대전"] #"부산","대구","광주"]

print(names[0],ages[0],address[0])
>>유재석 20 서울


예)
for index, value in enumerate(zip(names, ages, addresses)) :
    print(index, value)

    >>>
0 ('유재석', 20, '서울')
1 ('박명수', 30, '인천')
2 ('홍길동', 40, '서울')
3 ('정준하', 50, '대전')

컴프리헨션(Comprehension)

  • 제어문으로 간단하게 iterable의 원소를 생성하여 새로운 자료구조(List, Dictionary, Set)을 생성하는 구문
  • 종류 : dictionary, set, list
1) {K : v for in 문} => 딕셔너리 컴프리헨션
2) {value for in 문} => 셋 컴프리헨션
3) [value for in 문] => 리스트 컴프리헨션
  튜플 컴프리헨션은 x
  • for in 반복문에 조건을 걸고 싶으면 뒤에 if문을 추가한다
l1 = [1,2,3,4,5,6,7,1,2,3,4,]
# l1의 원소들의 동일한 처리(10배)한 결과를 가지는 리스트를 생성.

results = [] #결과를 담을 리스트

for v in l1 :
    # print(v*10)
    results.append(v*10)

#위의 과정을 컴프리헨션으로 간단하게 표현가능


# 리스트 컴프리헨션 => for in 처리를 리스트안에 넣어준다.
results2 = [v*10 for v in l1]
results2

# set 컴프리헨션 -> set
results3 = {v*10 for v in l1} 
results3

# 딕셔너리 : key - 처리한 값의 index, value- 10배한 값
#{K : v for in 문} => 딕셔너리 컴프리헨션
#{value for in 문} => 셋 컴프리헨션
#[value for in 문] => 리스트 컴프리헨션
results4 = {index: value*10 for index, value in enumerate(l1)}
results4
# 리스트 컴프리헨션(조건 걸기)- 뒤에 if문 추가
r = [value for value in l1 if value%2 == 0]
#셋 컴프리헨션(조건 걸기)- 뒤에 if문 추가
r2 = {value for value in l1 if value%2 == 0 }
# 딕셔너리 컴프리헨션(조건 걸기)- 뒤에 if문 추가
r3 = {value : value for value in l1 if value%2 == 0 }
# 1 ~ 1000 사이의 10의 배수
[v for v in range(1,1001) if v % 10 == 0]

 

TODO 문제

#(8) 사용자로부터 정수를 입력받아 그 단의 구구단을 출력하시오. 
# ex) 단을 입력하시오 : 2  
# 2 x 1 = 2
# 2 x 2 = 4
#..
# 2 x 9 = 18

#컴프리헨션

lst = [1,2,3,4,5,6,7,8,9]
num = int(input("정수 :"))
[print(f"{num} x {i}") for i in range(10)]


#(10) 다음 리스트가 가진 값에 10배의 값을 가지는 값을 (원래값, 10배값) 의 튜플 묶음으로 가지는 리스트를 만드시오 (리스트 컴프리헨션 이용)
# Ex) [(10,100), (30,300), .., (35, 350)]
lst = [10, 30, 70, 5, 5, 120, 700, 1, 35, 35]

[ (lst[default],value*10) for default, value in enumerate(lst) ]


#(12) 다음 파일이름들을 담은 리스트에서 확장자가 exe인 파일만 골라서 새로운 리스트에 담으시오.(string의 endswith()함수 이용)
file_name=["test.txt", "a.exe", "jupyter.bat", "function.exe", "b.exe", "cat.jpg", "dog.png", "run.exe", "i.dll"]

[ f for f in file_name if f.endswith(".exe") ]