파이썬 Study

[Python] 파이썬 모듈

유요남 2022. 2. 3. 00:16

1. 모듈

 

calculator.py 안에 내용

 

def add(x, y):

     return x + y

 

def subtract(x, y):

     return x - y

 

 

def multiply(x, y):

     return x * y

 

 

def divide(x, y):

     return x / y

 

 

import calculator 

 

# calculator 파일을 불러와서 쓰겠다. 모듈, 다른 파이썬 프로그램에서 불러와서 쓴다. 같은 폴더에 있는 py 파일(다른 폴더도 가능)

 

import calculator

 

print(calculator.add(2, 5))

pritn(calculator.multiply(3, 4))

 

import calculator as calc  # calculator 대신 calc 를 사용 가능

from calculator import add, multiply  # calculator 에서 add, multiply 함수만 불러와서 쓴다.

 

import calculator import *  # 모든 함수 불러온다. (잘 사용 안함)

 

 

# 스탠다드 라이브러리 standard library (표준 라이브러리)

 

import math

 

print9math.log10(100))

print(math.cos(0))

pritn(math.pi)

 

 

import random

 

print(random.random())  # 랜덤한 숫자 생성

 

 

import os

 

print(os.getlogin())  # 컴퓨터에 어떤 계정으로 로그인 되어 있나 확인

print(os.getcwd())  # 현재 파일의 경로 확인

 

 

[import random]

 

# randint 함수

 

두 수 사이의 어떤 랜던한 정수를 리턴하는 함수

randint(a, b) 를 하면 a <= N <= b 를 만족한느 어떤 랜던함 정수 N을 리턴

 

import random

 

print(random.randint(1, 20))

print(random.randint(1, 20))

print(random.randint(1, 20))

print(random.randint(1, 20))

print(random.randint(1, 20))

 

8

3

6

6

2

 

 

# uniform 함수

 

두수 사이의 랜덤한 소수를 리턴

randint와 다른것은 정수가 아닌 소수 리턴

 

import random

 

print(random, uniform(0, 1))

print(random, uniform(0, 1))

print(random, uniform(0, 1))

print(random, uniform(0, 1))

 

0.00023902930293

0.0239019

0.209309230923092

0.0293029384

 

 

# datetime 모듈

 

날짜와 시간

 

datetime 값 생성

 

2020년 3월 14일 파이썬으로 표현

 

pi_day = datetime.datetime(2020, 3, 14)

print(pi_day)

print(type(pi_day))

 

2020-03-14 00:00:00

<class 'datetime.datetime'>

 

시간을 직접 정할 수 있음

 

pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)

print(pi_day)

print(type(pi_day))

 

2020-03-14 13:06:15

<class 'datetime.datetime'>

 

오늘 날짜

날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아오고 싶다면?

 

today = datetime.datetime.now()

print(today)

print9type(today))

 

2020-04-05 17:49:12.360266

<class 'datetime.datetime'>

 

datetime 해부하기

datetime 값에서 '연도'나 '월'같은 값들을 추출하려면 어떻게 해야 할까요?

 

today = datetime.datetime.now()

 

print(today)

print(today.year)  # 연도

print(today.month)  # 월

print(today.day)  # 일

print(today.hour)  # 시

print(today.minute)  # 분

print(today.second)  # 초

print(today.microsecond)  # 마이크로초

 

2020-04-05 17:59:21.709817

2020

4

5

17

59

21

709817

 

 

date 포맷팅

datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.

 

today = datetime.datetime.now()

 

print(today)
print(today.strftime("%A, %B %dth %Y"))

 

2020-04-05 18:09:55.233501

Sunday, April 05th 2020

 

포맷 코드설명예시

%a 요일 (짧은 버전) Mon
%A 요일 (풀 버전) Monday
%w 요일 (숫자 버전, 0~6, 0이 일요일) 5
%d 일 (01~31) 23
%b 월 (짧은 버전) Nov
%B 월 (풀 버전) November
%m 월 (숫자 버전, 01~12) 10
%y 연도 (짧은 버전) 16
%Y 연도 (풀 버전) 2016
%H 시간 (00~23) 14
%I 시간 (00~12) 10
%p AM/PM AM
%M 분 (00~59) 34
%S 초 (00~59) 12
%f 마이크로초 (000000~999999) 413215
%Z 표준시간대 PST
%j 1년 중 며칠째인지 (001~366) 162
%U 1년 중 몇 주째인지 (00~53, 일요일이 한 주의 시작이라고 가정) 35
%W 1년 중 몇 주째인지 (00~53, 월요일이 한 주의 시작이라고 가정) 35

 

 

 

# input  사용자 입력 받기

 

name = input("이름을 입력하세요: ")

print(name)

 

이름을 입력하세요: Codeit

Codeit

 

x = input("숫자를 입력하세요: ")

print(x + 5)

 

input 함수가 받는 답변은 문자값으로 정수형으로 변환 필요

 

x = int(input("숫자를 입력하세요: ")

print(x + 5)

 

 

ex) 숫자 맞히기

 

import random

# 상수 정의
ANSWER = random.randint(1, 20)
NUM_TRIES = 4

# 변수 정의
guess = -1
tries = 0

while guess != ANSWER and tries < NUM_TRIES:
    guess = int(input("기회가 {}번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: ".format(NUM_TRIES - tries)))
    tries += 1    
    
    if ANSWER > guess:
        print("Up")
    elif ANSWER < guess:
        print("Down")

if guess == ANSWER:
    print("축하합니다. {}번 만에 숫자를 맞히셨습니다.".format(tries))
else:
    print("아쉽습니다. 정답은 {}입니다.".format(ANSWER))
    

 

 

# 파일 읽고 쓰기

 

1. 파일읽기

  

with open('data/chicken.txt', 'r') as f:  # r은 read의 약자, w은 write의 약자, data는 디렉토리 경로

   print(type(f))

<class '_io.TextIOWrapper'>

 

   for line in f:

       print(line)

 

print("Hello\n")  # 백슬러시 n 이 들어가면 엔터가 들어가 빈줄이 생김

 

# strip 앞뒤로 있는 화이스 스페이스(스페이트, 엔터 등 공백)을 제거

 

print("          abc     def        ".strip())

abc    def   # 중간만 남음

 

prit("        \t   \n    abc    def\n\n\n".strip())

abc   def

 

with open('data/chcken.txt', 'r') as f:

   for line in f:

      print(line.strip())    # 줄공백 제거

 

 

# split

 

my_string = "1. 2. 3. 4. 5. 6"

print(my_string.split("."))  # 파라미터를 기준으로 문자열을 나눔

 

['1', ' 2', ' 3', ' 4', ' 5', ' 6']  # 문자열 사이에 띄어쓰기 발생

 

문자열 나누는 기준을 ". "  # . 띄어쓰기로 변경

print(my_string.split(". "))

 

full_name = "Kim, Yuna"

print(full_name.split(", "))

['KIm', 'Yuna']

 

full_name = "Kim, Yuna"

print(full_name.split(", "))

last_name = name_data[0]

first_name = name_data[1]

 

print(first_name, last_name_

Yuna Kim

 

 

print("      \n\n    2    \t    3   \n   5   7  11  \n\n".split())   #화이트 스페이스 기준으로 나눌때 split() 으로

['2', '3', '5', '7', '11']

 

print(numbers[0] + numbers[1])

23  # 문자열 합

 

print(int(numbers[0] + numbers[1]))

5 # 정수 변환

 

 

ex) 한달 평균 매출액 

 

with open('data/chicken.txt', 'r') as f:
    total_revenue = 0
    total_days = 0
    
    for line in f:
        data = line.strip().split(": ")
        revenue = int(data[1])
        
        total_revenue += revenue
        total_days += 1
        
    print(total_revenue / total_days)
        

 

 

# 파일 쓰기

 

with open('new_file.txt', 'w') as f:   # 새로운 파일 생성

   f.write("Hello world!\n")  # 내용 기재, \n 은 줄 바꿈

   f.write("My name is Codeit.\n")

기존의 파일에 추가하고 싶을 때

with open('new_file.txt', 'a') as f:   # append 'a' 사용, 파일이 없어도 w 대신 a를 사용하여 파일 생성 가능

 

 

ex) 영어 단어 입력

 

with open('vocabulary.txt', 'w') as f:
    while True:
        english_word = input('영어 단어를 입력하세요: ')
        if english_word == 'q' :
            break
        
        korean_word = input('한국어 뜻을 입력하세요: ')
        if korean_word == 'q':
            break
        
        f.write('{}: {}\n'. format(english_word, korean_word))

 

 

ex) 단어 퀴즈

 

with open('vocabulary.txt', 'r') as f:
    for line in f:
        date = line.strip().split(": ")
        english_word, korean_word = data[0], data[1]
        
        guess = input("{}: ".format(korean_word))
        
        if guess == english_word:
            print("맞앗습니다!\n")
        else:
            print("아쉽습니다. 정답은 {}입니다.\n".format(english_word))

 

 

ex) 고급 단어장(랜덤)

 

import random

# 사전만들기
vocab = {}
with open('vocabulary.txt', 'r') as f:
    for line in f:
        date = line.strip().split(": ")
        english_word, korean_word = data[0], data[1]
        vocab[english_word] = korean_word
        
# 목록 가져오기
keys = list(vocab.keys())

# 문제 내기
while True:
    # 랜덤한 문제 받아오기
    index = random.randint(0, len(keys) -1)
    english_word = keys[index]
    korean_word = vocab[english_word]
    
    # 유저 입력값 받기
    guess = input("{}: ".format(korean_word))
    
    # 프로그램 끝내기
    if guess == 'q':
        break
    
    # 정답 확인하기
    if guess == english_word:
        print("정답입니다!\n")
    else:
        print("아쉽습니다. 정답은 {}입니다.\n").format(english_word)

 

 

 

ex) 로또

 

import random

def generate_numbers(n):  #무작위 번호 추출 함수
    my_numbers_list = []  #내 번호 리스트 생성
    my_numbers = random.randint(1, 45)
    for i in range(n):  #n번 반복(리스트에 n개의 숫자가 들어가도록 함)
        while my_numbers in my_numbers_list:
            my_numbers = random.randint(1, 45)
        my_numbers_list.append(my_numbers)
    return my_numbers_list  #for에 줄을 맞춰주어야 그만큼 반복 가능


def draw_winning_numbers():
    winning_numbers = generate_numbers(6)  #generate_numbers 함수 호출
    bonus_number = random.randint(1, 45)
    while bonus_number in winning_numbers:
        bonus_number = random.randint(1, 45)
    winning_numbers.append(bonus_number)
    return winning_numbers


def count_matching_numbers(list_1, list_2):  #파라미터로 리스트 2개를 받음
    duplicated_list = []  #중복되는 리스트 생성
    for i in list_1:
        if i in list_2:
            duplicated_list.append(i)  #중복되는 요소만 리스트에 추가
    return len(duplicated_list)


def check(my_numbers_list, winning_numbers_list):  #파라미터로 리스트 2개를 받음
    general_number = winning_numbers_list[0:6]
    check_numbers = count_matching_numbers(my_numbers_list, general_number)  #check_numbers는 중복되는 숫자의 개수
    bonus_number = winning_numbers_list[6]  #당첨번호의 7번째 번호는 보너스 번호

    if check_numbers == 6:
        return 1000000000
    elif check_numbers == 5 and bonus_number in my_numbers_list:
        return 50000000
    elif check_numbers == 5:
        return 1000000
    elif check_numbers == 4:
        return 50000
    elif check_numbers == 3:
        return 5000
    else:
        return 0

 

 

import random


#  무작위 번호 추출 함수
def generate_numbers(n):
    # 내 번호 리스트 생성 => 내 번호라는 것은 semantic 한 이름에 조금 어긋납니다.
    # 함수 이름이 숫자들 생성의 역할만 하는 것이기 때문입니다.
    # 따라서 함수 이름도 numbers 가 더욱 적절해보이는군요!
    numbers = []

    # 아래 과정에서 my_numbers 라고 변수 이름을 명명하셨는데
    # 무작위 숫자가 하나만 들어가므로 my_number 가 더 적절한 표현이겠죠? ㅎㅎ
    # my_numbers = random.randint(1, 45)

    # 어짜피 매번 while 문안에서 random number 를 생성해야하므로 다음과 같이 바꾸어 주는 게 좋겠습니다.
    # 이중으로 반복문이 들어가는 것이 시간복잡도 면에서는 좋지 못하니까요! ㅎㅎ

    i = 0
    while i < n:
        number = random.randint(1, 45)
        # n번 반복(리스트에 n개의 숫자가 들어가도록 함)
        if number not in numbers:
            numbers.append(number)
            i += 1

    return numbers  # for에 줄을 맞춰주어야 그만큼 반복 가능 => 의미전달이 조금 어려운 코멘트입니다.


def draw_winning_numbers():
    # generate_numbers 함수 호출
    # winning_numbers = generate_numbers(6)

    # bonus_number = random.randint(1, 45)
    # while bonus_number in winning_numbers:
    #     bonus_number = random.randint(1, 45)
    # winning_numbers.append(bonus_number)

    # 가독성이 비교적 모범답안 보다 좋지 못한 코드입니다.
    # 되도록 이면 아래처럼 해주세요 ㅎㅎ
    # 참! 위 코드에서는 앞의 6 개 숫자를 정렬하지 않으셨더라구요. 문제 요구 사항도 반영하는 것이 좋습니다.

    winning_numbers = generate_numbers(7)

    return sorted(winning_numbers[:6]) + winning_numbers[6:]


def count_matching_numbers(list_1, list_2):  #파라미터로 리스트 2개를 받음
    # 간결한 코드들은 다른 분들이 많이 써주신 거 같아요.
    # 리스트 연산보다 숫자연산이 더 빠르기 때문에 조금 고쳐주었습니다.
    # 매칭되는 갯수만 세주는 게 목적이므로 숫자만 있는 것이 좀 더 나을 거라 생각합니다.

    # duplicated_list = []  #중복되는 리스트 생성
    duplicated_numbers = 0
    for i in list_1:
        if i in list_2:
            duplicated_numbers += 1
            # duplicated_list.append(i)  #중복되는 요소만 리스트에 추가
    return duplicated_numbers


def check(my_numbers_list, winning_numbers_list):  #파라미터로 리스트 2개를 받음
    # 0은 생략해도 됩니다!
    general_number = winning_numbers_list[:6]
    check_numbers = count_matching_numbers(my_numbers_list, general_number)  #check_numbers는 중복되는 숫자의 개수
    bonus_number = winning_numbers_list[6]  #당첨번호의 7번째 번호는 보너스 번호

    # 커다란 문제가 있지 않지만, boolean 값 체크가 check_numbers 가 5고 보너스 넘버가 안 맞을 경우 4번 이루어 지네요.
    # 아래 같이 하면 좀 더 낫지 않을까 생각합니다.
    if check_numbers == 6:
        return 1000000000
    elif check_numbers == 5:
        if bonus_number in my_numbers_list:
            return 50000000
        else:
            return 1000000
    elif check_numbers == 4:
        return 50000
    elif check_numbers == 3:
        return 5000
    else:
        return 0

 

 

ex) 로또

 

i) 무작위 번호 생성

 

from random import randint


def generate_numbers(n):
    numbers = []
    
    while len(numbers) < n:
        num = randint(1, 45)
        if num not in numbers:
            numbers.append(num)
            
    return numbers
    
print(generate_numbers(6))

 

ii) 최종

 

from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        new_number = randint(1, 45)
        if new_number not in numbers:
            numbers.append(new_number)

    return numbers


def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]


def count_matching_numbers(numbers, winning_numbers):
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count += 1

    return count


def check(numbers, winning_numbers):
    count = count_matching_numbers(numbers, winning_numbers[:6])
    bonus_count = count_matching_numbers(numbers, winning_numbers[6:])

    if count == 6:
        return 10000000
    elif count == 5 and bonus_count == 1:
        return 50000000
    elif count == 5:
        return 1000000
    elif count == 4:
        return 50000
    elif count == 3:
        return 5000
    else:
        return 0

 

 

ex) 야구게임

 

i) generate_numbers 무작위로 정답 번호 3개를 뽑는 함수

 

from random import randint

def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        num = randint(0, 9)
        if num not in numbers:
            numbers.append(num)

    print("0과 9사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

print(generate_numbers(3))

 

 

ii) take_guess 유저에게 번호 3개를 입력받는 함수

 

from random import randint


def generate_numbers():
    numbers = []

    while len(numbers) < 3:
        num = randint(0, 9)
        if num not in numbers:
            numbers.append(num)

    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers


def take_guess():
    print("숫자 3개를 하나씩 차례대로 입력하세요.")

    new_guess = []
    while len(new_guess) < 3:
        new_num = int(input("{}번째 숫자를 입력하세요: ".format(len(new_guess) + 1)))

        if new_num < 0 or new_num > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        elif new_num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(new_num)

    return new_guess

 

 

iii) get_score 유저 번호 3개와 정답 번호 3개를 비교해서, 스트라이크와 볼 수를 계산하는 함수

 

def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0

    for i in range(3):
        if guesses[i] == solution[i]:
            strike_count += 1
        elif guesses[i] in solution:
            ball_count += 1

    return strike_count, ball_count
    return strike_count, ball_count


# 테스트
s_1, b_1 = get_score([2, 7, 4], [2, 4, 7])
print(s_1, b_1)

s_2, b_2 = get_score([7, 2, 4], [2, 4, 7])
print(s_2, b_2)

s_3, b_3 = get_score([0, 4, 7], [2, 4, 7])
print(s_3, b_3)

s_4, b_4 = get_score([2, 4, 7], [2, 4, 7])
print(s_4, b_4)

 

 

'파이썬 Study' 카테고리의 다른 글

4. 토픽  (0) 2022.01.21
3. 제어문  (0) 2022.01.17
2. 추상화  (0) 2022.01.16
1. 자료형  (0) 2022.01.05