파이썬 python

04 예제

ynzify 2023. 5. 7. 19:51

Q.

다음의 리스트에 학생 점수가 담겨 있다.
"max" 단어를 입력 받으면 최대값을 출력
"min" 단어를 입력 받으면 최소값을 출력
"mean" 단어를 입력 받으면 평균을 출력
"max" , "min" , "mean" 외에 다른 단어를 입력 받으면 "똑바로 입력하세요" 를 출력
scores = [90,100,51,78,66,88]
max 함수 쓸 때 형태 max(scores)처럼 max 앞에다가 놓고 () 괄호 쳐주기
print ()는 괄호로 꼭 감싸주기!

 

= 과 ==의 차이
= ==
●  할당 연산자로, =을 한번 쓰면 우항에 있는 피연산자(operand)를 좌항의 피연산자에 할당함
●  = 오른쪽의 긴 함수를 왼쪽의 짧은 이름으로 부르고 싶어 변수로 설정할 때에 많이 씀
●  비교 연산자
●  두 객체(object: 숫자, 문자열, 리스트, 튜플 등)의 값이 같은지 비교함

 

 

내가 한 방식

>>> scores = [90,100,51,78,66,88]

>>> a = input("max,min,mean: ")

#여기서 a == max 라고 써주게 되면 max라는 함수로 인식해버림
#우리가 원하는 max값은 input에서 받은 max 값이잖아

>>> if a == "max":
>>>     print (max(scores))

>>> elif a == "min":
>>>     print (min(scores))

>>> elif a == "mean":
>>>     b = sum(scores)/len(scores)
>>>     print (b)

>>> else:
>>>     print ("똑바로 입력하세요")

 

강사님 방식

>>> scores = [90,100,51,78,66,88]

>>> agg = input("max, min, mean: ")

#정렬하고 문자열 써주기
>>> scores_sort = sorted(scores)

>>> if agg == "max":
>>>     print(scores_sort[-1])
>>> elif agg == "min":
>>>     print(scores_sort[0])
>>> elif agg == "mean":
>>>     print( sum(scores_sort)/len(scores_sort) )
>>> else:
>>>     print("똑바로 입력하세요")

 

Q.

input 함수로 휴대전화 번호를 입력 받아서(무조건 xxx-xxxx-xxxx 형식으로 입력받는다고 가정)
휴대번호 앞자리 3개에 맞는 통신사를 출력하는 프로그램을 작성해보세요

011 -> SKT
016 -> KT
019 -> LGU
모두 아닐경우 -> UNK

 

# 굳굳 근데 "무조건 xxx-xxxx-xxxx 형식으로 입력받는다고 가정" 이 조건 안 넣어줌
>>> a = input("phone: ")

# telecom = phone.split("-")[0] 이거 추가해줘야함 그래서
>>> if a.startswith("011"):
>>>     print ("skt")

>>> elif a.startswith("016"):
>>>     print ("kt")

>>> elif a.startswith("019"):
>>>     print ("lg")

>>> else:
>>>     print ("unk")

근데 phone.split("-")[0] 에서 [0]이 무슨 역할을 하는지 모르겠음

 

# 조건문 안쓰고 딕셔너리 이용해서 구현해보기

>>> phone = input()
>>> telecom = phone.split("-")[0]
>>> telecom_dict = {
>>>     "011": "SKT",
>>>     "016" : "KT",
>>>     "019" : "LGU"
>>> }
>>> result = telecom_dict.get(telecom,"UNK")
>>> print(result)

근데 궁금한거 딕셔너리에서 전화번호 시작값이 011,016,019잖아. 근데 저 숫자만 들어가기만 하면 딕셔너리에서 찾는건지 아니면 저 값으로 시작을 해야지만 실행이 제대로 되는건지 궁금! (테스트해봤을 때는 시작이 저렇게 되야지만 실행도긴함 unk뜨더라고)

 

 

 

Q.

계좌에 10000원이 들어 있습니다. 인출 금액을 입력 받는다.
인출 금액을 isdigit 메소드를 이용해서 숫자가 아닐 경우 "유효한 금액을 입력하세요" 출력

인출 금액이 계좌에 있는 금액보다 크면 "인출이 불가능합니다. xxxx 원의 잔액이 부족합니다. "

출력 인출 금액이 계좌에 있는 금액보다 작거나 같으면 "xxx 원이 인출되었습니다."
출력 숫자가 제대로 입력될 경우 항상 마지막에 현재 계좌의 잔액을 출력 ex) "현재 잔액은 xxx원 입니다."
account = 10000

 

isdigit method
  • Python의 isdigit() 함수는 문자열이 숫자로 구성되어 있는지 판별해주는 함수
  • 다만, 음수나 소숫점이 있을 경우에는 숫자임에도 불구하고 False를 리턴
  • 이 메소드는 문자열의 모든 문자가 숫자일 때 true를 반환하고 그렇지 않으면 false 반환
  • 사용법
    • str.isdigit("판단하고자 하는 문자열")
    • "판단하고자 하는 문자열".isdigit()

 

조건은 if 와 elif 에 넣을수 있고 else 만 조건을 넣을수 없다

 

>>> extract = input("인출할 금액을 입력: ")

#isdigit에서 가져올 값을 extract에서 받야지 account가 아니라
>>> if not extract.isdigit():
>>>     print ("유효한 금액을 입력하세요")

#개편한 f-string 기법을 이용하자
>>> elif extract>account:
>>>     print(f"인출이 불가능합니다. {extract-account}원의 잔액이 부족합니다.")

-> TypeError: '>' not supported between instances of 'str' and 'list'

 

처음부터 이런 식으로 extract = int(input("얼마를 뽑으시나요? ")) int 문으로 사용하지 않는 이유

 

>>> extract = int(input("인출할 금액을 입력: "))
>>> if not extract.isdigit():
>>>     print ("유효한 금액을 입력하세요")
    
#isdigit 0-9인지를 판별
      
>>> elif extract > account:
>>>     a = int(extract - account)
>>>     b = f"인출이 불가능 합니다 {a}원의 잔액이 부족합니다"
>>>     print (b)

-> TypeError:'int' object has no attribute 'isdigit'

 

문자열이랑 숫자열이랑 혼용 불가!

extract = input("얼마를 뽑으시나요? ")으로 우선 받고 나중줄에서 int처리 해주기

 

 

하지만 보시다시피 또 에러가 뜬다

여기서 알 수 있는 사실: 중첩조건문을 이용하자

>>> extract = input("인출할 금액을 입력: ")
>>> extract = int(extract)

>>> if not extract.isdigit():
>>>     print ("유효한 금액을 입력하세요")

>>> elif extract > account:
>>>     print(f"인출이 불가능합니다. {extract-account}원의 잔액이 부족합니다.")
    
-> ValueError: invalid literal for int() with base 10: 'dffsf'

 

 

이렇게 출력하고 싶었는데 else문에 조건을 달 수 없으니까 살짝 순서를 바꿔볼께

account = 10000
extract = input("인출할 금액을 입력: ")

#isdigit에서 가져올 값을 extract에서 받야지 account가 아니라
if extract.isdigit():
    extract = int(extract)

    if extract < account:
        print(f"{account-extract} 원이 인출되었습니다.")

    elif extract > account:
        print(f"인출이 불가능합니다. {extract-account}원의 잔액이 부족합니다.")

else not extract.isdigit():
    print ("유효한 금액을 입력하세요")
    
-> SyntaxError: invalid syntax

 

엥 똑같음 input 안에 "   "문자를 넣어가지구 그런가 (아니네 오류가 미묘하게 다르네)

#아님 account = [10000] 가 문제임 이게 리스트문이어가지고 account = 10000 으로 바꿔줘야함

>>> extract = input("인출할 금액을 입력: ")

#isdigit에서 가져올 값을 extract에서 받야지 account가 아니라
>>> if extract.isdigit():
>>>     extract = int(extract)

>>>     if extract < account:
>>>         print(f"{account-extract} 원이 인출되었습니다.")

>>>     elif extract > account:
>>>         print(f"인출이 불가능합니다. {extract-account}원의 잔액이 부족합니다.")

>>> else:
>>>     print ("유효한 금액을 입력하세요")
    
-> TypeError: '<' not supported between instances of 'int' and 'list

 

 

오 드뎌 돌아감

>>> account = 10000
>>> extract = input("인출할 금액을 입력: ")

#isdigit에서 가져올 값을 extract에서 받야지 account가 아니라
>>> if extract.isdigit():
>>>     extract = int(extract)

>>>     if extract < account:
>>>         account -= extract # account = account - extract
>>>         print(f"{extract} 원이 인출되었습니다.")


>>>     elif extract > account:
>>>         print(f"인출이 불가능합니다. {extract-account}원의 잔액이 부족합니다.")

>>>     print (f"현재 잔액은 {account}원 입니다.")
>>> else:
>>>     print ("유효한 금액을 입력하세요")

 

이건 내가 맨 처음 수업시간에 풀었던거

근데 이렇게 하며 통장 잔액이 줄지를 않고 10000원으로 계속 새로고침 됨

 

>>> money = (input("얼마를 뽑으시나요? "))

>>> if not money.isdigit():
>>>     print ("유효한 금액을 입력하세요")


>>> elif int(money) <= account:
>>>         money = int(money)
>>>         c = f"{(money)}원이 인출 되었습니다"
>>>         d = f"현재 잔액은 {account - money}원 입니다"
>>>         print (c + " " + d)

>>> elif int(money) > account:
>>>     money = int(money)
>>>     a = (money) - account
>>>     b = f"인출이 불가능 합니다 {a}원의 잔액이 부족합니다"
>>>     print (b)

 

 

Q.

DB에서 회원정보를 딕셔너리형태로 불러왔다.
key는 아이디 이고, value는 비번 이다.

아이디와 비번을 입력 받아 회원정보가 없을 경우 '회원 정보가 없습니다.' 를 출력
아이디와 비번이 일치할 경우 '{아이디}님 환영합니다!' 를 출력
회원정보는 있지만 비번이 틀릴경우 '비밀번호를 정확히 입력하세요!' 를 출력
>>> user_info = {
>>>     "karns" : "a1234",
>>>     "pandas" : "b1234",
>>>     "pytorch" : "c1234",
>>> }

 

 

내 의문점

#출력이 안되고 실행이 됐다고만 뜨는데 왜일까

>>> id_insert = input("id: ")
>>> pw_insert = input("pw: ")

>>> pw_insert = user_info.get(id_insert)
>>> if pw_insert == user_info.values:
>>>     print ("welcome")

>>> elif not id_insert:
>>>     print ("no id")

 

Q. pw는 value 값이니까 value랑 비교해야 한다고 생각했었는데 패스워드인데 왜 id_insert랑 비교해야 하나요...?

 

A. user_info 가 딕셔너리 자료형일 때, key 가 아이디이고 value가 패스워드이다

 

입력 받은 아이디로 딕셔너리 key 로 접근하면 value 로 반환 되니까

패스워드와 user_info[id_insert] 랑 비교하게 되는 것이다!

 

elif not id_insert: <== 여기도 문제

user_info.keys() 하면 키 값들이 반환 되는데 키 값들이 아이디니까 저 안에 포함되어있는지 여부를 체크해 줘야 해서

id_insert not in user_info.keys() 이렇게 변경해주기!

 

 

1차 수정

# if 코드만 돌아가고 다른 id 입력하면 실행이 안됨 ㅠㅜ

>>> id_insert = input("id: ")
>>> pw_insert = input("pw: ")

>>> pw_insert = user_info.get(id_insert)

>>> if pw_insert == user_info[id_insert]:
>>>     print ("welcome")

>>> elif id_insert not in user_info.keys:
>>>     print ("no id")

# else에는 not in 사용불가
>>> else:
>>>     print ("no pw")
 
elif id_insert not in user_info.keys 이부분에서
user_info.keys 이게 user_info.keys() 식으로 변경
 
keys 는 딕셔너리 객체의 메서드니까 (딕셔너리 안에 키값들을 반환) keys도 실행해주기!

 

뭐 안될줄 알았음

dtl로 막 쳤는데 없는 아이디라 하고 elif 문으로 안넘어감

user_info[id_insert] 가 아니라 그냥 user_info() 로 불러와야 하는듯

 

 

>>> id_insert = input("id: ")
>>> pw_insert = input("pw: ")

>>> pw_insert = user_info.get(id_insert)

#여기서 아이디값 dtl 입력
>>> if pw_insert == user_info[id_insert]:
>>>     print ("welcome")

>>> elif id_insert not in user_info.keys():
>>>     print ("no id")

>>> else:
>>>     print ("no pw")
    
-> KeyError: 'dtl'

 

응 아니야 안돼 user_infor 그냥 이거야

드디어 돌아감

 

내눈에는 세개 다 똑같아보이는데 무슨 차이인지 물어보자

 

 

 

물어봤는데 코드를 뜯어 고쳐야해요

 

 

>>> id_insert = input("id: ")
>>> pw_insert = input("pw: ")

>>> pw_insert = user_info.get(id_insert)

#여기서 아이디값 dtl 입력
>>> if pw_insert == user_info:
>>>     print ("welcome")

>>> elif id_insert not in user_info.keys():
>>>     print ("no id")

>>> else:
>>>     print ("no pw")

 

1.세번째 줄에  

pw_insert = user_info.get(id_insert) 이건 삭제:
애초애 pw_insert는 사용자가 입력한 패스워드를 넣는 부분인데
너가 지금 user_info.get(id_insert)이걸 넣음으로서 딕셔너리에 있는 패스워드를 다시 넣어버린 꼴이 되버림

 

2. 4번째 줄에
if pw_insert == user_info.get(id_insert):
그리고 두번째는 이렇게 쓰는게 맞음

user_info(): 이것도 아니고 

user_info:이것도 아니라 

user_info.get(id_insert) 이거라고

 

다 ㅈㄴ 똑같아 보이는데 하나씩 해보았다

 

 

user_info() 의 에러

id_insert = input("id: ")
pw_insert = input("pw: ")

#여기서 아이디값 dtl 입력
if pw_insert == user_info:
    print ("welcome")
elif id_insert not in user_info.keys():
    print ("no id")
else:
    print ("no pw")
    
-> TypeError: 'dict' object is not callable

 

 

user_info 의 에러

겉보기에는 잘 돌아가는 것 같으나 id pw를 올바르게 둘다 쳤을 때 no pw를 출력해버림 (나머지는 잘 작동된다)

 

 

그래서 결론적으로는 이것만 제대로 돌아간다

 

id_insert = input("id: ")
pw_insert = input("pw: ")

if pw_insert == user_info.get(id_insert):
    print ("welcome")

elif id_insert not in user_info.keys():
    print ("no id")

# else에는 not in 사용불가
else:
    print ("no pw")

 

 

끙 어려워 밑에는 강사님 답안

뭔가 미묘하게 다른듯 안다른듯 한 이부분이 어렵다는 뜻임

 

A

>>> input_id = input("id: ")
>>> input_pw = input("pw: ")

>>> input_pw = user_info.get(input_id) # 해당 키가 없을 경우 None 반환

>>> if not input_pw: # pw가 None 일 경우 False 로 인식되서 True 조건을 만들기 위해 not 키워드를 추가로 사용
>>>     print('no id')
>>> elif input_pw == input_pw:
>>>     print(f'welcome {input_id}!')
>>> else:
>>>     print('wrong pw')

 

 

 

Q.

다음과 같이 한영사전이  dict 형태로 되어있다.
{'사과': 'Apple', '바나나': 'Banana', '딸기': 'Strawberry'}

사용자의 입력을 받아 사전에 없는 단어(key)를 입력받으면 "사전에 없습니다. 다시 입력하세요" 출력 하고
입력 대기사전에 단어(key)가 있으면 해당하는 단어(value)를 출력하고 반복문을 빠져나오게 하자.
>>> fruits = {'사과': 'Apple', '바나나': 'Banana', '딸기': 'Strawberry'}

 

while True 이용하기

while에 조건식 대신 True를 지정하면 무한히 반복하는 무한 루프가 만들진다

따라서 조건식이 항상 참(True)이므로 변화식도 필요 없음

 

>>> word = input("과일 단어 입력: ")
>>> while True:
    
>>>     word = fruits.get(word) # 키가 없을 경우 None 반환
>>>     if word:
>>>         print(word)
>>>         break
>>>     else:
 >>>        print("사전에 없습니다. 다시 입력하세요")

 

 

Q.

다음과 같이 학습에 사용할 나이 데이터가 리스트에 담겨 있다.

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 = [20,42,None,30,25,None,27,50,60]

>>> age_list.pop(None)
>>> age_list

-> TypeError: 'NoneType' object cannot be interpreted as an integer

 

구한 평균 값으로 age_list의 결측치(None)를 채워라

 

 

Q.

for 문을 이용해여 출력해보자

*
**
***
****
*****
    *
   **
  ***
 ****
*****
for문을 이용해서 표준편차를 구해보자
>>> scores = [90,81,65,77,98,70,82]

 

 

Q.

Min - Max Scaling
  • 데이터 수치의 범위를 바꿔주는 정규화 스케일링 기법
  • 데이터 수치의 범위를 0~1 사이로 바꿔준다
for 문을 이용해서 리스트에 minmax scaling을 적용한 데이터로 변환해주세요

 

>>> lst = [20,30,60,65,38,63]

 

 

Q.

다음의 학점이 있는 데이터에서 최빈값을 구하시오
grades =  ["A-","A" ,"A+","B","A","A","A+","A-","B","B","B","C+","C","C+","C"]

 

 

Q.

관수 문구점에서는 아래 딕셔너리에 있는 물품들을
아주 파격적으로 20% 할인된 가격으로 판매하려고 합니다.
반복문을 활용하여 다음과 같이 각각의 할인가격이 출력되도록 프로그래밍해주세요.

연필 20% 할인가격: 400.0원
공책 20% 할인가격: 960.0원
신발 20% 할인가격: 46400.0원
>>> sale = {"연필": 500, "공책": 1200, "신발": 58000}

>>> for k,v in sale.items():
>>>     print(f"{k} 20% 할인가격: {v*0.8}원")

연필 20% 할인가격: 400.0원
공책 20% 할인가격: 960.0원
신발 20% 할인가격: 46400.0원

 

 

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

 

>>> pred_list  = [0,1,0,0,0,1,0,0,0,1]
>>> label_list = [0,1,0,1,0,1,0,1,0,1]

 

다음의 일반적인 for문을 이용한 리스트 생성 코드를 컴프리헨션 문법 코드로 변경하시오.

 

1

>>> n_list = []
>>> for x in zip((1, 2, 3), (10, 20, 30), (100, 200, 300)):
>>>     n_list.append(sum(x))
>>> n_list

 

2

>>> n_list = []
>>> for i in range(100):
>>>     if i % 10 == 0:
>>>         n_list.append(i)
>>> n_list

 

3

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