Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

210112 TUE - 파이썬 기본문법 (3) 본문

Python활용 빅데이터전문가과정

210112 TUE - 파이썬 기본문법 (3)

밍응애 2021. 1. 15. 22:41

< 반복문과 딕셔너리 >

- 딕셔너리는 키-값으로 구성되어 있기 때문에, 값을 가져올 때 인덱스가 아닌 키가 필요함을 주의!

 

- 딕셔너리에서 키-값 쌍을 반복문으로 가져오기

--> 딕셔너리 자료구조를 반복문으로 돌리면 키를 가져오므로, 이를 사용하여 값을 다시 가져와야 한다.

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에 저장된다