파이썬 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세'}