■ JITHub 개발일지(TIL : Today I Learned) 8일차
□ TIL ::
파이썬 알고리즘(Python Algorithm), 기초 문법, 백준 실습
1. 계산기 프로그램 리뷰
- lambda 함수를 사용하여 선언없이 각 표현식을 딕셔너리로 만들 수 있다.
EXPRESSION = {
"+" : lambda x, y: x + y,
"-" : lambda x, y: x + y,
"*" : lambda x, y: x + y,
"/" : lambda x, y: x + y,
}
def calc(num1, operator, num2):
return EXPRESSION[operator](int(num1), int(num2))
- 아래 식에서 input 앞에 '*'을 사용해주면, 리스트로 반환되는 값을 요소별로 나누어 반환이 가능하다.
calc함수에 num1, operator, num2에 리스트가 아닌 각각 요소들이 들어가야 하기 때문에 아래와 같이 사용할 수 있다.
import clac
def main():
# ["3", "+", "5"]
# "3", "+", "5"
try:
result = calc.calc(*input().split(" "))
print(result)
except:
print("잘못된 수식을 입력하셨습니다.")
- eval을 사용하면 매개변수로 받은 expression (=식)을 문자열로 받아서, 실행하는 함수
def main():
print(eval(input()))
main()
- eval은 보안상으로 취약함. 의도하지 않은 명령을 실행시킬 가능성이 있음
input에 대한 검증 또는 literal_eval을 통해 검증할 필요가 있으므로 eval은 사용에 주의할 것
- enumerate()를 사용해 반복되는 요소가 몇 번째인지 확인할 수 있다
members = ["lee", "park", "kim"]
for i, member in enumerate(members):
print(f"{member}는 {i}번째 회원입니다.")
# result print
"""
lee는 0번째 회원입니다.
park는 1번째 회원입니다.
kim는 2번째 회원입니다.
"""
- enumerate()와 다른 리스트의 값을 활용하여 순서를 표현할 수도 있다.
members = ["lee", "park", "kim"]
numbers = [1, 2, 3]
for i, member in enumerate(members):
print(f"{member}는 {numbers[i]}번째 줄에 서있습니다.")
2. 반복문
- 딕셔너리를 for 문을 돌리면 key 만 나온다
products = {
"bread" : 1000,
"milk" : 1000,
"egg" : 6000,
"drink" : 1500,
}
for k in products:
print(k)
- key가 아니라 value로 돌리고 싶다면? → 딕셔너리명.values()
products = {
"bread" : 1000,
"milk" : 1000,
"egg" : 6000,
"drink" : 1500,
}
for k in products.values():
print(k)
- key와 value를 같이 사용하고 싶다면? → 딕셔너리명.items()
products = {
"bread" : 1000,
"milk" : 1000,
"egg" : 6000,
"drink" : 1500,
}
for k, v in products.items():
print(f"{k}는 {v}원입니다!")
- for문 : range (시작, 끝, 간격) 지정(콤마 뒤의 숫자는 포함되지 않는 것 주의!)
for i in range(5, 10, 2):
print(i)
- while문 : for문과 비슷하지만, 조건이 참일 경우 계속 실행되며, 반복할 횟수가 정해져있지 않을 때 사용
- Q) a가 5가되면 정지해라! a <= 5로 만들어야 함
a = 0
while a == 5: ## 애초에 a가 0이므로 while문이 true가 아니기 때문에 실행되지 않음
a += 1
break
a = 0
while a < 5: ## a = 0이기 때문에 while문이 true. 5가 되었을 때 종료
a += 1
print(a)
2. 자주 사용되는 모듈 및 패턴
- split()은 string을 리스트로 변환
# split은 string.split("구분자")로 구성되어 있습니다.
string = "hello/python/world!!"
string_list = string.split("/") # split() 안에 들어간 값을 기준으로 문자를 나눈다.
print(string_list) # ['hello', 'python', 'world!!']
- join()은 리스트를 string으로 변환
# join은 "사이에 들어갈 문자".join(리스트) 로 구성되어 있습니다.
string_list = ["hello", "python", "world"]
string = "!! ".join(string_list)
print(string) # hello!! python!! world
- replace는 문자열 내의 문자를 변환할 때 사용
string = "hello world python"
string = string.replace("h", "R")
print(string)
- random
randint는 끝숫자를 포함, randrange는 끝숫자를 포함하지 않음
# 난수 생성, 임의의 번호 생성 등 랜덤한 동작이 필요할 때 사용된다.
import random
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
random.shuffle(numbers) # numbers를 무작위하게 섞기
print(numbers) # [2, 8, 6, 4, 3, 7, 1, 5]
random_number = random.randint(1, 10) # 1 ~ 10 사이의 무작위 번호 생성
print(random_number) # 4
※ 랜덤을 사용하여 임의의 비밀번호 만들기
strings - 처음에는 들어갈 수 있는 문자
length - 패스워드 길이
randrange - 패스워드라는 string에 30개의 문자가 붙는데 0~len(strings) strings의 인덱스만큼 뽑아내는 것
STRINGS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890[]~!@#$%^&*()"
def random_password_generator(length):
password = ""
for i in range(length):
password += STRINGS[random.randrange(0, len(STRINGS))]
return password
def main():
length = 30
password = random_password_generator(length)
print(password)
main()
- 파이썬 코드 컨벤션에서는 안쓰는 문자는 언더바(_)를 사용한다
...
for _ in range(length):
password += STRINGS[random.randrange(0, len(STRINGS))]
return password
...
- pprint는 코드를 예쁘게 출력하는 효과가 있다.
# pprint는 pretty print의 약자이며, 데이터를 더 예쁘게 출력해 준다.
from pprint import pprint
sample_data = {
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
pprint(sample_data) # print로 출력했을 때와 결과 비교해 보기!!
- time/시간 다루기
# 함수의 실행 시간을 측정하는 등 시간을 다룰 때 사용되는 모듈이다.
import time
start_time = time.time() # 현재 시간 저장
time.sleep(1) # 1초간 대기
end_time = time.time()
# 코드가 종료된 시간 - 코드가 시작된 시간으로 실행 시간 구하기 (단위 : 초)
print(f"코드 실행 시간 : {end_time-start_time:.5f}") # 코드 실행 시간 : 1.00100
- datetime/날짜 다루기
from datetime import datetime, timedelta
# 현재 날짜 및 시간 출력
print(datetime.now()) # 2022-09-04 03:55:32.277095
# datetime의 format code, 더 제세한건 여기
'''
%y : 두 자리 연도 / 20, 21, 22
%Y : 네 자리 연도 / 2020, 2021, 2022
%m : 두 자리 월 / 01, 02 ... 11 ,12
%d : 두 자리 일 / 01, 02 ... 30, 31
%I : 12시간제 시간 / 01, 02 ... 12
%H : 24시간제의 시간 / 00, 01 ... 23
%M : 두 자리 분 / 00, 01 ... 58, 59
%S : 두 자리 초 / 00, 01 ... 58, 59
'''
# string을 datetime 날짜로 변경하기
string_datetime = "22/12/25 13:20"
datetime_ = datetime.strptime(string_datetime, "%y/%m/%d %H:%M")
print(datetime_) # 2022-12-25 13:20:00
# datetime 날짜를 string으로 변환하기
now = datetime.now()
string_datetime = datetime.strftime(now, "%y/%m/%d %H:%M:%S")
print(string_datetime) # 22/09/04 04:04
# 3일 전 날짜 구하기 (timedelta를 사용하면 날짜를 더하고 뺄 수 있다.)
three_days_ago = datetime.now() - timedelta(days=3)
print(three_days_ago) # 2022-09-01 04:07:48.526502
■ TIT :: Today I thought
- 문제에 대한 이해, 그리고 정리가 어려워짐
- 복잡한 머리, 그리고 자료들을 단순화, 간소화 할 시점
- 학습, 정리를 체계적으로 할 수 있도록 시스템화 할 필요
'DEV > 파이썬 이론' 카테고리의 다른 글
파이썬 코딩 :: 파이썬 클래스, 숫자 야구 만들기_TIL#10 (0) | 2022.09.13 |
---|---|
파이썬 웹 프로그래밍 :: 9월 둘째주 WIL #02 (0) | 2022.09.09 |
파이썬 코딩 :: 파이썬 숫자 야구 게임 만들기 (0) | 2022.09.07 |
파이썬 코딩 :: 파이썬 로또 번호 생성기 만들기 (0) | 2022.09.07 |
파이썬 코딩 :: 파이썬 문법, 계산기 만들기_TIL#07 (0) | 2022.09.06 |
댓글