본문 바로가기
DEV/파이썬 이론

파이썬 코딩 :: 파이썬 문법(반복문, 모듈)_TIL#08

by 올커 2022. 9. 7.

■ 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

         - 문제에 대한 이해, 그리고 정리가 어려워짐

         - 복잡한 머리, 그리고 자료들을 단순화, 간소화 할 시점

         - 학습, 정리를 체계적으로 할 수 있도록 시스템화 할 필요

 

반응형

댓글