python_제어문

양승천·2022년 11월 28일
0

python

목록 보기
3/5

제어문

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

조건문 (condition)

  • 특정 조건을 만족하면 (True) 코드를 실행
  • if , elif , else
    • 우리 다음과 같이 `if esif else 만을 이용해서 조건문을 만든다고 가정 해보자
    • if 의 조건이 참이면 코드를 실행해라
    • elif (else if 약어): 그게아니고..... elif 의 조건이 참이면 실행해라
    • else : ifesif 모두 조건이 참이 아니라면 실행해라
    • if문은 단독으로 사용가능
acuracy = 0.92
if acuracy >=0.9:
    print("와우 최고의 인공지능 모델이네요.")
elif acuracy < 0.9 and acuracy >= 0.8:
   print("좋은 모델이네요.")
elif acuracy < 0.8 and acuracy >=0.7:
   print("평범한 모델이네요.")
else:
   print("차라리 제가 예측하겠습니다.")
tii = 20
if tii <= 19:
    print("이건 구라야")
elif tii <21 and tii >19:
    print("이건맞아")
else:
    print("둘다 구라야")   
ace = 25
if ace > 25:
    print("여윽시 에이스")
elif ace < 30:
    print("멍청이내가 더 어려")
else:
        print("gg")
회원가입시 넘어온 나이값이 정수형이면 "정산값"을 출력
그게 아니면 "잘못된 값" 을 출력하는 프로그램을 만들어 봅시다.
age = 42
if type(age) == int:
     print("정상값")
else:
    print("잘못된 값")
lst = 55
if type(lst) == int: 
    print("정상")
else: 
    print("잘못")
회원가입시 나이값이 100 이상이면 '유효한 나이를 입력해주세요'
0 미만 (음수)이면 '태어난거 맞나요?" 출력
age = 120
if age > 99:
    print("우효한 나이를 입력해주세요")
elif age < 0:
    print("태어난거 맞나요?")
else:
    print("DB저장완료")

중첩 조건문

  • 조건문 안에 조건문을 사용할수있다.
age = 18
if age > 99 or age < 0:
    print("유효한 나이를 입력해주세요.")
else: 
    if age < 20:
       print("20세이상만 회원가입이 가능 합니다.")
      else:
        print("DB 저장 완료")
input() # 사용자의 입력으로 부터 입력값을 받을수 있는 함수
age = input("나이를 입력하시오: ")
scoer = [90,100,51,78,66,88]
max 라는 단어를 입력받으면 최대값을 출력
min 라는 단어를 입력받으면 최소값을 출력
mean 라는 단어를 입력 받으면 평균값을 출력
max, min, mean 외에 다른 단어를 입력 받으면 "똑바로 입력하게요" 를 출력해서 혼내주자
scores = [90,100,51,78,66,88]
agg = input("max","min","mean: ")

from typing import AsyncContextManager
money = input ("얼마 인출 할래? ")

if money.isdigit():
    money = int(money)
    if account < money:
      print(f"인출이 불가능 합니다. {money - account}원의 잔액이 부족합니다. ")
    else:
        account -= money
        print(f"현재 잔액은 {account} 원입니다. ")
else:
        print(f"유효한 금액을 입력하세요. ")

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] # 짝수 개수
print(model_scores1)
print(model_scores2)
scores = model_scores1
scores = model_scores2

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

if length % 2:
    median_val = sorted(scores)[index]
else:
    median_val = (sorted(scores)[index] + sorted(scores)[index-1]) / 2

print(median_val)

반복문(loop)

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

while

  • 조건이 참 (`True) 인 동안 반복
  • 무한 반복 주의!!
while <condition>:>
    code context
n = 3 # 3단
i = 1 # 곱하는수 1~9 증가한다.

while i < 10: # i(곱하는수가) 10보다 작으면 반복해라
    print(f"{n} X {i} = {n*i}")
    i += 1 # i = i+1
  • break : 해당 반복문을 빠져 나온다.
n = 2
i = 1
while True:
    print(f"{n} X {i} = {n*i}")
    i += 1

    if i > 9:
        break
  • continue
    • 진행을 중단하고 반복으로 넘어간다.
n = 3
i = 1
while i < 10:
    if i % 2 i= 0:
        i += 1
    continue
    print(f"{n} X {i} = {n*i}")
          i += 1
fruits = {'사과': 'Apple', '바나나': 'Banana', '딸기': 'Strawberry'}
while True:
    word = input('사과')
    word = fruits.get(word)
    if word:
      print(word)
      break
    else:
        print("사전에 없습니다. 다시입력하세요")
다음과 같이 학습에 사용할 나이 데이터가 리스트에 담겨있다.
age_list = [20, 42,None,30,25,None,27,50,60]
None 값들은 결축지
None 값을 제외한 나이값들의 평균 구하시오.
age_list = [20,42,None,30,25,None,27,50,60]
age_list
index = len(age_list)

tmp = []

while index:
    index -= 1
    if age_list[index] is not None:
        tmp.append(age_list[index])

avg =sum(tmp) / len(tmp)
avg = int(avg)
avg

index = len(age_list)
while index:
    index -=1
    if age_list[index] is None:
        age_list[index] = avg
age_list
  • 중첩 while 문
i = 1
while i < 3:
    print(f"{i}번째 바깥쪽 while 문 입니다.")
    i += 1

    j = 1
    while j < 6:
        print(f"    {j}번째 안쪽 while 문 입니다.")
        j += 1
        
i = 1
while i < 10:
  k = 1
  while k < 10:
      print(f"{i} X {k} = {i*k}")
      k = k+1
      i += 1
a = 9
b = 1
while a < 10:
    print(f"{a} X {b} = {a*b}")
    b += 1

    if b > 9:
        break
  
i = 2
k = 1
while i < 9:
    print(f"{i} X {k} = {i*k}")
    k += 1
      
    if k > 9:
           
           break
i = 3
k = 1
while True:
    print(f'{i} X {k} = {i*k}') 
    k += 1
    
    if k > 15:
        break
i = 40
if i < 50:
    print:("진실")
elif i < 25:
  print("거짓)")
else:
  print("gkgk")


n = 2
while n < 10:[링크 텍스트](https://)
n = 2
while n < 10:
    print(f"{n} 단입니다.")

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

for

  • 반복 가능 (iterable)한 객체를 더이상 꺼낼수 없을때까지 반복한다.
  • list, tuple, set, dict, str
for <variab> in <ierable>
    conde context
lst =[1,2,3,4]
for item in lst:
    print(item ** 2)
n = 9
lst =[1,2,3,4,5,6,7,8,9]
for i in lst:
    print(f"{n} X {i} = {n*i}")
lst = [-2,1,4,-88,12,-12] # 음수만 출력
for i in lst:
    if i < 0:
        print(i)
lst = [3,33,100,23,81,44] # 3의 배수 출력
for i in lst:
    if i % 3 == 0:
      print(i)
    
lst = [3,33,100,23,81,44]
for i in lst:
     if i < 50 and i % 3 == 0:
         print(i)
      
        

lst =["dog","cat","rabbit"]
for i in lst:
  print(i.title()) # 대문자만 출력
lst =["dog","cat","rabbit"]
for i in lst:
    print(i[0].upper() + i[1:])
email_list = ["user1004@gmail.com","user100@naver.com","user1@gmail.com","user14@hanmail.net"] # 아이디만 추출
for i in email_list:
    i = i.split("@")[0]
    print(i)
    
email_list = ["user1004@gmail.com","user100@naver.com","user1@gmail.com","user14@hanmail.net"]
for i in email_list:
    if i.endswith("gmail.com"): # 해당 메일 주소만 추출
        print(i)

range 함수

  • 특정 구간의 숫자의 범위를 만들어주는 함수
  • 슬라이싱 기법을 이용해서 숫자의 범위를 만들어준다.
  • 파이선은 rang 라는 숫자의 범위를 가진 iterable한 특수한 객체를 반환
    -for문과 정말 자주 같이 사용된다.
range(0,10) # 숫자 0~9 까지 순차적으로 뽑겠다.
range(10) # range(0,10) 과 같다
type(range(0,10))
list(range(2,11,2))
range(10,0,-1)
n = 9
for i in range(1,10):
    print(f"{n} X {i} = {n*i}")
for i in range(1,40): # 내가 한거 4의배수
    if i % 4 == 0:
      print(i)
for x in range(4,41,4): # 선생님이 한거
  print(x)
for x in range(40,3,-4):  # 역순 출력 가능함
  print(x)
sum_value = 0
for i in range(1,11):
    sum_value += i
sum_value
sum(range(1,11))

tt = 0
for i in range(1,11):
    tt += i
tt

중첩 for

for n in range(2,10):
    print(f"{n} 단 입니다.")
    for i in range(1,10):
        print(f"{n} X {i} = {n*i}")
print("출력후 자동 줄바꿈이 되는 이유는")
print("뭘까?")
print(end=" ")
print(end=" ")
print(end=" ")
for i in range(1,6):
   print("$"*i)
n = 5
for i in range(n):
    for j in range(i + 1):
        print("*",end = "")
    print() 
    
*
**
***
***
****
n = 5
for i in range(n):
    # 공백 for문
    for _ in range(n-i-1):
        print("  ", end="")

    for _ in range(i+1):
        print("*", end=" ")

    print()

n = 5
for i in range(n):
    # 공백 for문
    for _ in range(i):
        print(" ", end="")
    # 별 for 문
    for _ in range(n-i):
        print("*", end="")

    print()



for i in range(1,10):
    for j in range(2,10):
        print(f'{j} X {i} = {j*i}', end = "\t" )
    print()

for j in range(1,10):
    for i in range(2,10):
        print(f'{i} X {j} = {i*j}', end = '\t')
    print()



- 각 학생들의 평균과의 점수 차이인 편차를 알고 싶다면?
scores = [90,81,65,77,98,70,82]
avg = sum(scores) / len(scores)
for scores in scores:
    deviation = avg - scores
    print(deviation)
scores = [90,81,65,77,98,70,82]
avg = sum(scores) / len(scores)
deviation_list = []
for score in scores:
    deviation = avg - score
    deviation_list.append(deviation**2)

var = sum(deviation_list) / len(deviation_list)
var
var ** 0.5
  • min-max scaling
  • 데이터의 수치의 범위를 바꿔주는 정규화 스케일링 기법이다.
  • 데이터의 범위를 0~1 사이로 바꿔준다.

나이 데이터 = [20,30,60,65,38,63]
연봉데이터 = [3000,3500,4000,9000,8000,12000]



lst = [20,30,40,60,65,38,630]
minmax = [0] # 스케일링을 적용할 데이터를 넣어주면 됩니다.

min_value = min(lst)
size_value = max(lst) - min_value

for X in lst:
    X = (X-min_value) / size_value
    minmax.append(X)
minmax


grades = ["A-","A" ,"A+","B","A","A","A+","A-","B","B","B","C+","C","C+","C"]


cnt = 0 # 값의 개수를 체크 하기 위한 용도
for g in set(grades): # set 을 이용하여 중복 제거 비효율적인 반복을 방지
    if cnt < grades.count(g): # g변수의 개수가 cnt 변수보다 크다면 최빈값
       cnt = grades.count(g) # 현재 최대 빈도수 cnt 에 업데이트
       mode = g # 최빈값 mode 변수에 저장
print(mode)

grades = ["A-","A" ,"A+","B","A","A","A+","A-","B","B","B","C+","C","C+","C"]

cnt =0
for g in set(grades):
    if cnt < grades.count(g):
       cnt = grades.count(g)
       mode = g
print(mode)
input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]
 
max_input = max(input)
my_list = [0] * max_input
print(my_list) #11개가 생김
for i in input:
    my_list[i-1] += 1 #input의 값 = my_list의 위치값, 나올때마다 +1하는 
    #i-1을 하는 이유는 파이썬의 index는 0부터 시작하기 때문이다.
    #즉 input의 1의 값은 my_list의 첫번째 index인 0번 index에서 +1을 하기위해서이다.
print(my_list)  
#[0, 3, 0, 0, 3, 6, 0, 0, 2, 0, 6]
#2-3번, 5-3번, 6-6번, 9-2번, 11-6번 나옴

#-------------경우1, 2의 다른 부분 ---------------#
print('my_list의 index를 1부터라고 했을 때, 최빈값은 %d 이며, 총 %d번 나왔다'
% (my_list.index(max(my_list))+1,max(my_list) ))
#list.index(인덱스번호 알고싶은값) => list에서 가장 최댓값의 index를 구하는 함수
#my_list.index(max(my_list)) 이 함수는 첫번째 최빈값만 불러옴.

#------------------------------------------------#

  • 문자열도 iterable 하다.
text = "Hello wold"
for s in text:
    print(s)

text = "Hello word"
cnt = 0 
for s in text:
    if s == "l":
        cnt += 1
print(cnt)
### `enumerlatee` 함수 
- iterable한 객체를 꺼낼때 인덱스도 같이 꺼낸다.
sr =[90,54,21]
k = 1
for i in sr:
    print(f'{k}번째 점수는 {i} 입니다.')
    k += 1
score_list = [90,87,93]
i = 0
for score in score_list:
    print(f"{i}번째 인덱스의 점수는 {score}")
    i += 1

for i,score in enumerate(score_list):
    print(f"{i}번째 인덱스의 점수는{score}")
enumerate(score_list)
list(enumerate(score_list))
dict(enumerate(score_list))
### `zip` 함수
class_list =["A반","B반","C반"]
score_list =[90 , 87 , 93]

length = len(class_list)
for i in range(length):
    print(f"{class_list[i]}의 점수는 {score_list[i]}점 입니다.")

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

for c,s in zip(class_list,score_list):
    print(f"{c}의 점수는{s}점")
score_list2 = [70,50,63]
for c , s , s2 in zip(class_list, score_list, score_list2):
    print(f"{c} {s} {s2}")
list(zip(class_list,score_list))
dict(zip(class_list,score_list))
lst1 = [10,20,30,40,50,60]
lst2 = ["A","B","C","D"]

for item1, item2 in zip(lst1,lst2):
    print(item1, item2)

# `dict` for 문
score_dict = {
      "국어" : 100,
      "수학" : 90,
      "영어" : 50
}

score_dict.keys()
for k in score_dict.keys():
    print(f"{k}는 {score_dict[k]}점")
score_dict.values()
for v in score_dict.values():
    print(f"{v}")
for k , v in score_dict.items():
    print(f"{k}는 {v}점")
    
sale = { '연필' : 500, '공책':1200, '신발':58000}
for k, v in sale.items():
    print(f"{k} 20% 할인가격: {v*0.8}원")

파이써닉 (pythonic)한 코드

  • 간결하고 가독성 있게 코딩하자.

삼항 연산자

  • 파이썬이 아닌 다른 언어들은 삼항연산자(?)가 존재하지만..
    파이썬 없음!
  • 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)
if age >= 20 : msg = "회원가입 가능"
for i in range(3) : print(i)
## 컴프리헨션 (Comprehension)
- 반복 가능한 객체를 활용해서 새로운 반복가능한 객체를 만들떄 유용하다.
- `list`, `set`,`dict` 를 자료형을 간단하게 만드는 
- `tuple` 은 컴프리헨션 지원 안한다.

list Comprehension
```python
[<추가할  for <변수> in <컬렉션> if <값에 대한 조건>]
result =[]
for data in range(1,6):
    result.append(data**2)
result
result = [ data**2 for data in range(1,6)]
result
num_list = list(range(1,21))
num_list
result = [ num for num in num_list if num % 2 ==0]
result
result = [ num*2 if num % 2 == 0 else num for num in num_list]
result
[ f"{n} X {i}={n*i}" for n in range(2,10) for i in range(1,10)]
%%timeit
lst = []
for data in range(1,100001):
    lst.append(data)
%%timeit
lst = []
for data in range(1,100001):
    lst.append(data)
      
s_list = []
for w in 'python':
    s_list,append(\)
s_list

s_list = [ w for w in "python"]
list
b_list = [ i for v in "b_list"]
list
lib_list = ["pandas","numpy","sklerarn","python"]
lst =[]
for i, v in enumerate(lib)
n_list = [ ]
for x in zip((1,2,3),(10,20,30),(100,200,300)):
    n_list.append(sum(x))
n_list
n_list = [sum(x)for x in zip((1,2,3),(10,20,30),(100,200,300))]
n_list
n_list = [ ]
for i in range(100):
    if i % 10 == 0 :
        n_list.append(i)
n_list
n_list = [ i for i in range(100) if i % 10 == 0 ]
n_list
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
files = ["magage.py","run.exe" , "urls.py" ,"run.bat" ,"image.jpg"]
[f for f in files if f.endswith(".py") or f.endswith(".exe")]

lst = [
    [1,2,3],   
    [4,5,6],
    [7,8,9]
]
[ n_list[1] for n_list in lst]
lst = [x for x in lst if x.endswith([2]) or x.endswith([5])] # 내 실패작
age_list = [20,42,None,30,25,None,27,50,60]
tmp = [ age for age in age_list  if age is not None]
avg = sum(tmp)/len(tmp)
avg
[age if age is not None else avg for age in age_list]
(실습) 
- 쇼핑 구매기록을 학습데이터로 활용하여 남자인지 여자인지 맞추는 인공지능 모델을 만든다고 가정하자. 
- 다음과 같이 인공지능이 예측한 값에 대한 리스트와 실제 정답값 리스트가 있다.
```python
pred_list  = [0,1,0,0,0,1,0,0,0,1]
label_list = [0,1,0,1,0,1,0,1,0,1]
  • 0 은 여자 이고 , 1 은 남자이다.

  • 인공지능 모델의 예측과 정답값을 일치한 개수를 리스트 컴프리헨션과 메소드 혹은 함수를 이용해서 구하고 데이터의 개수로 나누어 정확도를 구하시오.

    Accuracy = \frac{정답을 맞춘 개수}{전체 샘플 개수} pred_list = [0,1,0,0,0,1,0,0,0,1] # 모아님 풀이 label_list = [0,1,0,1,0,1,0,1,0,1] answer = ['a' if x == y else 'b' for x,y in zip(pred_list,label_list)] accurancy = answer.count('a') / len(answer) print(accurancy) pred_list = [0,1,0,0,0,1,0,0,0,1] # 선생님 풀이 label_list = [0,1,0,1,0,1,0,1,0,1] lst = [True, False, True] sum(lst) acc = [ int(pred == label) for pred,label in zip(pred_list, label_list)] # 선생님 풀이 acc = sum(acc) / len(label_list) acc
  • set 컴프리헨션
    a = {data for data in range(1,6)}
    a

  • dict 컴프리헨션
    a = ["아침", "점심", "저녁"]
    b = ["샌드위치", "유부초밥", "피자"]

result = { meal:food for meal,food in zip(a,b)}
result
dict(zip(a,b))
result = {f"{meal}시간" : food for meal,food in zip(a,b)}
result
{ meal : food for meal,food in zip(a,b) if meal != "점심"}

population = {
    "종로구" : 149384,
    "중구" : 125240,
    "용산구": 230040,
    "성동구": 293556,
    "광진구":346682,
    "동대문구":342837,
    "중랑구":394702,
    "성북구":437153,
    "강북구":308055,
    "도봉구":325257,
    "노원구":523037,
    "은평구":479835
 }
{ k:v for k,v in population.items() if v >= 300000}

lst = [v for v in population.values() if v >=300000 ]
sum(lst)
text = "#안녕#파이썬#파이썬#최고#파이썬#안녕"

{ word:text.count(word) for word in set(text.split("#")[1:])}
{ice:text.count(ice) for ice in tuple(text.split("#")[1:])}
def hhh():
    print('a')
    print('b')
    return
print(hhh())
def values(*vv):
    num = 1
    for i in vv:
        num *= i
    return num
print(values(5,4,8,6))
lst1 = ["안녕 ㅋㅋㅋㅋ"]
lst2 = ["나는 안 안녕 ㅋㅋㅋㅋ"]
def jjj(lst):
    for i in lst:
        print(i.replace("ㅋ",""))
jjj(lst1)
jjj(lst2)
def numsum(num1,num2):
    result = num1+num2
    return result
numsum(10,100)
num1 = int(input('첫번째'))
num2 = int(input('두번째'))
def num_test(i1,i2):
    
     result = num1+num2
     return result
num_test(num1,num2)
def num_test(num1,num2):
    
    result = num1+num2
    return result
num1 = int(input('첫번째'))
num2 = int(input('두번째'))

print(f'{num1} + {num2} = {num_test(num1,num2)}')
s = input("ff")
def no(aa):
    return s.replace("ㅋ","")
no(s)
num1 = int(input("정수"))
num2 = int(input("정수"))
op = input("연산자")
def num_list(*args):
    if op == '+':
        result = num1 + num2 
    elif op == '-':
        result = num1 - num2 
    elif op == '/':
        result = num1 / num2
    elif op == '*':
        result = num1 * num2
        return result
    else:
        print("값이 없습니다")
    
print(f'{num1} {op} {num2}{op}{num3}{op}{num4}{op}{num5}{op}{num6} = {num_list(num1,num2,num3,num4,num5,num6)} ')
profile
되고싶다 직무전환 성공하자!

0개의 댓글