파이썬 python

04 제어문

ynzify 2023. 5. 2. 01:02

 

제어문

  • 조건문과 반복문이 있다
  • 코드의 흐름을 제어하는 문법
  • 주어진 조건에 따라 반복해서 코드를 실행할 때 사용

 

 

조건문

  • 어떠한 조건을 만족하면 True에 해당하는 코드를 실행
  • if 문은 단독으로 사용 가능하다
  • if 문 다음에는 들여쓰기를 해줘야 한다

 

>>> num = 1
>>> if num != 0:
>>>     print(10 / num)
10.0

 

>>> num = -1
>>> if num > 0:
>>>     print(10/num)
>>> elif num < 0:
>>>     print("양수만 넣어주세요")
>>> else:
>>>     print("0으로 나눌수 없습니다.")
양수만 넣어주세요

 

>>> age = int(input()) # 정수형만 입력받기

>>> if age > 99:
>>>     print("유효한 나이를 입력해주세요")
>>> elif age < 0:
>>>     print("태어난거 맞나요?")
>>> else:
>>>     print("DB 저장완료")

 

 

중첩 조건문

  • 조건문 안에 조건문 사용

 

>>> age = 100
>>> if age > 99 or age < 0:
>>>     print("유효한 나이를 입력해주세요.")
>>> else:
>>>     if age < 20:
>>>         print("20세 이상만 회원가입이 가능합니다.")
>>>     else:
>>>         print("DB 저장 완료")
        
유효한 나이를 입력해주세요

 

조건문 이용해서 중앙값 추출하기

 

중앙값

  • 주어진 값들의 크기의 순서대로 정렬했을 때 가장 중앙에 위치한 값
  • 주어진 값들의 갯수가 짝수일 때는 중앙에 두개의 값의 평균을 낸다
model_scores1 = [0.92 , 0.83 , 0.91 , 0.77, 0.99 , 0.61 , 0.88,0.76,0.75] #  홀수 개수
model_scores2 = [0.92 , 0.83 , 0.91 , 0.77, 0.99 , 0.61 , 0.88,0.76,0.75 , 0.51] # 짝수 개수

 

>>> scores = model_scores2

>>> length = len(scores)
>>> index = length // 2

>>> if length % 2: # 홀수 개수이면 1이 반환되서 True가 되서 if문 코드가 실행
>>>     median_score = sorted(scores)[index]

>>> else: # 아닐경우 짝수 개수이기 때문에 else문 코드가 실행
>>>     median_score = (sorted(scores)[index] + sorted(scores)[index-1]) / 2
>>> print(median_score)
0.8

 

 

반복문

  • 반복적으로 코드를 수행할 때 사용함

 

while 문

  • 조건제 반복
  • 조건이 참일 동안 반복
  • 무한 반복 주의
  • while <condition>:
        code context

 

>>> n = 3 # 단
>>> i = 1 # 1~9 까지 곱하는 수
>>> while i<10:
>>>     print(f"{n} X {i} = {n*i}")
>>>     i += 1 # i = i + 1

# 10이 넘어가면 while문이 False가 되므로 다음 코드를 실행하게 된다
# 조건이 False가 되는 조건을 만들지 않으면 무한반복하다가 코드가 멈춰버림 이런오류 조심!!

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

 

 

# 다음과 같은 논리적인 오류를 조심해야한다.
# i<10 일 때만 실행해 줘야하는데 10일 때도 실행이 됨


>>> n = 3
>>> i = 0
>>> while i < 10:
>>>     i += 1 # i = i + 1
>>>     print(f"{n} X {i} = {n*i}")

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27
3 X 10 = 30

 

 

break 문

  • 해당 반복문을 빠져나온다
>>> n = 3
>>> i = 1
>>> while True:
>>>     print(f"{n} X {i} = {n*i}")
>>>     i+=1
>>>     if i > 9:
>>>         break

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

 

continue 문

  • 진행을 중단하고 다음 반복문으로 넘어간다
>>> i = 0
>>> while i <= 10:
>>>     i += 1
>>>     if i % 2:
>>>         print(i)

1
3
5
7
9


# 짝수만 출력하기
>>> i = 0
>>> while i <= 10:
>>>     i += 1
>>>     if i % 2:
>>>         continue # 홀수일 경우에만 밑의 코드를 실행하지 않고 그 다음 반복문으로 넘어간다
>>>     print(i)

2
4
6
8
10

 

 

 

중첩 while 문

  • 해당 반복문을 빠져나온다
>>> i = 1 # 바깥쪽 while 문 초기값
>>> while i < 3:
>>>     print(f"{i} 번째 바깥쪽 while 문 입니다.")
>>>     i += 1
>>>     j = 1 # 안쪽 while 문 초기값
>>>     while j < 6:
>>>         print(f"    {j} 번째 안쪽 while 문 입니다.") # 들여쓰기 한번 해준거
>>>         j += 1

1 번째 바깥쪽 while 문 입니다.
    1 번째 안쪽 while 문 입니다.
    2 번째 안쪽 while 문 입니다.
    3 번째 안쪽 while 문 입니다.
    4 번째 안쪽 while 문 입니다.
    5 번째 안쪽 while 문 입니다.
2 번째 바깥쪽 while 문 입니다.
    1 번째 안쪽 while 문 입니다.
    2 번째 안쪽 while 문 입니다.
    3 번째 안쪽 while 문 입니다.
    4 번째 안쪽 while 문 입니다.
    5 번째 안쪽 while 문 입니다.

 

 

# 중첩 while 문 이용해서 구구단 출력하기
>>> n = 2
>>> while n < 10:
>>>     print(f"{n} 단 입니다.")

>>>     i = 1
>>>     while i < 10:
>>>         print(f"{n} X {i} = {n*i}")
>>>         i += 1

>>>     n +=1

 

for 문

  • 반복 가능 (iterable)한 객체를 더 이상 꺼낼 수 없을 때까지 반복
  • list, tuple, set, dict, str 이용 가능
  • for <variable> in <iterable>:
        code context
>>> lst = [1,2,3,4]

>>> for item in lst:
>>>     print(item)
1
2
3
4

 

# 다음의 리스트에서 3의 배수만 출력하고 싶다면??
>>> lst = [3,33,100,23,81,44]
>>> for n in lst:
>>>     if n % 3 == 0:
>>>         print(n)
3
33
81

 

# 각 문자의 앞문자만 대문자로 변경해서 출력하고 싶다면?
>>> lst = ["dog","cat","rabbit"]
>>> for s in lst:
>>>     print(s[0].upper() + s[1:])
Dog
Cat
Rabbit

=

>>> for s in lst:
>>>     print(s.capitalize())
Dog
Cat
Rabbit

 

 

range 함수

  • 특정 구간의 숫자의 범윌르 만들어 주는 함수
  • 슬라이싱 기법 이용
  • 파이썬에 iterable 특수한 객체
  • for와 같이 자주 사용
  • range(a,n,x)에서  n-1의 범위까지 출력

 

# 0 ~ 9
>>> range(10)
>>> range(0,10)
>>> list(range(10)) # 리스트로 변환이 가능

range(0, 10)
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

중첩 for 문

 

##  for문과 range 함수를 이용해서 구구단을 출력해보자.
>>> for i in range(2,10):
>>>     print(f"{i}단 입니다.")
>>>     for j in range(1,10):
>>>         print(f"    {i} X {j} = {i*j}")

Output exceeds the size limit. Open the full output data in a text editor2단 입니다.
    2 X 1 = 2
    2 X 2 = 4
    2 X 3 = 6
    2 X 4 = 8
    2 X 5 = 10
    2 X 6 = 12
    2 X 7 = 14
    2 X 8 = 16
    2 X 9 = 18
    ...
    9 X 6 = 54
    9 X 7 = 63
    9 X 8 = 72
    9 X 9 = 81

 

Enumerate 함수

  • iterable 객체를 꺼낼 때 인덱스도 같이 꺼낼 수 있는 객체를 생성해준다

 

>>> score_list = [90,87,93]
>>> i = 0
>>> for score in score_list:
>>>     print(f"{i}번째 인덱스의 점수는 {score}")
>>>     i += 1
0번째 인덱스의 점수는 90
1번째 인덱스의 점수는 87
2번째 인덱스의 점수는 93

>>> enumerate(score_list)
<enumerate at 0x20b7cb29600>


# 두번째 인수에 값을 넣을 경우 해당 값이 start 값이 된다.
>>> for i,score in enumerate(score_list): 
>>>     print(f"{i}번째 인덱스의 점수는 {score}")
0번째 인덱스의 점수는 90
1번째 인덱스의 점수는 87
2번째 인덱스의 점수는 93

>>> list(enumerate(score_list))
[(0, 90), (1, 87), (2, 93)]


# 딕셔너리로 변환시 키:벨류 구조로 변환
>>> dict(enumerate(score_list))
{0: 90, 1: 87, 2: 93}

 

zip 함수

  • 여러 개의 iterable 객체를 병렬로 꺼낼 수 있는 객체를 생성함

 

>>> class_list = ["A반","B반","C반"]
>>> score_list = [90   , 87  , 91 ]

>>> length = len(class_list)
>>> for i in range(length):
>>>     print(f"{class_list[i]}의 점수는 {score_list[i]} 입니다.")
A반의 점수는 90 입니다.
B반의 점수는 87 입니다.
C반의 점수는 91 입니다.


>>> zip(class_list,score_list)
<zip at 0x20b7e18cf40>


>>> for c, s in zip(class_list,score_list):
>>>     print(f"{c}의 점수는 {s} 입니다.")
A반의 점수는 90 입니다.
B반의 점수는 87 입니다.
C반의 점수는 91 입니다.

 

dict 데이터에 대한 for 문

 

>>> score_dict = {
>>>     "국어": 100,
>>>     "수학": 80,
>>>     "영어": 70
>>> }
>>> score_dict.keys()

dict_keys(['국어', '수학', '영어'])

 

>>> for k in score_dict.keys():
>>>     print(f"{k}는 {score_dict[k]}점")

국어는 100점
수학는 80점
영어는 70점

>>> score_dict.values()
dict_values([100, 80, 70])
>>> for v in score_dict.values():
>>>     print(v)
100
80
70


>>> score_dict.items()
dict_items([('국어', 100), ('수학', 80), ('영어', 70)])


>>> for k , v in score_dict.items():
>>>     print(k,v)
국어 100
수학 80
영어 70

 

파이써닉(Pythonic)한 코드

  • 간결하고 가독성 있는 코딩

 

삼(3)항 연산자

  • if와 else문을 이용해 삼항 연산을 수행
  • <True 일때 사용할 값> if <condition> else <False 일 때 사용할 값> 
  • 조건문부터 익숙해지고 써보기~

 

>>> age = 20
>>> if age >= 20:
>>>     msg = "회원가입 가능"
>>> else:
>>>     msg = "회원가입 불가능"
>>> print(msg)

회원가입 가능

# 파이썬의 삼항연산로 변경해보기
>>> age = 19
>>> msg = "회원가입 가능" if age>=20 else "회원가입 불가능"
>>> print(msg)

회원가입 불가능

 

 

컴프리헨션 (Comprehension)

  • list, dict 자료형을 간단하게 만들기 위한 문법
  • tuple은 컴프리헨션으로 만들 수 없음
  • list comprehension
    • [ <추가할 값에 대한 처리> for <값> in <반복가능한객체> if <값에 대한 조건> ]

 

# 1~5까지 각각의 정수에 제곱한 결과를 리스트 담고싶다면?
>>> result = [] 
>>> for data in range(1,6):
>>>     result.append(data**2)
>>> result
[1, 4, 9, 16, 25]

>>> result = [ data**2 for data in range(1,6) ]
>>> result
[1, 4, 9, 16, 25]

 

>>> num_list = list(range(1,21))

# num_list 에서 짝수만 새로운 리스트에 담고 싶다면?
>>> result = [ num for num in num_list if num % 2 == 0 ]
>>> result
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

 

>>> %%timeit
>>> lst = []
>>> for data in range(1,100001):
>>>     lst.append(data)
5.51 ms ± 234 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


>>> %%timeit
>>> lst = [ data for data in range(1,100001) ]
2.76 ms ± 29.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

 

 

>>> s_list = []
>>> for w in 'Python':
>>>     s_list.append(w)
>>> s_list
['P', 'y', 't', 'h', 'o', 'n']


# 위에 코드를 컴프리헨션 문법으로 변경한다면?
>>> s_list = [ w for w in 'Python']
>>> s_list
['P', 'y', 't', 'h', 'o', 'n']

 

 

>>> lib_list = ["pandas","numpy","sklearn","pytorch"]
>>> lst = []
>>> for i,v in enumerate(lib_list):
>>>     lst.append( (i,v) )
>>> lst
[(0, 'pandas'), (1, 'numpy'), (2, 'sklearn'), (3, 'pytorch')]


# 컴프리헨션 변경
>>> lib_list = ["pandas","numpy","sklearn","pytorch"]
>>> lst = [ (i,v) for i,v in enumerate(lib_list) ]
>>> lst
[(0, 'pandas'), (1, 'numpy'), (2, 'sklearn'), (3, 'pytorch')]

 

 

>>> s_list = []
>>> for i in range(1,11):
>>>     if i % 2 == 0:
>>>         s_list.append("짝수")
>>>     else:
>>>         s_list.append("홀수")
>>> s_list

# 컴프리헨션 변경
>>> s_list = [ "짝수" if i % 2 == 0 else "홀수" for i in range(1,11) ]
>>> s_list

 

 

  • set comprehension (잘 안씀)
# 쓸 일이 없다!!
>>> a = { data for data in range(1,6) }
>>> a

{1, 2, 3, 4, 5}

 

 

  • dict comprehension
>>> name_list = ["관수","민수","철수"]
>>> age_list = [43,35,47]

>>> result = { name:age for name,age in zip(name_list,age_list)}
>>> result

{'관수': 43, '민수': 35, '철수': 47}

 

>>> dict(zip(name_list,age_list))
{'관수': 43, '민수': 35, '철수': 47}


>>> { name:f"{age}세" for name,age in zip(name_list,age_list)}
{'관수': '43세', '민수': '35세', '철수': '47세'}