Super Coding Addict
210112 TUE - 파이썬 기본문법 (3) 본문
< 반복문과 딕셔너리 >
- 딕셔너리는 키-값으로 구성되어 있기 때문에, 값을 가져올 때 인덱스가 아닌 키가 필요함을 주의!
- 딕셔너리에서 키-값 쌍을 반복문으로 가져오기
--> 딕셔너리 자료구조를 반복문으로 돌리면 키를 가져오므로, 이를 사용하여 값을 다시 가져와야 한다.
data = {
"빠삐코" : 300,
"죠스바" : 450,
"아맛나" : 430,
"스크류바" : 520,
"더위사냥" : 700
}
#반복문을 사용해서 data 딕셔너리에 있는 key와 value를 리스트에 각각 저장하라.
아이스크림명 = []
가격 = []
for key in data:
아이스크림명.append(key)
가격.append(data[key])
print(아이스크림명) #결과 : ['빠삐코', '죠스바', '아맛나', '스크류바', '더위사냥']
print(가격) #결과 : [300, 450, 430, 520, 700]
- 2개의 리스트를 하나의 딕셔너리로 구성
icecream = {} # 비어있는 딕셔너리 정의
for i in range(len(아이스크림명)):
icecream[아이스크림명[i]] = 가격[i] # 딕셔너리 추가하기 : 딕셔너리명[키] = 값
print(icecream)
#결과 : {'빠삐코': 300, '죠스바': 450, '아맛나': 430, '스크류바': 520, '더위사냥': 700}
- keys(), values(), items() 메서드
# 리스트 형태로 가져온다!
아이스크림명 = list(data.keys()) #data의 키 모두 가져오기
가격 = list(data.values()) #data의 값 모두 가져오기
# data.items()의 결과
dict_items([('빠삐코', 300), ('죠스바', 450),
('아맛나', 430), ('스크류바', 520), ('더위사냥', 700)])
###이렇게 키-값을 튜플 형태로 준다!
for k, v in data.items(): #data의 키와 값 가져오기 반복문
print(k, v)
#결과
빠삐코 300
죠스바 450
아맛나 430
스크류바 520
더위사냥 700
- 연습문제
# data 딕셔너리 안의 아이스크림 이름을 다음과 같은 형태로 출력
빠**
죠**
아**
스***
더***
for key in data:
print(key[0], end="")
for x in range(len(key)-1):
print("*", end="")
print('')
# 400원대 아이스크림 개수 출력하기
# 1) 리스트에 append한 후, len()으로 리스트 개수세기
result = [ ]
for key in data:
if(400 <= data[key] < 500):
result.append(key)
print(len(result))
# 2) result변수를 선언하여 0으로 초기화한 후 조건충족할 때마다 +1
result = 0
for key in data:
if(400 <= data[key] < 500):
result += 1
print(result)
- 이차원 리스트
# 이차원 리스트 예시
data = [
["101동", "102동", "103동"],
["201동", "202동", "203동"],
["301동", "302동", "303동"],
]
##########################################
# 이차원 리스트 반복문 연습
딕셔너리 ={
"시가" : [100, 20, 30, 40],
"고가" : [200, 40, 50, 60]
}
###값이 리스트이다
for key in 딕셔너리:
print(딕셔너리[key])
#결과:
[100, 20, 30, 40]
[200, 40, 50, 60]
##########################################
###이렇게 리스트로 나온 값을 다시 반복문으로 찍어줄 수 있다.
for key in 딕셔너리:
리스트 = 딕셔너리[key]
#[100, 20, 30, 40],
#[200, 40, 50, 60]
for 변수 in 리스트:
print(변수)
print("-----------------")
#결과:
100
20
30
40
-----------------
200
40
50
60
-----------------
< While문 >
- 반복횟수가 정해져 있는 경우 for문을 쓰는 반면, 무한반복 또는 반복해야 할 횟수가 정해져있지 않은 경우 사용!
while 조건:
코드
조건이 참일 경우 코드가 계속 반복 실행된다
- break : 가장 가까운 반복문 탈출
#예제
import pybithumb
import time
while True:
price = pybithumb.get_current_price("BTC")
if price > 39730000 :
break
print(price)
time.sleep(1)
#price가 3973000원보다 크면 while문을 종료하고
그렇지 않으면 price를 출력한 뒤 1초 잠시 쉬고 다시 반복한다.
#참고: time.sleep(second)
쉴 세없이 정보를 가져오면 디도스공격으로 오인될 수 있으므로 1초 간격으로 반복문을 실행하도록~
- 연습문제 : 로또번호 6개 출력하기
import random
# 내 코드
list = [ ]
while len(list) < 6: # list의 길이가 6보다 작으면 반복 --> 길이가 6개가 되면 반복 끝
숫자 = random.randint(1, 45) # 1부터 45(포함)사이의 정수 랜덤 뽑기
list.append(숫자)
print(list)
#모범 답안
i = 0
result = []
while True:
i = i + 1
숫자 = random.randint(1, 45)
result.append(숫자)
if i == 6:
break
print(result)
#비복원추출이라면 if 변수 not in 자료구조 사용하기
i = 0
result = []
while True:
숫자 = random.randint(1, 46)
if 숫자 not in result:
result.append(숫자)
i = i + 1
if i == 6:
break
print(result)
#비복원추출에는 set()메서드를 쓸 수도 있다 --> 중복제거!
i = 0
result = []
while True:
i = i + 1
숫자 = random.randint(1, 46)
result.append(숫자)
#중복 제거 후 업데이트
result = list(set(result))
if len(result) == 6:
break
print(result)
- continue : 반복문의 시작위치로 돌아가서 재실행, 특정 조건 만족시 일부 코드 실행하고 싶지 않을 때 사용
- 예제
# 10이내의 정수만 입력받고 싶다면,
while True:
num = int(input("숫자입력:"))
if num > 10 :
print("범위를 벗어났습니다. ")
continue # 다시 첫줄로 돌아간다
print(num + 3)
- 연습문제 : 원하는 자릿수 암호 자동생성 프로그램 작성하기
import string
# 다음은 비밀번호로 빈번히 사용되는 문자열이다.
print(string.ascii_letters) #abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits) #0123456789
print(string.punctuation) #!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
# 이 세 종류의 문자열을 더해 비밀번호에 사용하기 위한 하나의 문자열 후보로 구성한다
후보 = string.ascii_letters + string.digits + string.punctuation
# 가령,
index0 = random.randint(0, len(후보)-1) #랜덤으로 하나의 숫자를 뽑아 index를 만든다
index1 = random.randint(0, len(후보)-1)
index2 = random.randint(0, len(후보)-1)
print(후보[index0] + 후보[index1] + 후보[index2]) # `F4
# 이를 응용해, input()함수로 자릿수를 입력받아 자릿수만큼의 비밀번호를 자동생성할 수 있다
user_in = int(input("자릿수:"))
# 반복횟수가 정해져 있으므로 while보다는 for를 사용
result = []
for 횟수 in range(user_in):
인덱스 = random.randint(0, len(후보)-1)
result.append(후보[인덱스])
print(result)
print("".join(result)) #리스트에 저장된 값들 하나로 합쳐주기
#사용자가 '종료'라고 입력할 때까지 이 프로그램 반복하기
while True:
user_in = int(input("자릿수:"))
if val == "종료":
break
#반복 실행될 코드
result = "" #리스트에 append하지 않고 문자열에 더하는 방식으로 해보기
for 횟수 in range(user_in):
인덱스 = random.randint(0, len(후보)-1)
result += 후보[인덱스]
print(result)
- cf. 암호만들기 프로그램 연습문제 (혼자풀기)
#첫글자를 대문자 + 특수문자 1개를 사용하는 암호 만들기
import string
import random
후보 = string.ascii_letters + string.digits + string.punctuation
while True:
user_in = int(input("암호의 자릿수를 입력하세요."))
if user_in < 2: # 조건 상 2글자보다 많아야 함
continue
#반복 실행될 코드
result = ""
for 횟수 in range(int(user_in)):
if 횟수 == 0: #첫글자(대문자)
인덱스 = random.randint(26, 53)
result += 후보[인덱스]
elif 횟수 == 1: #두번째 글자(숫자)
인덱스 = random.randint(54, 64)
result += 후보[인덱스]
else:
인덱스 = random.randint(0, len(후보)-1)
result += 후보[인덱스]
print(result)
- 연습문제 : 컴퓨터와 업앤다운 게임하기 (5번의 기회)
import random
임의의숫자 = random.randint(1, 50)
i = 0
while True:
if i == 5:
print("컴퓨터의 승리입니다.")
break
val = int(input())
if val == 임의의숫자:
print("정답입니다. 당신이 승리했습니다.")
break
elif val > 임의의숫자:
print("Down")
i += 1
else:
print("Up")
i += 1
< 파이썬 함수 >
- 함수 정의 : (코드 부분 들여쓰기 주의!)
def 함수이름():
코드
- 함수 호출 : (호출 전 반드시 함수 정의가 되어 있어야 한다)
함수이름()
def 함수(문자열) :
print(문자열)
함수("안녕")
함수("Hi")
#결과
안녕
Hi
- 예제
#함수정의
def 인사하기():
print("안녕!")
print("반가워요~")
print("내이름은 피치!")
#함수호출
인사하기()
#결과
안녕!
반가워요~
내이름은 피치!
- 입력(파라미터값)이 있는 함수 : 재사용성을 더욱 높이기 위해 변수와 함수를 연결
- 함수 정의:
def 함수이름(변수) : <- 변수에는 정수, 문자열, 리스트 등이 올 수 있음
코드
- 함수 호출:
함수이름(파라미터)
==> 항상 파라미터 값은 함수에서 정의해둔 개수만큼 입력해주어야 한다!
- 예제
def 청첩장(신랑, 신부):
print( f"{신랑} ♡ {신부} 결혼을 축하합니다")
청첩장("철수", "영희")
청첩장(신랑="철수", 신부="영희")
###############################################
만약, 신부가 늘 영희라면?!
def 청첩장(신랑, 신부="영희")
print( f"{신랑} ♡ {신부} 결혼을 축하합니다")
청첩장("철수")
< 연습문제 풀이 ! ( 복습 예제 풀기 '_' ) --> 어려웠거나 인상깊은 문제 위주로 정리 >
# "비트코인" 문자열을 100번 출력하는 함수 작성
def print_coins():
for i in range(100):
print("비트코인")
print("A")
def messages1() :
print("B")
print("C")
def messages2() :
print("D")
message1()
print("E")
message2()
#결과
A
C
B
E
D
들여쓰기가 없는 부분은 일반코드이므로 호출하지 않아도 그대로 출력...
그러나 함수 정의부를 위에 써주고 일반코드는 밑에 써주는 식으로해서
깔끔히 작성하는 게 좋다!
def message1()
print("A")
def message2()
print("B")
message1()
message2()
#결과
B
A
### 함수 안에서 또 다른 함수 호출 가능!
def message1()
print("A")
def message2()
print("B")
def message3()
for i in range (3) :
message2()
print("C")
message1()
message3()
#결과
B
C
B
C
B
C
A
### message3() 함수를 실행하면 message2()함수 호출 & C출력이 3번 반복된 후,
반복문을 빠져나와 message1() 함수를 실행
#하나의 문자를 입력받아 문자열 끝에 ":D" 스마일 문자열을 이어 붙여 출력하는
print_with_smile 함수를 정의
def print_with_smile(문자):
print(f"{문자}:D")
#두 개의 숫자를 입력받아 합/차/곱/나눗셈을 출력하는 print_arithmetic_operation 함수를 작성
def print_arithmetic_operation(a, b):
print(a, "+", b, "=", a+b)
print(a, "-", b, "=", a-b)
print(a, "*", b, "=", a*b)
print(a, "/", b, "=", a/b)
#세 개의 숫자를 입력받아 가장 큰수를 출력하는 print_max 함수를 정의하라.
단 if 문을 사용해서 수를 비교하라.
1) 내 코드
def print_max(a, b, c):
if a > b:
if a > c:
max = a
else:
if b > c:
max = b
else:
max = c
print(max)
2)모범답안
def print_max(a, b, c) :
max_val = 0
if a > max_val :
max_val = a
if b > max_val :
max_val = b
if c > max_val :
max_val = c
print(max_val)
# 입력된 문자열을 역순으로 출력하는 print_reverse 함수를 정의하라.
1) 내 코드
def print_reverse(문자열):
string = ""
for i in 문자열[::-1]:
string += i
print(string)
2) 모범 답안
def print_reverse(string) :
print(string[::-1])
### 그냥 역으로 슬라이싱을 하면 되는거였다...ㅎㅎ
#성적 리스트를 입력 받아 평균을 출력하는 print_score 함수를 정의
# 1) 내 코드
def print_score(리스트):
sum = 0
for i in 리스트:
sum += i
print( sum / len(리스트) )
# 2) 모범답안
def print_score(score_list) :
print(sum(score_list)/len(score_list))
### sum 함수를 이용하면 좀 더 간단하게 작성가능!
#입력 문자열을 한 줄에 다섯글자씩 출력하는 print_5xn(string) 함수를 작성
# 1) 내 코드
def print_5xn(문자열):
for i in range(len(문자열)):
print(문자열[i], end="")
if (i+1) % 5 == 0:
print("")
# 2) 모범답안
def print_5xn(line):
chunk_num = int(len(line) / 5)
for x in range(chunk_num + 1) : # 모든 문자열의 길이가 5의 배수가 아닐 수도 있으니
print(line[x * 5: x * 5 + 5])
#문자열과 한줄에 출력될 글자 수를 입력을 받아 한 줄에 입력된 글자 수만큼 출력하는
print_mxn(string) 함수를 작성하라.
def printmx(문자열, 글자수):
chunk_num = int(len(문자열) / 글자수) #나누면 float가 되기 때문에 int로 형변환 !!!
for i in range(chunk_num + 1):
print(문자열[i*글자수 : i*글자수 + 글자수])
글자수 = int(input("한줄에 출력될 글자 수를 입력하세요."))
printmx("아이엠어보이유알어걸", 글자수)
# 에러 발생 이유
def n_plus_1 (n) :
result = n + 1
n_plus_1(3)
print (result)
### 함수 내부에서 정의한 지역변수는 함수를 빠져나오면 사용 불가!
여기서 print(result)에서 result는 전역변수를 찾게 되는데 result로 선언된 전역변수는 없으므로
에러가 난다.
#문자열을 입력받아 각 문자들로 구성된 리스트로 반환하는 make_list 함수를 정의
# 1) 내 코드
def make_list(문자열):
list = []
for i in range(len(문자열)):
list.append(문자열[i])
return list
# 2) 모범답안
def make_list (string) :
return list(string)
### 문자열을 list로 형변환하면 알아서 문자열이 하나씩 잘려 리스트에 들어간다...ㅎㅎ
# 콤마가 포함된 문자열 숫자를 입력받아 정수로 변환하는 convert_int 함수를 정의
# 1) 내 답안
def convert_int(숫자):
num_list = 숫자.split(',')
string = ""
for i in num_list:
if i != ',':
string += i
return int(string)
# 2) 모범답안
def convert_int (string) :
return int(string.replace(',', ''))
### replace를 쓰면 이렇게 간단할 일을...ㅋㅋㅋ
리스트에 ,를 기준으로 split하여 문자열을 쪼개 저장하고
그걸 다시 반복문을 돌려 ,이 아닌 것만 추려내 문자열로 모은다음 다시 int로 형변환해 리턴까지
엄청 코드가 길~~어졌다..ㅎㅎ
# 결과값 예측
def 함수1(num) :
return num + 4
def 함수2(num) :
num = num + 2
return 함수1(num)
c = 함수2(10)
print(c)
#결과 : 16
return에도 또 다른 함수를 호출한 후 그로부터 return된 값을 넣어줄 수 있군!
# 결과값 예측
def 함수0(num) :
return num * 2
def 함수1(num) :
return 함수0(num + 2)
def 함수2(num) :
num = num + 10
return 함수1(num)
c = 함수2(2)
print(c)
함수2(2) -> num = 2 -> num = 12 -> 함수1(12) -> 함수0(14) -> 28
함수2는 return에서 함수1을, 함수1은 return에서 함수0을 호출하므로
함수0에서 값을 return해주면 함수1의 return으로 돌아가고, 다시 함수2의 return으로 돌아가
함수2에서 return한 값이 최종적으로 c에 저장된다
'Python활용 빅데이터전문가과정' 카테고리의 다른 글
210111 MON - 파이썬 기본문법 (2) (0) | 2021.01.13 |
---|---|
210108 FRI 수업 - 파이썬 기본문법(1) (0) | 2021.01.10 |
210107 THU 수업 - MySQL문법(3) (0) | 2021.01.07 |
210106 WED 수업 - MySQL 문법(2) (0) | 2021.01.06 |
210105 TUE 수업 - MySQL 문법(1) (0) | 2021.01.05 |