회사 다니면서 개인 공부하기 바쁘다는 핑계로 슬그머니 덮어 놓기 일쑤였는데, 이번에는 기본서 한 권을 다 볼 수 있었습니다!!
사실 제가 의지박약이라 초반엔 의욕이 넘쳐서 이것 저것 하다가 갈수록 늘어지고 결국 포기했던 경험이 많았어서, 내심 완주를 걱정했었는데 성공해서 너무 뿌듯하고 행복합니다 😊
회사 업무에, 이직 준비에 이래저래 바빴던 나날이었지만, 매주 미션을 제출하면 족장님이 장문의 정성스러운 코멘트를 달아 주십니다.
바쁘고 힘들 때는 하기 싫은 마음도 들었지만... 항상 달아주시는 따뜻한 댓글, 폭풍칭찬 덕분에 더 의욕이 샘솟고, 다음 주도 꼭 제출해야지 하는 원동력이 되었던 것 같아요. ❤️
또 다른 학습단 분들이 공부하신 내용도 보면서 자극 받을 수도 있었구요.
이번 활동을 통해서 많은 것을 얻을 수 있었습니다.
매 주 꾸준히 파이썬을 공부하고, 공부한 내용을 나만의 언어로 정리한 것, 그리고 정해진 기간 내에 모두 끝냈다는 것, 파이썬으로 간단한 프로그램을 작성할 수 있게 되었고 파이썬으로 코딩테스트 문제를 풀어볼 수 있게 되었다는 것. 모두 혼공학습단을 하면서 얻게 된 성과입니다.
그리고 활동을 시작하면서, "천재지변이 아니면 절대 지각하지 말자" 라고 다짐 했었는데, 이 부분도 지켜진 것 같아 뿌듯합니다.
혼공학습단 11기 활동은 여기서 끝나지만, 책 내용을 완벽하게 이해한 것은 아니기 때문에 파이썬 공부는 계속하려고 합니다. 파이썬 마스터가 되는 그 날까지! 🫡
✏️ 예외 (exception) 또는 런타임 오류 (runtime error) : 프로그램 실행 중에 발생하는 오류이며, 구문 오류 해결법처럼 오류가 발생한 코드를 찾아 수정해야 한다.
✏️예외 처리 (exception handling) : 예외를 처리하는 모든 것
✔️구문 오류는 프로그램 실행 전에 발생하기 때문에 예외처리 방법으로 처리할 수 없다.
★ 조건문으로 예외 처리하기
✔️ 정수를 입력받는 소스 코드에 문자열을 입력한다면 ? 예외 발생!
✔️ '정수를 입력하지 않았을 때' 를 조건으로 구분해서, 해당 상황일 때 프로그램이 죽지 않고 정상 종료되도록 한다.
# 조건문으로 예외 처리
input_num = input("정수 입력 > ")
# 사용자 입력이 숫자로만 구성되어 있을 때
if input_num.isdigit():
number = int(input_num)
print("입력받은 숫자: ", number)
else:
print("정수가 입력되지 않았습니다.")
# 정수 입력한 경우
정수 입력 > 5
입력받은 숫자: 5
# 문자열 입력한 경우
정수 입력 > 문자열
정수가 입력되지 않았습니다.
★ try except 구문을 사용하여 예외 처리하기
파이썬에서 제공하는 예외를 처리할 수 있는 구문
어떤 상황에 예외가 발생하는 지 모두 파악하지 않아도 프로그램이 강제로 죽는 상황을 막을 수 있다.
try: 예외가 발생할 가능성이 있는 코드 except: 예외가 발생했을 때 실행할 코드
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("입력받은 숫자: ", input_num)
except:
# 예외 발생 시 실행할 구문
print("정수가 입력되지 않았습니다.")
# 정수 입력
정수 입력 > 6
입력받은 숫자: 6
# 정수가 아닌 문자열 입력
정수 입력 > 안녕하세요
정수가 입력되지 않았습니다.
★try except 구문과 pass 키워드를 조합해서 사용하기
try except 구문 사용 시 except 구문에 아무것도 넣지 않으면 구문 오류가 발생하므로, pass 키워드를 추가한다.
try: 예외가 발생할 가능성이 있는 코드 except: pass
★try except else 구문
try except 구문에 else 구문을 넣으면 '예외가 발생 하지 않았을 때 실행할 코드' 를 지정할 수 있다.
예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고, 나머지는 else로 빼는 경우가 많다.
# try except else 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
except:
print("정수가 아닙니다.")
else:
print("입력받은 숫자: ", input_num)
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자: 10
# 정수를 입력하지 않은 경우
정수 입력 > hello
정수가 아닙니다.
★finally 구문
예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문.
예외 발생 여부와 상관 없이 무조건 실행할 때 사용하는 코드
try: 예외가 발생할 가능성이 있는 코드 except: 예외가 발생했을 때 실행할 코드 else: 예외가 발생하지 않았을 때 실행할 코드 finally: 무조건 실행할 코드
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("입력받은 숫자: ", input_num)
except:
print("정수가 아닙니다.")
else:
print("예외가 발생하지 않았습니다.")
finally:
print("프로그램이 모두 끝났습니다.")
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자: 10
예외가 발생하지 않았습니다.
프로그램이 모두 끝났습니다.
# 정수를 입력하지 않은 경우
정수 입력 > 테스트
정수가 아닙니다.
프로그램이 모두 끝났습니다.
※ try 구문은 단독으로 사용할 수 없고, 반드시 except 구문이나 finally 구문과 함께 사용해야 한다.
※ else 구문은 반드시 except 구문 뒤에 사용해야 한다.
★finally 키워드를 사용해서 코드를 깔끔하게 만들기
finally 키워드는 무조건 실행되기 때문에, 반복문이나 함수 내부에서 사용하면 좋다.
예시) 파일 처리 코드
try 구문에서 return 키워드로 빠져 나가거나 예외 발생으로 try 구문 중간에 빠져 나가는 경우에 파일이 제대로 닫히지 않는 문제가 발생할 수 있음
finally 구문을 활용하여 try 구문을다 수행하지 않고 빠져나가더라도 무조건 파일이 닫히게 할 수 있다.
[예외 고급]
✏️ 예외 객체 (exception object): 프로그램에서 예외가 발생하면 예외와 관련된 정보가 생긴다. 그리고 예외 정보는 예외 객체에 저장된다.
try: 예외가 발생할 가능성이 있는 구문 except 예외의 종류 as 예외 객체를 활용할 변수 이름: 예외가 발생했을 때 실행할 구문
★ 예외의 종류가 뭔지 모를 땐 Exception 을 사용한다.
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("입력받은 숫자: ", input_num)
except Exception as exception:
# 예외 객체의 자료형 출력
print("type(exception): ", type(exception))
# 예외 객체 출력
print(exception)
# 문자를 입력한 경우 예외 발생
정수 입력 > hi
type(exception): <class 'ValueError'>
invalid literal for int() with base 10: 'hi'
★ 프로그램 실행 중에 여러 개의 예외가 발생할 수 있다. 파이썬에서는 execpt 구문 뒤에 예외의 종류를 입력해서 예외를 구분할 수 있다.
try: 예외가 발생할 가능성이 있는 구문 except 예외의 종류A: 예외A가 발생했을 때 실행할 구문 except 예외의 종류B: 예외B가 발생했을 때 실행할 구문 except 예외의 종류C: 예외C가 발생했을 때 실행할 구문
list_a = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("list의 요소 :", list_a[input_num])
except ValueError:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요")
except IndexError:
# IndexError가 발생하는 경우
print("인덱스의 값을 벗어났습니다.")
# 정수가 아닌 값 입력 : ValueError 발생
정수 입력 > Hello
정수를 입력해 주세요
# 리스트의 인덱스를 넘는 값 입력 : IndexError 발생
정수 입력 > 10
인덱스의 값을 벗어났습니다.
✏️예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수 있다. as 키워드를 사용한다.
list_a = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("list의 요소 :", list_a[input_num])
except ValueError as excption:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요")
# 예외 객체 출력
print("exception: ", excption)
except IndexError as excption:
# IndexError가 발생하는 경우
print("인덱스의 값을 벗어났습니다.")
# 예외 객체 출력
print("exception: ", excption)
# IndexError 발생시킨 경우
정수 입력 > 100
인덱스의 값을 벗어났습니다.
exception: list index out of range
★ except 구문으로 예외를 구분하는 경우, 예외 조건에 일치하는 것이 없다면 프로그램이 종료된다.
→ except 구문의 마지막에는 Exception 을 추가하여 프로그램의 종료를 막는 것이 좋다.
★ '이 코드에서 어떤 예외가 발생할 것인지' 잘 예측하는 것이 중요하다.
list_a = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 예외가 발생할 가능성이 있는 구문
input_num = int(input("정수 입력 > "))
print("list의 요소 :", list_a[input_num])
예외발생()
except ValueError as excption:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요")
# 예외 객체 출력
print("exception: ", excption)
except IndexError as excption:
# IndexError가 발생하는 경우
print("인덱스의 값을 벗어났습니다.")
# 예외 객체 출력
print("exception: ", excption)
except Exception as exception:
# ValueError 와 IndexError가 아닌 예외가 발생한 경우
print("이외의 예외가 발생하였습니다.")
print(type(exception), exception)
# IndexError / ValueError가 아닌 예외 발생
정수 입력 > 1
list의 요소 : 273
이외의 예외가 발생하였습니다.
<class 'NameError'> name '예외발생' is not defined
✏️ raise 구문: 예외를 강제로 발생시키고 싶을 때 사용하는 구문이다.
raise 예외 객체
Chapter 07. 모듈
[표준 모듈]
✏️ 모듈(module): 파이썬은 모듈 기능을 활용해 코드를 분리하고 공유한다. 모듈은 여러 변수와 함수를 가지고 있는 집합체 이다.
1️⃣ 표준 모듈 : 파이썬에 기본적으로 내장되어 있는 모듈
2️⃣ 외부 모듈 : 다른 사람들이 만들어서 공개한 모듈
✅ 모듈을 가져올 때는 import 구문을 사용하며, 코드의 가장 위에 작성한다.
import 모듈 이름
# 예시 : 수학과 관련된 모듈인 math모듈 가져오기 import math
✅ 모듈을 가져온 후 모듈에서 제공하는 변수나 함수를 사용할 수 있다.
import math
# 사인값을 구하는 내장 함수
math.sin(1)
# 0.8414709848078965
✅ from 구문
모듈을 읽어들일 때 from 구문을 사용해서, 모듈에서 가져오려는 변수나 함수 앞에 모듈 이름을 생략할 수 있다.
from 모듈 이름 import 가져오고 싶은 변수 또는 함수
from math import sin
# math 를 붙이지 않아도 사용이 가능해 졌다.
sin(1)
# 0.8414709848078965
✅ as 구문
모듈을 가져올 때 이름을 변경해서 사용하고 싶은 경우 as 구문을 사용한다.
from 모듈 as 사용하고 싶은 식별자
import math as m
# math 모듈을 m 이라는 이름으로 치환해서 사용한다.
m.sin(1)
# 0.8414709848078965
[기본 미션 : 구문 오류와 예외의 차이 설명하기 (p.379 1번 문제) ]
✅ 구문 오류는 프로그램이 실행되기 전에 발생하는 문법적인 오류이며, 해결하지 않으면 프로그램 자체가 실행 되지 않는다. 예외는 프로그램이 실행 중에 발생하는 오류로, 예외 처리 (ex. try except 구문) 를 통해 해결할 수 있다.
✅ 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭기 때문에 파이썬에서 제공하는 방법
✅ 람다를 사용하면 코드를 깔끔하게 작성할 수 있고, 매개변수로 넣어진 함수를 파악하기도 쉽다.
lambda 매개변수 : 리턴값
# 람다 함수 선언
lambda_test = lambda x : x < 3
list_a = [1,2,3,4,5]
# 람다는 매개변수로 바로 넣을 수 있다.
output_a = map(lambda x : x * x, list_a)
print(list(output_a)) # [1, 4, 9, 16, 25]
[기본 미션 : 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기]
[리스트]
✏️리스트: 여러 가지 자료를 저장할 수 있는 자료
★ 이전 장에서 활용한 숫자,문자 등은 '개별적인 자료' 이며, 리스트는 이러한 자료들을 모아서 사용할 수 있게 해주는 '특별한 형태의 자료' 이다.
✏️리스트 생성 방법
✔️ 대괄호 [ ] 안에 자료를 쉼표 ( , ) 로 구분해서 입력하여 리스트를 생성한다. 대괄호 내부에 넣는 자료를 요소 (Element) 라고 한다. 리스트는 N개의 자료형으로 구성할 수 있다. (1개 ~ N개)
# 리스트 생성 방법 list = [요소, 요소, 요소, ... ]
✏️리스트 인덱스
✔️리스트 안에 있는 요소를 각각 사용하려면 리스트 이름 바로 뒤에 대괄호 [ ] 를 입력하고, 그 안에 선택한 요소의 위치를 나타내는 숫자를 입력한다. 이 숫자를 인덱스(index)라고 한다.
파이썬의 인덱스는 0부터 시작하기 때문에 각각의 요소는 다음과 같은 형태로 저장된다.
list_a = [1, 2, 3, 4, 5]
✏️리스트 사용법
✔️ 리스트의 특정 요소를 변경할 수 있다.
리스트명[인덱스 번호] = "바꿀 값"
list_a = [1,2,3]
# list_a의 첫번째 요소를 "change" 로 변경
list_a[0] = "change"
print(list_a) # ['change', 2, 3]
✔️파이썬의 인덱스 값은 양수와 음수를 모두 사용할 수 있으며, 음수로 입력할 경우 리스트의 끝부분 부터 탐색한다. 인덱스 -1의 경우 가장 마지막 요소를 출력한다.
list_a = [1, 2, 3, 4, 5]
✔️리스트 접근 연산자는 이중으로 사용할 수 있다.
✔️ 리스트 안에 리스트를 사용할 수 있다.
list_a = [1,2,3,"test",True,False]
# list_a의 3번째 인덱스 "test" 출력
print(list_a[3]) # test
# 'test' 문자열의 첫번째 요소 't' 출력
print(list_a[3][0])
# 리스트 안에 리스트를 사용할 수 있다.
list_b = [ [1,2,3], [4,5,6], [7,8,9] ]
print(list_b[0]) # [1, 2, 3]
print(list_b[1]) # [4, 5, 6]
print(list_b[2]) # [7, 8, 9]
print(list_b[0][2]) # 3
[리스트의 연산]
✏️ 문자열에 적용할 수 있는 연산자는 리스트에서도 활용이 가능하다.
✔️ 연결 ( + ) , 반복 ( * ) , len()
list_a = [1,2,3]
list_b = [4,5,6]
# 연결 연산자 ( + ) 를 사용해서 list_a 와 list_b의 자료를 연결한다.
print(list_a+list_b) # [1, 2, 3, 4, 5, 6]
# 반복 연산자 ( * ) 를 사용해서 list_a의 자료를 3번 반복한다.
print(list_a * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
# len(리스트) 는 리스트에 저장된 요소의 개수를 세어 준다.
print(len(list_a)) # 3
[리스트에 요소 추가하기]
✏️ append() : 리스트 뒤에 요소를 추가한다.
✏️ insert() : 리스트의 지정한 위치에 요소를 추가한다.
✏️ extend() : 한 번에 여러 요소를 추가할 때 사용하며, 매개변수로 리스트를 입력한다. 원래 리스트 뒤에 새로운 리스트의 요소를 모두 추가한다.
# 리스트 뒤에 요소 추가 리스트명.append(요소)
# 리스트 중간에 요소 추가 리스트명.insert(위치, 요소)
# 한 번에 여러 요소 추가 리스트명.extend( [ 리스트] )
# 리스트 선언
list_a = [1,2,3]
# 리스트 뒤에 요소 추가
list_a.append(4)
print(list_a) # [1, 2, 3, 4]
# 리스트 중간에 요소 추가
# 인덱스 '0' 위치에 '10' 추가
list_a.insert(0,10)
print(list_a) # [10, 1, 2, 3, 4]
# 한 번에 여러 요소 추가
list_a.extend([5,6,7])
print(list_a) # [10, 1, 2, 3, 4, 5, 6, 7]
★ 리스트 연결 연산자를 사용하는 경우 원본 리스트에 변화가 없으나 (비파괴적 처리) extend() 함수 사용 시 원본 리스트가 변경된다. (파괴적 처리)
[리스트에서 요소 제거하기]
✏️인덱스로 제거 : 매개변수로 주어진 인덱스 위치에 있는 요소를 제거한다.
# del 키워드 사용 del 리스트명[인덱스]
# pop() 사용 리스트명.pop(인덱스)
★ pop() 은 매개변수를 입력하지 않으면 -1 로 간주하여, 마지막 요소가 제거된다.
✏️값으로 제거: 리스트 내부에 저장된 값을 지정해서 제거한다.
# remove() 사용 리스트.remove(값)
★ remove() 는 매개변수로 받은 값이 리스트 내부에 여러 개 있어도 가장 먼저 발견되는 것 하나만 제거한다!
# 리스트 선언
list_a = [1,2,3,4,5,6,7,8,9]
# 0번째 인덱스 요소 삭제
list_a.pop(0)
print(list_a) # [2, 3, 4, 5, 6, 7, 8, 9]
# 매개변수를 입력하지 않았으므로 -1 로 간주하여 마지막 요소 삭제
list_a.pop()
print(list_a) # [2, 3, 4, 5, 6, 7, 8]
# 2번째 인덱스 요소 삭제
del list_a[2]
print(list_a) # [2, 3, 5, 6, 7, 8]
# 값 '3' 삭제
list_a.remove(3)
print(list_a) # [2, 5, 6, 7, 8]
[리스트 슬라이싱]
✏️ [ : ] 연산자로 리스트 범위를 지정하여 여러 요소를 선택할 수 있다.
마지막 위치에 '단계'를 추가하여 지정한 숫자만큼 인덱스를 건너 뛰면서 요소를 가져올 수 있다.
단계는 기본값이 1이므로, 인덱스를 건너뛰어야 하는 경우가 아니면 생략 가능하다.
리스트[시작 인덱스 : 끝 인덱스 : 단계]
# 리스트 선언
num = [1,2,3,4,5,6,7,8]
# num 리스트의 첫번째 인덱스 부터 4번째 인덱스 까지 출력하는데, 2씩 건너뛴다.
print(num[0:5:2]) #[1, 3, 5]
[clear() / sort() 함수]
✏️ 리스트 내부의 요소를 모두 제거할 때는 clear() 함수를 사용하며, 정렬 시에는 sort() 함수를 사용한다. sort() 는 기본 오름차순 정렬이다.
# clear() 리스트.clear()
# sort() 리스트.sort()
[in / not in 연산자]
✏️ 특정 값이 리스트 내부에 있는 지 확인하려면 in 연산자를 사용한다.
리스트 내부에 값이 있으면 True , 없으면 False를 출력한다.
# 사용법 값 in 리스트
✏️특정 값이 리스트 내부에 없는 지 확인할 때는 not in 연산자를 사용한다. (in 연산자와 반대로 동작한다.)
# 사용법 값 not in 리스트
# 리스트 선언
list_a = [1,2,3,4,5]
# list_a 에 1 이 있으므로 True
print(1 in list_a) # True
# list_a에 6이 없으므로 False
print(6 in list_a) # False
# list_a 에 1 이 있으므로 False
print(1 not in list_a) # False
# list_a에 6이 없으므로 True
print(6 not in list_a) # True
[전개 연산자]
✏️ 리스트 내용을 전개해서 입력할 수 있는 연산자. 리스트 앞에 * 기호를 사용하여 작성한다.
전개 연산자는 기본적으로 리스트 내부 , 함수의 매개변수에 사용한다.
a = [1,2,3]
# 리스트 내부에 전개 연산자 사용 가능.
# *a 는 [1,2,3] 로 전개해서 입력한 것과 같은 효과를 낸다.
b = [*a, *a]
print(b) # [1, 2, 3, 1, 2, 3]
# 함수 매개변수에 전개 연산자 사용 가능.
# print(1,2,3,1,2,3) 처럼 동작한다.
print(*b) # 1 2 3 1 2 3
[딕셔너리]
✏️딕셔너리: 키(key) 를 기반으로 값(value) 을 저장하는 것
✔️ 키는 딕셔너리 내부에서 값에 접근할 때 사용하며, 값은 딕셔너리 내부에 있는 각각의 내용이다.
✏️중괄호 {} 로 선언하며,키:값 형태를 쉼표(,) 로 연결해서 생성한다.
변수 = { 키 : 값, 키 : 값, ... 키 : 값 }
# 딕셔너리 선언
dict_a = {
"name": "kim", # 문자열을 키로 사용
"age" : 20,
1 : 30, # 숫자를 키로 사용
False: 10 # bool 값을 키로 사용
}
# 딕셔너리 출력
print(dict_a)
>> {'name': 'kim', 'age': 20, 1: 30, False: 10}
# 빈 딕셔너리 선언
dict_b = {}
★ 딕셔너리의 키를 문자열로 사용 시 따옴표 (" ") 를 붙여야 한다.
[딕셔너리 요소에 접근하기]
★딕셔너리를 선언할 때는 { } 를 사용하지만, 요소에 접근할 때는 딕셔너리 뒤에 [ ] 를 입력하고 괄호 내부에 인덱스처럼 키를 입력한다.
✏️딕셔너리 내부에는 문자열, 숫자, bool, 리스트, 딕셔너리 등 다양한 자료를 넣을 수 있다.
# 딕셔너리 선언
dict_a = {
"name" : "포카칩",
"price" : 1500,
"store" : ["편의점", "대형마트", "슈퍼"],
"flavor" : "original"
}
print(dict_a)
>> {'name': '포카칩', 'price': 1500, 'store': ['편의점', '대형마트', '슈퍼'], 'flavor': 'original'}
print(dict_a["name"])
>> 포카칩
print(dict_a["store"])
>> ['편의점', '대형마트', '슈퍼']
# 인덱스를 지정하여 딕셔너리 안의 리스트에 대한 특정 값을 출력할 수 있다.
print(dict_a["store"][0])
>> 편의점
[딕셔너리에 값 추가/제거]
✏️딕셔너리에 값을 추가할 때는 키를 기반으로 입력한다.
딕셔너리[새로운 키] = 새로운 값
# 딕셔너리에 이미 존재하는 키를 지정하고 값을 넣으면 기존의 값을 새로운 값으로 변경한다. 딕셔너리[기존 키] =새로운 값
✔️ get() 은 딕셔너리의 키로 값을 추출하는 함수인데, 존재하지 않는 키에 접근할 경우 None 을 출력한다.
# 딕셔너리 선언
dict_a = {
"name" : "포카칩",
"price" : 1500,
"store" : ["편의점", "대형마트", "슈퍼"],
"flavor" : "original",
"manufacturer" : "오리온"
}
# 키가 존재하는지 확인 : in 연산자 사용
if "name" in dict_a:
print(dict_a["name"])
>> 포카칩
# 존재하지 않는 경우
if "test" in dict_a:
print(dict_a["test"])
else:
print("존재하지 않는 키입니다.")
>> 존재하지 않는 키입니다.
# 키가 존재하는지 확인 : get() 사용
value = dict_a.get("name")
if value == None:
print("존재하지 않는 키입니다.")
else:
print(value)
>> 포카칩
# 키가 존재하지 않는 경우 : value 값이 None
value = dict_a.get("test")
# value 값이 None인지 확인
if value == None:
print("존재하지 않는 키입니다.")
else:
print(value)
>> 존재하지 않는 키입니다.
★ 리스트와 딕셔너리 비교
리스트
딕셔너리
의미
인덱스를 기반으로 값을 저장함
키를 기반으로 값을 저장함
가리키는 위치
인덱스
키
선언 형식
변수=[]
변수={}
값 사용 방식
list_a[1]
dict_a["name"]
값 추가 방식
list_a.append(5)
list_a["age"]=20
list_a.insert(1, 5)
값 제거 방식
del list_a[1]
del dict_a["name"]
list_a.pop(1)
[범위 자료형]
✏️범위(range) : 정수의 범위를 나타내는 값으로, 특정한 횟수 만큼 반복해서 돌리고 싶을 경우 for 반복문과 범위를 조합해서 사용한다. range()함수를 사용하여 범위를 만들 수 있다.
[range() 사용법]
1️⃣ 매개변수에 숫자 한 개 입력
# 0부터 N-1 까지의 정수로 범위 생성 range(N)
2️⃣ 매개변수에 숫자 두 개 입력
# N 부터 M-1 까지의 정수로 범위 생성 range(N,M)
3️⃣ 매개변수에 숫자 세 개 입력
# N 부터 M-1 까지의 정수로 범위 생성, 앞 뒤 숫자가 C 만큼의 간격이 있다. range(N,M,C)
# 범위 선언
range_a = range(5) # 1번 방법, 0부터 4까지 정수로 범위 생성
range_b = range(1,5) # 2번 방법, 1부터 4까지 정수로 범위 생성
range_c = range(1,10,2) # 3번 방법, 1부터 2씩 증가하면서 9까지 정수로 범위 생성
# 범위를 리스트로 변경하여 범위 내부에 어떤 값이 들어있는 지 확인 가능하다.
print(list(range_a))
>> [0, 1, 2, 3, 4]
print(list(range_b))
>> [1, 2, 3, 4]
print(list(range_c))
>> [1, 3, 5, 7, 9]
★ 범위 생성 시매개변수로 무조건 정수를 입력해야 한다.
n = 10 a = range( 0, int( n / 2 ) ) # n/2 의 결과 값인 실수를 정수로 바꿔주거나 a = range( 0, n // 2 ) # 정수 나누기 연산자를 사용해서 몫만 가져온다!
[반복문]
★ 특정 코드를 반복해서 실행할 때 사용하는 구문.
[for 반복문]
✏️ 딕셔너리 , 리스트, 범위 자료형 등과 함께 사용된다.
# for 반복문의 기본적인 형태
for반복자in반복할 수 있는 것: # 반복할 수 있는 것에는문자열, 리스트, 딕셔너리, 범위 등이 있다. 코드
list_a = [1,2,3,4,5]
# list_a 에 있는 요소 하나 하나가 element 변수 안에 들어간다
# 리스트의 요소를 차례차례 출력
for element in list_a:
print(element)
# 출력
1
2
3
4
5
✏️ 딕셔너리와 for 반복문 사용하기
★ 딕셔너리 내부에 있는 키가 변수에 들어간다는 점에 유의한다!
for 키 변수 in 딕셔너리: 코드
dict_a = {
"name" : "포카칩",
"price" : 1500,
"store" : ["편의점", "대형마트", "슈퍼"],
"flavor" : "original",
"manufacturer" : "오리온"
}
for key in dict_a:
print(key ,":", dict_a[key])
[출력]
name : 포카칩
price : 1500
store : ['편의점', '대형마트', '슈퍼']
flavor : original
manufacturer : 오리온
✏️ 범위 자료형과 for 반복문 사용하기
for 숫자 변수 in 범위: 코드
# 기본적인 범위 자료형과 for 반복문 조합
for i in range(5):
print(i)
[출력]
0
1
2
3
4
# 리스트와 범위를 조합해서 사용 가능
# 현재 몇번째 요소를 출력하는지 알 수 있다.
array = [1,2,3,4,5]
for i in range(len(array)):
print("{} 번째 요소 {}".format(i, array[i]))
[출력]
0 번째 요소 1
1 번째 요소 2
2 번째 요소 3
3 번째 요소 4
4 번째 요소 5
[while 반복문]
✏️ 조건을 활용해서 반복할 때 사용한다. for 반복문은 특정 코드를 N번 반복하며, while 반복문은 <불 표현식> 이 참인 동안 문장을 계속 반복한다.
while 불 표현식: 문장
# 무한루프 while True: 문장
i = 0
# i < 5 를 만족하는 동안만 실행한다.
while i < 5:
print("{} 번째 반복입니다.".format(i))
i += 1
[출력]
0 번째 반복입니다.
1 번째 반복입니다.
2 번째 반복입니다.
3 번째 반복입니다.
4 번째 반복입니다.
✏️break 키워드는 반복문을 벗어날 때 사용하는 키워드이다.
# break 사용 예시
i = 0
# 무한루프
while True:
print("i 의 값 : {}".format(i))
# i 값 1씩 증가
i += 1
# i 값이 5보다 커지면 반복문 종료
if i > 5:
print("무한루프 종료")
break
[출력]
i 의 값 : 0
i 의 값 : 1
i 의 값 : 2
i 의 값 : 3
i 의 값 : 4
i 의 값 : 5
무한루프 종료
✏️continue키워드는현재 반복을 생략하고 다음 반복으로 넘어갈 때 사용하는 키워드이다.
# continue 사용 예시
list_a = [10,4,20,1,15,9,30]
for item in list_a:
# item 이 10보다 작으면 다음 반복으로 넘어간다.
if item < 10:
continue
print(item)
[출력]
10
20
15
30
[선택 미션 : p.213 쪽의 1번 문제의 답 쓰고 인증하기]
✔️ list의 extend 함수는 리스트 뒤에 매개변수로 받은 리스트 요소를 모두 추가해 준다.
✔️list의 append 함수는 리스트 뒤에 매개변수로 받은 요소를 추가한다.
✔️list의 insert 함수는 첫 번째 매개변수로 위치, 두 번째 매개변수로 요소를 받는다. 따라서 위 예제에서는 list_a의 3번째 인덱스에 '0' 을 추가해 준다.
✔️list의 remove 함수는 매개변수로 받은 요소를 제거한다. 매개변수로 받은 값이 리스트 내에 여러 개 있어도 처음 발견하는 하나만 제거한다.
✏️ Bool 자료형: 파이썬의 기본 자료형으로, True (참) / 거짓 (False) 을 나타내는 값. 비교 연산자를 통해 얻을 수 있다.
[비교 연산자의 종류]
연산자
설명
연산자
설명
==
같다
>
크다
!=
다르다
<=
작거나 같다
<
작다
>=
크거나 같다
✏️ 숫자 또는 문자열에 비교 연산자를 적용하여 참/거짓을 출력할 수 있다.
한글 비교는 사전 순서 (가나다 순) 로 앞에 있는 것이 작은 값을 갖는다.
영어 비교는 알파벳 순으로 비교한다. 같은 단어라도 대소문자가 다르면 다른 문자열로 판단한다.
# 10과 100은 다르므로 False
print (10 == 100)
# 10은 100보다 작으므로 True
print (10 < 100)
# 10과 100은 다르므로 True
print( 10 != 100)
# 10은 100보다 작으므로 False
print (10 >= 100)
False
# "가방" 과 가방은 같은 단어이므로 True
print("가방" == "가방")
# "ㄱ" 이 "ㅎ"보다 앞에 있으므로 True
print("가방" < "하마")
# "ㄱ" 이 "ㅎ"보다 앞에 있으므로 False
print("가방" > "하마")
# "a" 가 "b" 보다 알파벳 순서상 앞이므로 True
print("apple" < "banana")
# "a" 가 "b" 보다 알파벳 순서상 앞이므로 True
print("apple" > "banana")
# 같은 단어이지만 "p" 가 소문자/대문자인 차이가 있으므로 False
print("python" == "Python")
★ bool 끼리는 논리 연산자를 사용할 수 있다.
[논리 연산자의 종류]
연산자
사용 예
의미
설명
not
not A
아니다 (부정)
A 의 값을 반대로 전환한다. (A가 True면 False로, False면 True 로)
and
A and B
그리고
A 와 B가 모두 참일 때만 True를 출력하며, 그 외는 모두 False를 출력한다.
or
A or B
또는
A 와 B 둘 중 하나라도 참이면 True 를 출력하며, A와 B가 모두 거짓일 때만 False를 출력한다.
x = 10
under_20 = x < 20
print(under_20) # True
print(not under_20) # False
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
✏️ if 조건문: 조건에 따라 코드를 실행하거나, 실행하지 않게 만들고 싶을 때 사용한다.
# 사용 예
if bool 값이 나오는 표현식: # if 조건문 뒤에 콜론( : )을 붙여준다. True일 때 수행할 문장1 # if 문 아래 문장은 4칸 들여쓰기 후 입력한다. True일 때 수행할 문장2
x = 10
if x > 0:
print("양수입니다") # 양수입니다 출력
if x < 0:
print("음수입니다") # 거짓이므로 아무 값도 출력되지 않는다.
✏️if ~ else 구문: if 조건문 뒤에 else 구문을 사용하여, if 조건문의 값이 False인 경우 else 구문 값을 실행한다.
# 사용 예
if 조건: True일 경우 실행할 문장 else: False일 경우 실행할 문장
number = int(input("정수 입력> ")) # 정수 입력> 13
if number % 2 == 0:
# number % 2 가 0인 경우 (True) "짝수입니다" 출력
print("짝수입니다")
else:
# number % 2 가 0이 아닌 경우 (False) "홀수입니다" 출력
# 13은 홀수이므로 이 문장 실행
print("홀수입니다")
✏️ elif 구문: 조건이 두 가지 만으로 구분되지 않는 경우, if ~ elif ~ else 구문을 사용하여 여러 조건에 대한 분기를 수행
# 사용 예
if 조건 A: 조건 A 가 True일 경우 실행할 문장 elif 조건 B: 조건 B가 True일 경우 실행할 문장 elif 조건 C: 조건 C가 True일 경우 실행할 문장 else: 조건 A,B,C에 걸리지 않는 경우 ( 모든 조건이 False인 경우) 실행할 문장
# 날짜/시간과 관련된 기능을 가져온다
import datetime
# 현재 날짜 시간을 구한다
now = datetime.datetime.now()
# 비교할 수 있도록 월 정보를 month 변수에 저장한다.
month = now.month
# 조건문으로 현재 계절을 확인한다.
if 3 <= month <= 5:
print("봄입니다")
elif 6 <= month <= 8:
print("여름입니다")
elif 9 <= month <= 11:
print("가을입니다")
else:
print("겨울입니다")
# 파이썬 조건문을 효율적으로 구성하기
# 점수를 입력 받아 학점을 계산해 주는 프로그램
score = int(input("학점입력: "))
if score >= 90:
print("A 학점")
# 위에서 score가 90보다 큰 지 검사했으므로 하위 값만 검사한다.
# 이 조건문은 80 =< score =< 90 과 같은 의미이다.
elif score >= 80:
print("B 학점")
# 위에서 score가 90,80보다 큰 지 검사했으므로 하위 값만 검사한다.
# 70 <= score <= 80
elif score >= 70:
print("C 학점")
# 위에서 score가 90,80,70보다 큰 지 검사했으므로 하위값만 검사한다.
# 60<= score <= 70
elif score >= 60:
print("D 학점")
# 모든 조건식에 해당되지 않는 경우
else:
print("F 학점")
✏️ False 로 변환되는 값: if 조건문의 매개변수가 bool 값이 아닌 다른 값을 사용하는 경우 자동으로 이를 bool 값으로 변환해서 처리한다.
False로 변환되는 값 : None, 숫자 0, 0.0 , 빈 컨테이너 (빈 문자열, 빈 바이트열, 빈 리스트, 빈 튜플, 빈 딕셔너리 등)
True로 변환되는 값 : 그 외 나머지
# if 조건문에 0 넣기
if 0:
print("0은 True 를 반환한다.")
else:
# 조건문에 0이 들어오면 False를 반환하므로 else 구문이 실행된다.
print("0은 False를 반환한다.")
# if 조건문에 빈 문자열 넣기
if "":
print("빈 문자열을 True를 반환한다.")
else:
# 조건문에 빈 문자열이 들어오면 False를 반환하므로 else 구문이 실행된다.
print("빈 문자열은 False를 반환한다.")
✏️ pass 키워드: 프로그래밍의 전체 골격을 잡아 두고, 내부에 처리할 내용은 나중에 만들고자 할 때 pass 키워드 입
✏️ input() 함수의 입력 자료형: input() 함수는 입력한 값을 무조건문자열로 처리한다.
number = input("숫자를 입력하세요: ")
# 숫자를 입력하세요: 123
print(number) # 123
print(type(number)) # <class 'str'>
★ input() 함수로 숫자를 입력받는 경우,입력받은 문자열을 숫자로 변환하는 작업이 필요하다. (캐스트 작업)
문자열을 숫자로 변환할 때는 다음 함수를 사용한다.
int(): 문자열을 정수형(int) 으로 변환한다.
float(): 문자열을 실수형(float) 으로 변환한다.
이와 반대로 숫자를 문자열로 변환할 때는 다음 함수를 사용한다.
str(숫자)
# input() 값을 입력받은 후, int 로 형변환하여 사용할 수 있다.
string_a = input("입력>")
int_a = int(string_a)
print(type(int_a)) # <class 'int'>
# 입력 받을 때 부터 int로 형변환하여 사용할 수 있다.
a = int(input("입력>"))
print(type(a)) # <class 'int'>
# 숫자 123을 string으로 형변환하여 사용할 수 있다.
int_b = str(123)
print(type(int_b)
[숫자와 문자열의 다양한 기능]
✏️ 문자열의 format() 함수
숫자와 문자열을 다양한 형태로 출력할 수 있는 함수
중괄호 { } 를 포함한 문자열 뒤에 마침표 (.) 를 찍고 format() 함수를 사용한다.
중괄호 개수와 format() 함수 괄호 안 매개변수의 개수는 반드시 같아야 한다.
{ } 기호를 format() 함수 안의 괄호 안에 있는 매개변수로 대체하는 것이기 때문에 { } 앞이나 뒤, { } 와 { } 사이에 다양한 문자열을 넣을 수 있다.
# 정수 출력
output_a = "{:d}".format(32)
# 음수 출력
output_b = "{:+d}".format(-32)
# 특정 칸 출력
output_c = "{:5d}".format(11)
# 빈칸을 0으로 채우기
output_d = "{:05d}".format(11)
# 실수 출력
output_e = "{:f}".format(52.12)
# 음수 출력
output_f = "{:f}".format(-52.12)
# 소수점 아래 자릿수 지정
output_g = "{:.2f}".format(52.1234)
# 의미 없는 소수점(.0) 제거
output_h = "{:g}".format(52.0)
# 출력
32
-32
11
00011
52.120000
-52.120000
52.12
52
✏️ 대소문자 변환 : upper(), lower()
upper() : 문자열의 알파벳을 대문자로 변경
lower() : 문자열의 알파벳을 소문자로 변경
a = "Hello World"
# a에 저장된 문자열을 모두 대문자로
print(a.upper()) # HELLO WORLD
# a에 저장된 문자열을 모두 소문자로
print(a.lower()) # hello world
✏️ 문자열 공백 제거 : strip()
strip() : 문자열 양 옆의 공백을 제거 (이 때 공백은 띄어쓰기, 탭, 줄바꿈 모두 포함)
✏️ 식별자(identifier): 프로그램 작성 시 이름을 붙일 때 사용하는 단어. 주로 변수명/함수명 등으로 사용한다. 식별자에는 키워드를 사용할 수 없으며 공백을 포함할 수 없다.
✔️ 스네이크 케이스 : 단어 사이에 언더바 ( _ ) 기호를 붙여 만든 식별자. 주로 함수/변수등에 사용
phone_number = "01012345678"
✔️ 캐멀 케이스 : 단어들의 첫 글자를 대문자로 만든 식별자. 주로 클래스 작성 시 사용
PhoneNumber = "01012345678"
Chapter 02. 자료형
[자료형이란?]
✏️자료 : 프로그램이 처리할 수 있는 모든 것
✏️프로그램: 자료를 처리하기 위한 모든 행위
✏️자료형: 기능과 역할에 따라 자료를 구분한 자료의 형식. 기본적으로 문자열, 숫자, bool 등이 있다.type() 함수를 사용하여 자료형을 확인할 수 있다.
[문자열]
✏️ 문자열(string) : 문자들이 나열된 자료형. 큰따옴표 (" ") 나 작은 따옴표 (' ') 로 감싸서 만든다.
✔️이스케이프 문자 : 문자열 내부에서 특수한 기능을 수행하는 문자. 역슬래시 ( \ ) 기호와 함께 조합해서 사용한다.
# 따옴표로 감싸 입력하는 것들은 모두 문자열이다.
print("Hello Python Programming..") # Hello Python Programming..
print('안녕하세요') # 안녕하세요
# 문자열 내부에 따옴표를 넣으려면
print(" '안녕하세요' 반갑습니다 ") # '안녕하세요' 반갑습니다
print(' "안녕하세요" 반갑습니다 ') # "안녕하세요" 반갑습니다
# 문자열 내부에 역슬래시 (\) 와 함께 사용하면 내부에 따옴표를 넣을 수 있다.
print('\"안녕하세요\" 반갑습니다') # "안녕하세요" 반갑습니다
print("\'안녕하세요\' 반갑습니다") # '안녕하세요' 반갑습니다
# 줄바꿈, 탭 기능
print("안녕하세요\n 반갑습니다")
안녕하세요
반갑습니다
print("안녕하세요\t 반갑습니다")
안녕하세요 반갑습니다
[문자열 연산자]
숫자에 더하기, 곱하기, 빼기, 나누기 연산자를 적용할 수 있는 것처럼, 문자열에도 적용할 수 있는 연산자가 있다.
✔️ 문자열 연결 연산자 ( + ): 두 문자열을 연결하여 새로운 문자열을 만들 수 있다.
💡 “문자열” + “문자열”
✔️문자열 반복 연산자 ( * ): 문자열을 숫자와 * 연산자로 연결하여 숫자만큼 문자열을 반복할 수 있다.
💡 문자열 * 숫자
# 연결 연산자 기본 사용법
print("안녕"+"하세요") # 안녕하세요
# 문자열과 연결하지 않으면 에러가 발생한다!
print("안녕하세요" + 1 )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
# 문자열과 숫자를 연결하려면 숫자에 큰따옴표를 붙여서 문자로 인식시켜야 한다.
print("안녕하세요" + "1" ) # 안녕하세요1
# 반복 연산자 사용 방법 1
print("안녕하세요"*2) # 안녕하세요안녕하세요
# 반복 연산자 사용 방법 2 (순서를 바꿔서도 가능)
print(2*"안녕하세요") # 안녕하세요안녕하세요
✏️ 문자열 연산자의 우선순위 : 반복 연산자 ( * ) 가 연결 연산자 ( + ) 보다 우선이다.
✔️ 대괄호 [ ] 안에 선택할 문자의 위치를 지정하며, 이 숫자를 인덱스(index)라고 한다.
✔️ 문자열의 위치는 무조건 0부터 시작한다. ( 제로 인덱스 유형 )
✔️ 양수와 음수 모두 가능하며, 음수로 입력할 경우 뒤에서 부터 접근할 수 있다.
# 양수 인덱스
print("안녕하세요"[0]) # 안
print("안녕하세요"[1]) # 녕
print("안녕하세요"[2]) # 하
print("안녕하세요"[3]) # 세
print("안녕하세요"[4]) # 요
# 음수 인덱스
print("안녕하세요"[-1]) # 요
print("안녕하세요"[-2]) # 세
print("안녕하세요"[-3]) # 하
print("안녕하세요"[-4]) # 녕
print("안녕하세요"[-0]) # 안
✏️슬라이싱 ( [ : ] )
✔️ 문자열의특정 범위를 선택할 때 사용하는 연산자이다.
✔️ 범위는 대괄호 안에 위치를 콜론 ( : ) 으로 구분해서 지정한다.
✔️ 파이썬은 범위 지정 시“마지막 숫자를 포함하지 않음”
💡 “문자열”[시작 인덱스 : 끝 인덱스 -1]
# 문자열 슬라이싱
# 파이썬은 범위 지정 시 마지막 숫자를 포함하지 않기 때문에, 1번째+2번째+3번째글자 까지만 출력
print("안녕하세요"[1:4]) #녕하세
print("안녕하세요"[0:2]) #안녕
# 대괄호 안에 넣는 범위 둘 중 하나를 생략 가능
# 마지막 인덱스를 생략하는 경우, 시작 인덱스 부터 가장 최대 위치 (마지막 글자) 까지 선택
print("안녕하세요"[1:]) # 녕하세요
# 시작 인덱스를 생략하는 경우, 처음부터 (마지막 인덱스 -1) 까지 선택
print("안녕하세요"[:3]) # 안녕하
✏️ 곱하기( * ), 나누기( / ) 가 우선이고, 더하기( + ) , 빼기( - ) 연산자가 그 다음으로 우선이다.
✏️ 같은 우선 순위를 가지는 연산자는 왼쪽에서 오른쪽으로 계산한다.
[1주차 기본 미션]
p.101 3~5번 실행 결과 쓰고 인증하기
나는 ebook으로 구매해서 공부하고 있기 때문에 캡쳐하여 아이패드로 실행 결과를 작성했다. (혹시 문제가 된다면 댓글 부탁 드립니다...)
☑️ 파이썬은 문자열의 위치를 0부터 계산하기 때문에 위 예제의 경우 0~4 까지의 인덱스를 선택할 수 있다. 이 범위를 넘는 인덱스 선택 시 인덱스 에러( IndexError) 가 발생한다.
☑️파이썬에서 문자열 범위를 선택할 때는 마지막 숫자를 포함하지 않는다. 따라서 위 예제처럼 [1:3] 선택 시 1번째~2번째 인덱스 값만 출력한다. 또한 마지막 인덱스를 생략하는 경우, 시작 인덱스(0번째) 부터 문자열의 끝까지 선택하며, 시작 인덱스를 생략하는 경우 처음부터 (마지막 인덱스-1) 까지 선택한다.