1. 새롭게 알게된 것
오늘은 내가 약했던 부분인 딕셔너리, 함수, 클래스에 대해 공부했다.
역시나 새롭게 다가오는 부분이 많아서 정리가 필요하다.
▶ 딕셔너리, 함수, 전역변수vs지역변수, 람다표현식, map함수, 클래스, 파이썬 내장모듈
1.1 딕셔너리
- 딕셔너리의 value에는 모든 자료형을 혼합하여 사용할 수 있다.
- 딕셔너리의 key에는 숫자, 문자열, 부울형, 튜플을 사용할 수 있다.
- 중복된 key를 사용하여 딕셔너리를 만들면, 중복된 항목 중 하나만 출력된다.
1.1.1 딕셔너리 만들기
총 4가지의 방법이 있으며, 내가 편한 방식대로 사용하면 될 듯하다.
## 1. 딕셔너리명 = dict(키1=값1, ...)
# 키에 따옴표를 쓰지 않음!
menu1 = dict(김밥 = 2000, 떡볶이 = 2500, 어묵 = 2000, 튀김 = 3000)
## 2. 딕셔너리명 = dict(zip(key리스트, value리스트))
# 키와 값의 데이터가 각각 리스트로 되어 있을 경우 사용하면 좋을 사용법
key_list = ['김밥','떡볶이','어묵','튀김']
value_list = [2000,2500,2000,3000]
menu2 = dict(zip(key_list, value_list))
## 3. 딕셔너리명 = dict([(키1,값1),(키1,값2),...,])
menu3 = dict([('김밥',2000),('떡볶이',2500),('어묵',2000),('튀김',3000)])
## 4. 딕셔너리명 = dict({키1:값1,키2:값2,...,})
menu4 = dict({'김밥': 2000, '떡볶이': 2500, '어묵': 2000, '튀김': 3000})
[out] {'김밥': 2000, '떡볶이': 2500, '어묵': 2000, '튀김': 3000}
1.1.2 딕셔너리 값 추출하기
✅ 딕셔너리명[key]
person = {'name': 'james', '나이': 30, '키': 175.5, '시력': (1.0, 1.0), '취미': ['운동', '독서']}
person['나이']
[out] 30
✅ 딕셔너리명.get(key, msg)
존재하지 않는 key로 추출 시도해도 오류가 발생하지 않는다.
존재하지 않는 key로 추출 시도할 경우 출력할 메시지를 설정할 수 있다.
person.get('몸무게', '존재하지 않음')
[out] '존재하지 않음'
1.1.3 setdefault로 항목 추가하기
- 딕셔너리명.setdefault(키,값)
- 이미 들어있는 키의 값은 수정할 수 없다.
scores = {'kor':100, 'eng':90, 'math':80}
# 1. key만 삽입 → value에 빈 값
scores.setdefault('music')
[out] {'kor': 100, 'eng': 90, 'math': 80, 'music': None}
# 2. key, value 같이 삽입
scores.setdefault('science', 90)
[out] {'kor': 100, 'eng': 90, 'math': 80, 'science':90}
# 3. 기존에 있는 key의 value값 수정
scores.setdefault('math', 85)
[out] {'kor':100, 'eng':90, 'math':85}
1.1.4 update로 여러 항목 추가/수정하기
- 딕셔너리명.update(키1=값1, 키1=값2,...)
- key가 존재하면 수정, 존재하지 않으면 추가된다.
- 키에 따옴표를 하지 않지만, 딕셔너리에 들어갈 때는 따옴표가 붙어서 들어간다.
scores = {'kor':100, 'eng':90, 'math':80}
# 1. 딕셔너리명.update(키1=값1, 키1=값2,...)
scores.update(math = 90, music = 90)
# 2. 딕셔너리명.update(zip(key리스트, value리스트)
scores.update(zip(['math', 'music'], [90, 90]))
# 3. 딕셔너리명.update([(키1,값1),(키2,값2),...])
scores.update([('math', 90), ('music', 90)])
# 4. 딕셔너리명.update({키1:값1,키2:값2,...,})
scores.update({'math': 90, 'music': 90})
[out] {'kor': 100, 'eng': 90, 'math': 90, 'music': 90}
1.1.5 딕셔너리에서 항목 삭제하기
scores = {'kor':100, 'eng':90, 'math':80}
## 1. del 딕셔너리명[키]
# 해당 키의 항목 삭제
del scores['kor']
[out] {'eng': 90, 'math': 80}
## 2. 딕셔너리명.pop(키, 기본값)
# 해당 키의 항목(값) 반환하고 삭제
kor = scores.pop('kor')
print(kor)
print(scores)
[out] 100
{'eng': 90, 'math': 80}
## 3. 딕셔너리명.clear()
# 딕셔너리의 모든 항목을 삭제
scores.clear()
print(scores)
[out] {}
1.1.6 딕셔너리의 키, 값 모두 리스트 형태로 가져오기
✅ 딕셔너리명.keys()
- 딕셔너리의 key만 리스트로 가져오기
- dict_keys객체로 받아온다. 리스트처럼 사용할 수 있지만 리스트는 아니다.
scores = {'kor':100, 'eng':90, 'math':80}
scores.keys()
[out] dict_keys(['kor', 'eng', 'math'])
✅ 딕셔너리명.values()
- 딕셔너리의 value만 리스트로 가져오기
- dict_values객체로 받아온다.
scores = {'kor':100, 'eng':90, 'math':80}
scores.values()
[out] dict_values([100, 90, 80])
✅ 딕셔너리명.items()
- 딕셔너리의 (key,value) 쌍을 리스트로 가져오기
- dict_items객체로 받아온다
scores = {'kor':100, 'eng':90, 'math':80}
scores.items()
[out] dict_items([('kor', 100), ('eng', 90), ('math', 80)])
1.1.7 딕셔너리 정렬하기
❗ .sort()는 지원하지 않는다. (sorted()만 가능)
scores = {'kor':100, 'eng':90, 'math':80}
# key 정렬
sorted(scores.keys())
[out] ['eng', 'kor', 'math']
# value 정렬
sorted(scores.values())
[out] [80, 90, 100]
# (key, value) 정렬 → key를 기준으로 정렬
sorted(scores.items())
[out] [('eng', 90), ('kor', 100), ('math', 80)]
1.2 함수
def is_odd_even(n):
if n == 0:
result = 0
elif n % 2 == 0:
result = '짝수'
else:
result = '홀수'
return result
→ result라는 변수를 활용해서 return을 할 수 있음
def is_odd_even(n):
if n == 0:
return 0
if n % 2 == 0:
return '짝수'
return '홀수'
→ 변수를 사용하지 않고 바로 각 조건 별로 return을 할 수 있음
(return '홀수' → 조건문이 없지만 위의 조건을 만족하지 않을 경우 홀수 출력(else와 유사))
✅ 매개변수 여러 개 전달하기
def introduce(name, age):
print('안녕하세요!')
print('저의 이름은, '+name+'입니다.')
print('나이는, '+str(age)+'살입니다.')
introduce('홍길동', 20)
[out]
안녕하세요!
저의 이름은, 홍길동입니다.
나이는, 20살입니다.
1.3 전역변수 vs 지역변수
1.3.1 전역변수
함수 밖에서 생성된 변수로 함수 내에서도 사용이 가능함
say1 = 'hello' # 전역변수
def sayhello():
print(say1)
sayhello()
1.3.2 지역변수
함수 내에서 생성된 변수로 함수 내에서만 사용이 가능함
def saygoodbye():
say2 = 'goodbye'
print(say2)
saygoodbye()
1.3.3 함수 안에서 전역변수 값 변경하기 → global 키워드 활용
2개의 변수명(n1)이 동일할지라도 변수 자체는 다르며, 지역변수를 활용하여 함수가 계산된다.
여기서 global 키워드를 사용하게 된다면 함수 밖의 전역변수가 함수 안의 지역변수로 변경된다.
# 전역변수
n1 = 1
n2 = 10
def get_plus_minus():
global n1 # global 키워드를 사용해야 함
n1 = 2 # 지역변수
plus = n1+n2
minus = n1-n2
return plus, minus
get_plus_minus()
n1
[out] 2
1.4 람다표현식, map 함수
1.4.1 람다표현식 (익명함수)
lambda 매개변수1, 매개변수2, ... : 수식
lambda_plus = lambda n1, n2 : n1 + n2
lambda_plus(1, 2)
[out] 3
1.4.2 map함수
리스트나 튜플의 각 요소를 지정된 함수로 처리해주는 함수
원본 리스트를 변경하지 않고 새 리스트를 생성함
→ list(map(함수, 리스트))
→ tuple(map(함수, 튜플))
# map 함수를 이용하여 리스트 a의 각 요소를 정수화하여 새로운 리스트로 만들기
a = ['1', '2', '3', '4']
b = list(map(int, a))
print(a)
print(b)
[out]
['1', '2', '3', '4']
[1, 2, 3, 4]
1.4.3 map함수에 람다표현식 사용
l1 = [1,2,3,4,5]
l2 = list(map((lambda x:x+1), l1))
print(l1)
print(l2)
[out]
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
1.4.4 람다표현식에 조건부 표현식 사용
→ lambda 매개변수들:식1 if 조건식 else 식2
# 짝수는 float로 변경, 홀수는 str로 변경
l1 = [1,2,3,4,5,6,7,8,9,10]
list(map((lambda x:float(x) if x % 2 == 0 else str(x)), l1))
[out] ['1', 2.0, '3', 4.0, '5', 6.0, '7', 8.0, '9', 10.0]
1.5 클래스
1.5.1 자동차 클래스 만들기
# 클래스 생성
class Car:
# 객체 생성
def __init__(self, b, m, c):
self.brand = b
self.model = m
self.color = c
print(self.brand, self.model, self.color, '출고')
# 메소드 생성
def turn_on(self):
print(self.brand, '시동을 겁니다.')
def turn_off(self):
print(self.brand, '시동을 끕니다.')
def drive(self):
print(self.brand, '주행중입니다.')
1.5.2 객체 생성
클래스의 def __init__ 함수를 활용하여 객체 생성
car1 = Car('현대자동차', '소나타', '화이트')
car2 = Car('르노삼성', 'SM7', '블랙')
[out] 현대자동차 소나타 화이트 출고
르노삼성 SM7 블랙 출고
1.5.3 메소드 호출
class 내에서 생성한 메소드 함수를 활용하여 호출이 가능
car1.turn_on()
car1.turn_off()
car1.drive()
[out]
현대자동차 시동을 겁니다.
현대자동차 시동을 끕니다.
현대자동차 주행중입니다.
1.6 파이썬 내장 모듈
1.6.1 math
수학적 연산과 관련된 함수들을 모아놓은 모듈
import math
print(math.ceil(1.4)) # 올림
print(math.floor(1.7)) # 내림
print(math.sqrt(4)) # 제곱근
print(math.factorial(3)) # 팩토리얼
print(math.pi) # 원주율
[out] 2
1
2.0
6
3.141592653589793
1.6.2 random
임의의 수를 발생시키거나 리스트의 요소 중 임의의 수를 선택하는 데 사용되는 모듈
import random
# 1~10 사이의 랜덤 정수 구하기(10포함)
print(random.randint(1, 10))
# 1~9 사이의 랜덤 정수 구하기
print(random.randrange(1, 10))
# 0~9 사이의 랜덤 정수 구하기
print(random.randrange(10))
# 0~1 사이의 랜덤 실수 구하기
print(random.random())
# 1~10 사이의 랜덤 실수 구하기
print(random.uniform(1, 10))
# 시퀀스 데이터에서 무작위 요소 추출
print(random.choice([1, 2, 3]))
# 시퀀스 데이터에서 무작위 요소 n개 추출
print(random.sample([1, 2, 3], 2))
# 시퀀스 데이터를 무작위로 섞기
a = [1, 2, 3, 4, 5]
random.shuffle(a)
1.6.3 datetime
날짜, 시간과 관련된 모듈로 날짜 형식을 만들 때 주로 사용된다.
import datetime
# 현재 날짜와 시각
now = datetime.datetime.now()
# 포멧에 맞게 출력
now.strftime('%Y.%m.%d %H:%M:%S')
# 특정시간 더하기
# → 특정 일, 시간, 분, 초 이후의 날짜와 시간 구하기
now + datetime.timedelta(weeks = 1, days = 1, hours = 1, minutes = 1, seconds = 1)
1.6.4 time
시간 데이터를 다루기 위한 모듈
import time
# 현재 날짜와 시간 가져오기
tm = time.localtime()
tm
[out] time.struct_time(tm_year=2023, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=18, tm_sec=23, tm_wday=1, tm_yday=38, tm_isdst=0)
# timestamp를 '요 월 일 시:분:초 년' 포멧으로 변환
time.ctime()
[out] 'Tue Feb 7 14:19:17 2023'
# 일시정지 기능 → n초를 일시정지함
# 카운트다운
print(3)
time.sleep(1)
print(2)
time.sleep(1)
print(1)
time.sleep(1)
print('start')
2. 멘토링
현재 듣고 있는 온라인 강의의 강사님과 멘토링 시간을 1시간동안 가졌다. 멘토링 시간 전 궁금한 점, 모르는 점을 질문을 남기면 멘토링 시간에 강사님께서 답변해주신다.
[나의 질문]
remove 함수를 사용하여 리스트 내 요소를 제거할 때, 중복된 요소가 있으면 앞의 인덱스의 요소만 제거되는데, 중복된 요소 전체를 제거하거나, 뒤의 인덱스의 요소를 제거하기 위해서는 어떻게 해야 하나요?
▶ [답변]
remove 함수는 하나씩만 제거되기 때문에 중복된 요소 전체를 제거할 때에는 for 반복문 등 알고리즘을 사용해야 함.
뒤의 인덱스의 요소를 제거하기 위해서는 del이나 pop을 활용하여 제거해야 함.
3. 회고
가장 취약했던 부분들을 많이 배웠던 하루였다. 최대한 연습문제는 스스로 풀어보려고 노력했으며, 몰라도 계속 시도해보려고 하는 중이다!
전역, 지역변수, 클래스 부분이 아직 헷갈리는데, 이후 활용하면서 익혀야겠다.
map함수, 람다표현식도 생각보다 많이 활용되던데 이것 또한 계속 활용하면서 익혀봐야지 :)
'웅진X유데미 STARTERS > TIL (Today I Learned)' 카테고리의 다른 글
[스타터스 TIL] 5일차.파이썬 데이터 시각화 (2) - 그래프 종류 (0) | 2023.02.11 |
---|---|
[스타터스 TIL] 4일차.파이썬 데이터 시각화 (1) - 기본 그래프 (0) | 2023.02.10 |
[스타터스 TIL] 4일차.파이썬 데이터 분석 (4) - 분석 실습, value_counts, groupby (0) | 2023.02.09 |
[스타터스 TIL] 3일차.파이썬 데이터 분석 (3) - 판다스, 데이터프레임 (0) | 2023.02.09 |
[스타터스 TIL] 1일차.파이썬 데이터 분석 (1) - 자료형, 리스트, 튜플 (0) | 2023.02.07 |