1. 파이썬 문법 [기초]
(1) 변수 선언과 자료형
1) 변수 선언
- 변수 만들기 :
변수이름 = 값
a = b
와 b = a
는 다르다
- 출력은
print()
사용
a = 3
print (a) # 3 출력
2) 숫자의 자료형
+
: 덧셈
-
: 뺄셈
*
: 곱셈
/
: 나눗셈
//
: 몫
%
: 나머지
**
: 거듭제곱
a = 7
b = 2
a+b # 9
a-b # 5
a*b # 14
a/b # 3.5
a+3*b # 13 (여러 연산을 한 줄에 할 경우 사칙연산의 순서!)
(a+3)*b # 20 (소괄호를 이용해서 먼저 계산할 부분을 표시)
3) Bool(Boolean) 자료형
4 > 2 # True 크다
5 < 1 # False 작다
6 >= 5 # True 크거나 같다
4 <= 4 # True 작거나 같다
3 == 5 # False 같다
4 != 7 # True 같지 않다
4) 예제
{주어진 값}
a = 24
b = 16
c = 26
{A. 풀이}
print((a+b+c)/3)
(2) 문자열 다루기
1) 문자열 기초
# 작은 따옴표 또는 큰 따옴표. 둘 다 같다.
a = "aa"
b = 'aa'
# 따옴표로 감싸지 않으면 변수이름을 뜻할 수 있어 구분해서 사용할 것.
a = 1
b = "a"
c = a
print(a, b, c) # 1 "a" 1
2) 문자열 연산
a = "Merry"
b = "Christmas"
print(a+b) # MerryChristmas
print(a+' '+b) # Merry Christmas
a = "2"
b = "7"
print(a+b) # 27
a = "3"
a + 5 # 문자열과 숫자형은 더할 수 없어서 에러!
print(len("abcde")) # 5
print(len("Hello, Sparta!")) # 14
print(len("안녕하세요.")) # 6
- 모든 알파벳 대문자/소문자 바꾸기
.upper() / .lower()
sentence = 'No pain, No gain'
print(sentence.upper()) # NO PAIN, NO GAIN
print(sentence.lower()) # no pain, no gain
- 특정 문자를 기준으로 문자열 나누기
.split()
# 이메일 주소에서 도메인 'gmail'만 추출하기
myemail = 'solrasido@gmail.com'
result = myemail.split('@') # ['solrasido','gmail.com'] (리스트 자료형)
result[0] # solrasido (리스트의 첫번째 요소)
result[1] # gmail.com (리스트의 두 번째 요소
result2 = result[1].split('.') # ['gmail','com']
result2[0] # gmail -> 우리가 알고 싶었던 것
result2[1] # com
# 한 줄로 한 번에!
myemail.split('@')[1].split('.')[0] # gmail
txt = '서울특별시-양천구-목동'
print(txt.replace('-', '>')) # '서울특별시>양천구>목동'
3) 인덱싱과 슬라이싱
- 인덱싱 : 문자열에서 한 글자 씩 부를 때 몇 번째인지 '인덱스'를 넣어 일부를 따로 떼어 부를 때 사용
f="abcdefghijklmnopqrstuvwxyz"
f[1] # b 파이썬은 숫자를 0부터 셉니다
f[4:15] # efghijklmno f[4]부터 f[15] 전까지, 총 15-4=11개!
f[8:] # ijklmnopqrstuvwxyz f[8]부터 끝까지, 앞의 8개 빼고!
f[:7] # abcdefg 시작부터 f[7] 전까지, 앞의 7개!
f[:] # abcdefghijklmnopqrstuvwxyz 처음부터 끝까지
4) 예제
- 문자열의 앞의 반만 출력하기 -
sparta
의 앞글자 3개 출력하기
{A. 풀이}
word = "sparta"
print(word[:3]) # spa
{주어진 값}
phone = "02-123-1234"
{A. 풀이}
print(phone.split('-')[0]) # 02 출력
(3) 리스트와 딕셔너리
1) 리스트(list)
a = [1, 5, 2] # [1, 5, 2]
b = [3, "a", 6, 1] # [3, "a", 6, 1]
c = [] # []
d = list() # []
e = [1, 2, 4, [2, 3, 4]] # [1, 2, 4, [2, 3, 4]]
a = [1, 5, 2]
print(len(a)) # 3
b = [1, 3, [2, 0], 1]
print(len(b)) # 4
a = [1, 3, 2, 4]
print(a[3]) # 4
print(a[1:3]) # [3, 2]
print(a[-1]) # 4 (맨 마지막 것)
a = [1, 2, [2, 3], 0]
print(a[2]) # [2, 3]
print(a[2][0]) # 2
a = [1, 2, 3]
a.append(5)
print(a) # [1, 2, 3, 5]
a.append([1, 2])
print(a) # [1, 2, 3, 5, [1, 2]]
# 더하기 연산과 비교!
a += [2, 7] # a = a + [2, 7]
print(a) # [1, 2, 3, 5, [1, 2], 2, 7]
a = [2, 5, 3]
a.sort()
print(a) # [2, 3, 5]
a.sort(reverse=True)
print(a) # [5, 3, 2]
# 있는지 확인 'in', 없는지 확인 'not in'
a = [2, 1, 4, "2", 6]
print(1 in a) # True
print("1" in a) # False
print(0 not in a) # True
2) 딕셔너리 (dictionary)
person = {"name":"Solrasido", "age": 27}
print(person["name"]) # Solrasido
a = {"one":1, "two":2}
# 빈 딕셔너리 만들기
a = {}
a = dict()
- 딕셔너리 요소에는 순서가 없기 때문에 인덱싱 불가
person = {"name":"Solrasido", "age": 27}
print(person[0]) # 0이라는 key가 없으므로 KeyError 발생!
person = {"name":"Solrasido", "age": 27}
person["name"] = "Robert"
print(person) # {'name': 'Robert', 'age': 27}
person["height"] = 177.2
print(person) # {'name': 'Robert', 'age': 27, 'height': 177.2}
- 딕셔너리 값에는 아무 자료형이나 사용 가능 (딕셔너리 안에 다른 딕셔너리 가능)
person = {"name":"Alice", "age": 16, "scores": {"math": 81, "science": 92, "Korean": 84}}
print(person["scores"]) # {'math': 81, 'science': 92, 'Korean': 84}
print(person["scores"]["science"]) # 92
- 딕셔너리 안에 해당
key
가 존재하는지 여부 알아보기 - in
person = {"name":"Solrasido", "age": 27}
print("name" in person) # True
print("email" in person) # False
print("phone" not in person) # True
3) 리스트와 딕셔너리 혼합
- 딕셔너리는 리스트 안에 쓰여 자료를 정리하는데 사용함
people = [{'name': 'solrasido', 'age': 27}, {'name': 'carry', 'age': 38}]
# people[0]['name']의 값은? 'solrasido'
# people[1]['name']의 값은? 'carry'
person = {'name': 'john', 'age': 7}
people.append(person) #요소 삽입
# people의 값은? [{'name':'solrasido','age':27}, {'name':'carry','age':38}, {'name':'john','age':7}]
# people[2]['name']의 값은? 'john'
4) 예제
- 딕셔너리에서 원하는 정보 찾기 - smith의 science점수를 출력해라
{주어진 값}
people = [
{'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
{'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
{'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
{'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]
{A. 풀이}
print(people[3]['score']['science']) # 90
(4) 조건문
1) if 문
- 조건을 만족(
True
)했을 때만 특정 코드를 실행하는 문법
money = 5000
if money > 3800: # True
print("택시 타자!")
# 파이썬에서는 포함된 구문을 들여쓰기로 구분하기 때문에 들여쓰기 확인
2) else와 elif
else
는 조건이 False
일때 실행되는 문법
money = 2000
if money > 3800: # True
print("택시 타자!")
else: # False
print("걸어가자...")
age = 27
if age < 20:
print("청소년입니다.")
elif age < 65:
print("성인입니다.")
else:
print("무료로 이용하세요!")
(5) 반복문
1) for 문
{1. print를 통한 출력}
print(0)
print(1)
print(2)
...
print(9)
{2. for문을 통한 출력}
for i in range(10):
print(i)
fruits = ['사과', '배', '감', '귤']
for fruit in fruits:
print(fruit)
2) for 문 - enumerate, break
- enumerate : 리스트 앞에
인덱스
를 붙여줌 (0 부터 시작)
fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']
for i, fruit in enumerate(fruits):
print(i,fruit)
# 결과
0 사과
1 배
2 감
3 귤
...
11 오렌지
fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']
for i, fruit in enumerate(fruits):
print(i, fruit)
if i == 4:
break
#결과
0 사과
1 배
2 감
3 귤
4 귤
3) 예제
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
{A. 풀이}
for num in num_list:
if num % 2 == 0:
print(num)
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
{A. 풀이}
count = 0
for num in num_list:
if num % 2 == 0:
count += 1
print(count)
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
{A. 풀이}
result = 0
for num in num_list:
result += num
print(result)
- 리스트 안에 있는 자연수 중 가장 큰 숫자 구하기
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
{A. 풀이}
max_value = 0
for num in num_list:
if num > max_value:
max_value = num
print(max_value)
(6) 함수
1) 기본 사용 방법
- 함수는 반복적으로 사용하는 코드에 이름을 붙여놓은 것
def hello():
print("안녕!")
hello()
- 조건문에 넣을 값을 바꿔가면서 결과를 확일 할 때 사용하면 편함
def bus_rate(age):
if age > 65:
print("무료로 이용하세요")
elif age > 20:
print("성인입니다.")
else:
print("청소년입니다")
bus_rate(27) # 성인입니다.
bus_rate(10) # 청소년입니다
bus_rate(72) # 무료로 이용하세요
2) 예제
- 주민등록번호를 입력 받아 성별을 출력하는 함수 만들기
{A. 풀이}
def check_gender(pin):
num = int(pin.split('-')[1][0])
if num % 2 == 0:
print('여성')
else:
print('남성')
my_pin = "221121-1012345"
check_gender(my_pin)
2. 파이썬 문법 [심화]
(1) 튜플, 집합
1) 튜플(Tuple)
리스트와 비슷하지만 불변
인 자료형. 순서 존재
a = (1,2,3)
print(a[0])
a = (1,2,3)
a[0] = 99
- 딕셔너리 대신 리스트와 튜플로
비슷하게
만들어 사용 할 때 쓰임
a_dict = [('bob','24'),('john','29'),('smith','30')]
2) 집합(Set)
- 말 그대로
집합
을 구현하는 방법. 중복이 제거
됨
a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]
a_set = set(a)
print(a_set)
# 결과
{1, 2, 3, 4, 5}
a = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']
print(a & b) # 교집합
print(a | b) # 합집합
print(a - b) # 차집합
3) 예제
- A가 들은 수업 중, B가 듣지 않은 수업을 찾아보기
{주어진 값}
student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']
{A. 풀이}
set_a = set(student_a)
set_b = set(student_b)
print(set_a-set_b)
(2) f-string
- 변수로 더 직관적인 문자열 만들기 (python 3.6버전 이상 가능)
{주어진 값}
scores = [
{'name':'영수','score':70},
{'name':'영희','score':65},
{'name':'기찬','score':75},
{'name':'희수','score':23},
{'name':'서경','score':99},
{'name':'미주','score':100},
{'name':'병태','score':32}
]
for s in scores:
name = s['name']
score = str(s['score'])
print(name,score)
for s in scores:
name = s['name']
score = str(s['score'])
print(name+'는 '+score+'점 입니다')
for s in scores:
name = s['name']
score = str(s['score'])
print(f'{name}은 {score}점입니다')
(3) 예외처리 (try-except)
1) 예제
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
for person in people:
if person['age'] > 20:
print (person['name'])
bobby
가 age
를 가지고 있지 않은 경우 try-except
사용하여 에러를 넘김
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby'}, # 에러 문장: age 없음
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
for person in people:
try:
if person['age'] > 20:
print (person['name'])
except:
name = person['name']
print(f'{name} - 에러입니다')
(4) 파일 불러오기
from main_func import *
say_hi()
def say_hi():
print('안녕!')
(5) 한줄의 마법
1) if 문 - 삼항연산자
num = 3
if num%2 == 0:
result = "짝수"
else:
result = "홀수"
print(f"{num}은 {result}입니다.")
num = 3
result = "짝수" if num%2 == 0 else "홀수"
print(f"{num}은 {result}입니다.")
# 사용 방법 : (참일 때 값) if (조건) else (거짓일 때 값)
2) for 문 - 한번에 쓰기
a_list
의 각 요소에 2를 곱한 새로운 리스트 생성
a_list = [1, 3, 2, 5, 1, 2]
b_list = []
for a in a_list:
b_list.append(a*2)
print(b_list)
a_list = [1, 3, 2, 5, 1, 2]
b_list = [a*2 for a in a_list]
print(b_list)
(6) map, filter, lambda식
1) map - 리스트의 모든 원소 조작
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
def check_adult(person):
if person['age'] > 20:
return '성인'
else:
return '청소년'
result = map(check_adult, people)
print(list(result))
def check_adult(person):
return '성인' if person['age'] > 20 else '청소년'
result = map(check_adult, people)
print(list(result))
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
# 사용방법
lambda 매개변수 : 표현식
# 예시
{일반식}
def hap(x, y):
return x + y
hap(10, 20) # 30
{lambda식}
(lambda x,y: x + y)(10, 20) # 30
2) filter - 리스트의 모든 원소 중 특별한 것만 뽑기
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
- map과 아주 유사한데, True인 것들만 뽑기(lambda식)
result = filter(lambda x: x['age'] > 20, people)
print(list(result))
[
{'name': 'carry', 'age': 38},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
(7) 함수 심화
1) 함수의 매개변수
- 함수에 인수를 넣을 때, 어떤 매개변수에 어떤 값을 넣을지 정할 수 있다. (순서 상관 없음)
def cal(a, b):
return a + 2 * b
print(cal(3, 5)) # 13
print(cal(5, 3)) # 11
print(cal(a=3, b=5)) # 13
print(cal(b=5, a=3)) # 13
- 특정 매개변수에 디폴트 값을 지정할 수 있다.
def cal2(a, b=3):
return a + 2 * b
print(cal2(4)) # 10 (2+2*4)
print(cal2(4, 2)) # 8 (4+2*2)
print(cal2(a=6)) # 12 (6+2*3)
print(cal2(a=1, b=7)) # 15 (1+2*7)
- 입력 값의 개수를 지정하지 않고 모두 받는 방법
- 여러 개의 인수를 하나의 매개변수로 받을 때
*args
사용
def call_names(*args):
for name in args:
print(f'{name}야 밥먹어라~')
call_names('철수','영수','희재')
# 결과
철수야 밥먹어라~
영수야 밥먹어라~
희재야 밥먹어라~
- 키워드 인수를 여러 개 받는 방법
**kwargs
(keyword arguments)
def get_kwargs(**kwargs):
print(kwargs)
get_kwargs(name='bob')
get_kwargs(name='john', age='27')
# 결과
{'name': 'bob'}
{'name': 'john', 'age': '27'}
(8) 클래스(Class)
- 사용 시기
- 게임 내에서 많은 몬스터들의 HP를 관리 해야하는 상황
방법 1 -> 리스트의 순서를 잘 지켜서 각 몬스터들의 hp를 잘 적어둔다
방법 2 -> 몬스터마다 각자의 hp를 가질 수 있게 한다. (클래스 사용)
- 방법 2
class Monster():
hp = 100
alive = True
def damage(self, attack):
self.hp = self.hp - attack
if self.hp < 0:
self.alive = False
def status_check(self):
if self.alive:
print('살아있다')
else:
print('죽었다')
m = Monster()
m.damage(120)
m2 = Monster()
m2.damage(90)
m.status_check() # 죽었다
m2.status_check() # 살아있다