8일차

송용진·2024년 2월 28일

%% [markdown]

파이썬 표준 라이브러리

random

%%

import random

random.random() # 0에서 1 사이의 실수

%%

random.randint(-100,100) # a에서 b 사이의 랜덤한 정수

%%

items = ['a','b','c','d']
random.choice(items)

%%

random.sample(items, 2)

%%

[random.choice(items) for _ in range(10)] #복원추출

%%

for _ in range(10):
print(random.choice(items)) #복원추출

%%

print(items)
random.shuffle(items)
print(items)

%%

#진짜 랜덤이 없다?

컴퓨터는 랜덤이라는 개념이 없다

random.seed(123) #시드를 고정
random.random() #랜덤 값이 고정

%% [markdown]

연습 문제

%%

'''

  • 사용자가 입력한 숫자 범위(예: 1에서 100) 내에서
    랜덤한 숫자를 생성하고,
    사용자가 이 숫자를 맞추는 간단한 숫자 맞추기 게임을 만들어보세요.
    '''
    #사용자가 숫자를 입력하게 해야겠다.
    num = int(input("숫자를 입력하세요 : (1~100까지)"))
    #숫자 범위를 제한하는 기능이 필요(생략)
    #이 범위 안에서 랜덤한 숫자를 뽑아야겠네
    ans_num = random.randint(1,num)
    for i in range(5):
    # print(ans_num)
    #사용자가 숫자를 맞추기 위해 입력해야 겠네
    user_num = int(input("숫자를 입력하세요. 1에서 {} 사이의".format(num)))
    # print(ans_num,user_num)
    #비교하는 과정
    #같을 때
    if ans_num == user_num:
        print("정답")
        break
    #입력한 숫자가 정답보다 클 때
    elif ans_num < user_num:
        print("더 낮은 숫자입니다")
        print(f"{5-(i+1)}의 기회가 남아있습니다.")
    #입력한 숫자가 정답보다 작을 때
    else:
        print("더 높은 숫자입니다")
        print(f"{5-(i+1)}의 기회가 남아있습니다.")
    #업다운 힌트를 주면 어때?

%% [markdown]

#이전에 사용자가 입력했던 숫자도 알려주면 더 도움이 될까?

#맞추는 횟수 제한 5번 내로

#맞추면 맞췄다 틀렸다를 알려줘야지

#맞추면 끝내자

%% [markdown]

생각을 구체한 후 개발을 시작하는 습관

메타인지(내가 아는 것과 모른는 것을 구분)

->적절한 질문 가능

%% [markdown]

'''- 주어진 단어 리스트에서 랜덤하게 단어를 선택하고, 선택된 단어의 글자를 섞어서 퀴즈를 만드는 게임을 구현해보세요. 사용자는 섞인 글자를 보고 원래의 단어를 맞춰야 합니다.'''

%%

'''- 임의의 수의 사람들로 구성된 그룹이 있다고 가정할 때, 이 사람들을 무작위로 여러 팀으로 나누는 프로그램을 작성해보세요. 사용자는 전체 인원 수와 팀당 인원 수를 입력할 수 있어야 하며, 프로그램은 이를 바탕으로 랜덤하게 팀을 구성해야 합니다.'''

%% [markdown]

time

카페가 영업시간 내에만 가동되게

%% [markdown]

%%

#현재 시간 얻기
import time
current_time = time.time()
current_time

%% [markdown]

컴퓨터에서 인식하는 시간?

%%

#날짜와 시간 형식화
local_time = time.localtime(current_time)
local_time

%%

time.strftime('%Y-%m-%d %H:%M:%S')

%%

%%time #노트북 환경에서 시간을 측정
#프로그램 일시 중지
for i in range(10):
print('{}번째 메시지'.format(i+1))
time.sleep(1) #1초에 간격을 가지고 실행

%%

start_time = time.time()
time.sleep(2)
end_time = time.time()
print("프로그램 실행 시간 : {}초".format(end_time-start_time))

%% [markdown]

사용자가 "시작"과 "종료"를 입력할 때까지의

시간을 측정하는 타이머 프로그램을 작성해보세요.

사용자가 "시작"을 입력하면 타이머가 시작되고,

"종료"를 입력하면 타이머가 멈추며 경과 시간을 출력합니다.

%%

#타이머 프로그램(스탑워치)
#시작 입력 -> 현재 시간을 기록
#종료 입력 -> 종료 시간을 기록
#시작과 종료 시간의 차이를 출력
msg = input("시작을 입력하세요 : ")
if msg == "시작":
start_time = time.time()
msg = input("종료를 입력하세요 : ")
if msg == "종료":
end_time = time.time()
print("경과 시간은 {}초".format(end_time-start_time))

%% [markdown]

datetime

현재 시각 얻기

%%

from datetime import datetime

현재 시간 가져오기

now = datetime.now()
now

%%

특정 날짜와 시간 생성

start_day = datetime(2024,2,19,9)
start_day

%%

#날짜와 시간 포맷 변경
now = datetime.now()
now

%%

formatted = now.strftime("%Y-%m-%d %H:%M:%S")
formatted

%%

type(formatted)

%%

#문자열로부터 날짜와 시간 파싱
date_str = '2024-02-28 10:37:57'
dt = datetime.strptime(date_str,"%Y-%m-%d %H:%M:%S")
dt

%%

#날짜와 시간 차이 계산
from datetime import datetime , timedelta

start_day #우리 처음 만난 날
today = datetime.now()
delta = today - start_day
delta.days

%%

#날짜와 시간의 산술 연산
one_week_later = now + timedelta(weeks=1)
one_week_later

%%

now

%%

import pytz

time_zone = pytz.timezone("Asia/Seoul")
seoul_time = datetime.now(time_zone)
seoul_time

%% [markdown]

# 사용자에게 생일을 입력 -> 어떻게 받을까?

# 다음 생일은 어떻게 지정할까?

# 남은 날짜는 어떻게 계산할까?

%%

birthday = input("생일을 입력하세요! : (연-월-일)")
birthday = datetime.strptime(birthday, "%Y-%m-%d")
now_year = datetime.now().year
next_birthday = datetime(datetime.now().year+1, birthday.month, birthday.day)
now = datetime.now()
delta = (next_birthday - now).days
print(f"내년 생일은 {delta}일 남았네요")

%%

delta

%%

now = datetime.now()

%%

next_birthday

%%

next_birthday - now

%% [markdown]

OS

%%

import os
current_directory = os.getcwd()
current_directory

%%

!cd ..

%%

os.mkdir("new_dir")

%%

!ls

%%

os.makedirs("shopping/computer")

%%

os.rmdir("new_dir")

%%

os.rmdir("shopping") #지워지지 않음

%%

import shutil
shutil.rmtree("shopping") #조심해서 쓸 것

%%

os.chdir("../")

%%

os.getcwd()

%%

os.chdir("day7")

%%

os.getcwd()

%%

os.chdir("../")
os.getcwd()

%%

os.chdir("day8")
os.getcwd()

%%

os.getcwd()

%%

entries = os.listdir("day8") #?
for entry in entries:
print("{}를 처리".format(entry))

%%

home_directory = os.getenv('PATH')
home_directory

%% [markdown]

사용자의 홈 디렉터리에

my_project라는 이름의 새 디렉터리를 생성하고,

그 안에 README.md 파일을 생성하는 스크립트를 작성하세요.

-어떤 과정을 거쳐서 개발할 것인가

-내가 지금 모르는 방법은 어떻게 해결할 것인가

%%

HOME_DIRECTORY = "/workspace"
#홈 디렉토리로 이동
os.chdir(HOME_DIRECTORY)

%%

%%

%% [markdown]

특정 이벤트가 시작된 시각을 입력받고,

현재까지 경과한 시간(년, 월, 일, 시, 분, 초 단위)을 계산하여 출력하는 프로그램을 작성하세요.

-어떤 이벤트가 있을 수 있는가(구체화해서 고민하기)

-그 이벤트가 시작된 시간을 어떻게 입력 받을까

-경과한 시간을 어떻게 계산할까

%%

%% [markdown]

glob

파이썬의 glob 모듈은

파일 시스템 내의 파일을 패턴 매칭을 통해 찾는 데 사용됨

%% [markdown]

samle_data

subdir

test.csv

california_housing_train.csv

mnist_test.csv

mnist_train_samll.csv

%%

import glob #os.listdir과 비교해서 살펴보자

PATH = "sample_data"
glob.glob(os.path.join(PATH,"*.csv"))

%%

#비교
os.listdir(PATH)

%%

glob.glob(os.path.join(PATH,"*/.csv"),recursive=True)

%%

csv_files = glob.glob(os.path.join(PATH,"*/.csv"))
csv_files

%%

sorted(csv_files)

%% [markdown]

사용자가 지정한 디렉토리 내에서 특정 확장자를 가진 파일들의 목록을 출력하는 프로그램을 작성해보세요. 사용자로부터 디렉토리 경로와 확장자를 입력받아 해당 조건에 맞는 파일 목록을 출력합니다.

%%

#사용자가 디렉토리 지정
#확장자 지정
#해당 디렉토리의 해당 확장자 파일 목록을 출력
dir_path = input = ("검색할 디렉토리를 적으세요 : ")
exp_file = input = ("검색할 확장자를 적으세요 : ")
file_list = glob.glob(os.path.join(dir_path,"*.{}".format(exp_file)))
for file_name in file_list:
print(file_name)

%% [markdown]

sys 모듈

%% [markdown]

프로그램 종료하기

%%

import sys
sys.exit("프로그램 종료")

프로그램을 즉시 종료하고자 할 때 사용

%%

import sys
sys.version

%%

sys.executable #파이썬 인터프리터의 경로

%% [markdown]

리눅스에서 bin은 실행 파일들을 모아놓은 것

%%

sys.path

%%

type(sys.path)

%%

sys.path.append("")

%%

import random

%%

sys.getdefaultencoding()

%% [markdown]

json

javascript object notation

%%

import json #파이썬의 딕셔너리 형식

data = {"name":"John","age":30,"city":"Seoul"}

%%

data

%%

json.dumps(data) #dumps : 데이터를 인코딩

%%

type(json.dumps(data)) #dumps : 문자열 형식으로 바꿔줌

%%

json_string = json.dumps(data)
json_string

%% [markdown]

dumps의 짝은 loads

%%

data = json.loads(json_string)
data

%%

type(data)

%% [markdown]

json_string은 문자열 이었는데 딕셔너리로 바뀜

%%

with open("data_file.json",'w') as f:
json.dump(data,f) #dumps 아님 주의

%%

with open("data_file.json",'r') as f:
data_get = json.load(f) #loads 아님 주의

%%

data_get

%%

print(json.dumps(data,indent=4))

%% [markdown]

requests 모듈

http 요청을 쉽게 보낼 수 있게 해주는 라이브러리

%%

import requests
response = requests.get("http://www.naver.com")

%%

response.text

%%

data = {"title":"python","major":"backend"}
data

%%

response = requests.get("https://httpbin.org/get",params = data) #API 테스트하는 사이트
response

%%

response.url

%%

response = requests.post("https://httpbin.org/post",data = data)

%%

print(response.text)

%%

response_result = response.json()

%%

type(response_result)

%%

response_result

%%

headers = {"User-Agent":"My User Agent 1.0"}
response = requests.get('https://httpbin.org/get', headers=headers)
response.request.headers

%%

try:
response = requests.get('https://httpbin.org/get', timeout = 0.00001)
except requests.exceptions.Timeout:
print("시간이 지연되니 다음 단계로")

%%

with requests.Session() as session:
session.get('https://httpbin.org/cookies/set/sessioncookie/0000000')
response = session.get('https://httpbin.org/cookies')
print(response.text)

%% [markdown]

로또 api를 이용하여

이전에는 당첨된 적 없는 번호를 추천하는 서비스 만들기

%%

#이전에 당첨된 번호를 받아오기

로또 번호 생성기

이전에 같은 번호 있으면 다시 동작해서 없는 번호 나올때까지 반복

def get_lotto_nums(drwno):
url = f'https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo={drwno}'
response = requests.get(url)
output = response.json()
result = []
result = [output[f'drwtNo{i+1}'] for i in range (6)]

    # result.append(output['bnusNo'])
    return tuple(result)

    

%%

output = get_lotto_nums(1107)

%%

output

%%

pip install tqdm

from tqdm.auto import tqdm
#당첨 번호 모음
numbers = []

for drwno in range(1,1108+1):

for drwno in tqdm(range(1,1108+1)):
result = get_lotto_nums(drwno)
numbers.append(result)

%%

len(numbers)

%%

nums = [i for i in range(1,46)]

%%

#랜덤 번호 생성기
def generate_nums():
return sorted(random.sample(nums,6))

%% [markdown]

여기를 세련되게 만드는 방법을 고민해봅시다

%%

def 태성님(numbers):
while True:
lotto_nums = generate_nums()

    # 이전에 당첨되었던 번호인지 효과적으로 확인하는 방법?
    if lotto_nums in set(numbers):
        continue
    else:
        break
return lotto_nums

%%

%%time
lotto_nums = 태성님(numbers)

%%

def 찬미님(numbers):
while True:
lotto_nums = generate_nums()
check_dict = {i:[] for i in range(1,46)}
for number in numbers:
check_dict([number[0]].append(number))
#체크하기
if lotto_nums in check_dict[lotto_nums[0]]:
continue
else:
break
return lotto_nums

%%

%%time
lotto_nums = 찬미님(numbers)

%% [markdown]

math

%%

import math

num = 3.14
print(math.ceil(num)) #올림
print(math.floor(num)) #내림
print(math.trunc(num)) #버림
print(round(num,2)) #반올림
print(round(num,1)) #반올림

%%

print(math.exp(1))
print(math.log(2.71828))
print(math.log10(100))
print(math.pow(2,3))

%%

math.pi

%%

math.sin(math.pi/2) #sin90

%%

math.cos(0)

%%

math.e

%%

math.factorial(5)

%%

math.gcd(36,60)

%%

math.sqrt(16)

%% [markdown]

collections

다양한 컨테이너 데이터 타입을 제공

데이터 구조를 효율적으로 사용할 수 있게

%%

#counter
from collections import Counter
count = Counter(numbers)

%%

count

%%

colors = ["blue","blue",'red','red','yellow']

%%

count = Counter(colors)
count

%%

type(count)

%%

text = "Python의 collections 모듈은 다양한 컨테이너 데이터 타입을 제공합니다. 이 모듈은 일반적인 데이터 구조를 효율적으로 사용할 수 있게 해주며, 다양한 애플리케이션에서 데이터 처리를 최적화할 수 있도록 돕습니다. 다음은 collections 모듈의 주요 컨테이너 타입에 대한 활용 사례와 예제 코드입니다."
word_list = text.split(" ")
count = Counter(word_list)
count

%%

from collections import defaultdict
d = defaultdict(int)
d['a']+=1
d['a'] #기본 값이 있기 때문에 오류X

%%

test_dict = {}
test_dict['a']+=1 # 값이 비어있기 때문에 오류

%%

d = defaultdict(list)
d[1].append((1,2,3,4,5,6))

%%

d

%%

d = defaultdict(lambda:100)
d['key1'] += 1
d['key1']

%%

from collections import OrderedDict

d = OrderedDict()
d['banana'] = 3
d['apple'] = 5
d['melon'] = 1
d

%% [markdown]

표준 파이썬 라이브러리를 어디에 활용할 수 있을까?

profile
개발자

0개의 댓글