이전까지 배워왔던 나의 언어는 C와 자바였다. 파이썬은 IT 학원 다닐 때 잠깐 배웠던 것이 끝이였고 처음엔 비슷할 것이라고 자만하였다. 하지만 공부할수록 비슷하지만 파이썬만이 가지고 있는 부분도 있었고 나는 내 자신을 반성하고 다시 공부해보기로 마음먹었다. 그럼 시작하자.
일지를 작성하기 전, 나는 반복문까지의 문법은 어느 정도 알고 있는 수준이기 때문에 이는 적지 않겠다.
컴퓨터에서 함수는 무언가 만들어놓은 객체라고 생각하면 된다. 예를 들어, 계산기를 생각하면 된다. 1을 누르고 +를 누르고 다시 1을 누르면 2가 나오는 것처럼 미리 만들어둔 것이라고 생각하자.
def 함수명():
print("안녕!")
print("또 만나요!")
함수명()
상세한 이론보다는 함수는 예시를 가지고 다루고 넘어가도록 하자. 주민등록번호를 입력받아서 성별을 출력하는 함수를 만들어보자.
def check(pin):
num = int(pin.split('-'[1][0]))
if num % 2 == 1:
print('남자입니다.')
else:
print('여자입니다.')
pin = '961121-1234567'
check(pin)
리스트와 비슷하다. 하지만 리스트는 값을 수정할 수 있고 튜플은 값을 수정할 수 없다는 점이다. 리스트와는 크게 다른 것이 없기 때문에 넘어가도록 하자.
우리가 알고 있는 그 집합이다. 다만 집합은 중복이 사용되지 않는 장점이 있다.
test = [1, 3, 4, 2, 1, 3, 4, 3, 6, 7, 8, 9]
test_set = set(test)
print(test_set)
실행시키면 중복이 없어짐을 알 수 있다.
조금 더 문자열을 직관적으로 출력해준다. 처음엔 무슨 소리인지 몰랐었는데 예제를 통해 알게 되었다. 예제를 보자.
scores = [
{'name':'영수','score':70},
{'name':'영희','score':65},
{'name':'기찬','score':75},
{'name':'희수','score':23},
{'name':'서경','score':99},
{'name':'미주','score':100},
{'name':'병태','score':32}
]
scores라는 딕셔너리가 존재한다. 여기서 각자 name과 score에 해당하는 사람의 점수에 대해 출력하는 메소드를 만들겠다.
![]
for s in scores:
name = s['name']
score = s['score']
print(name + '의 점수는 ' + str(score) + '점입니다.')
이런 방법도 있지만 우리가 하려는 건 f-String 방식을 사용하기 위함이기 때문에 조금 다르게 코드를 짜보자.
![]
for s in scores:
name = s['name']
score = s['score']
print(f'{name}의 점수는 {score}점입니다.')
여기서 한가지 방식이 더 있는데 이런 방식도 있다는 걸 알아두자. 근데 난 이 방법이 제일 좋은 거 같다.
![]
for s in scores:
name = s['name']
score = s['score']
print('{0}의 점수는 {1}점입니다.'.format(name, score))
예외처리는 말 그대로 정말 예외의 상황을 처리하는 것이다. 에러가 발생했을 때 대처하는 방식인데 이 부분은 사실 좀 주의해야 한다. C언어의 goto문처럼 강제적인 부분이 심어지기 때문이다.
파이썬은 다른 언어와 다르게 한 줄로 처리하는 부분이 있다. 이 부분은 예시를 보면서 넘어가자.
if num % 2 == 0:
result = '짝수'
else:
result = 홀수
우리가 흔히 알고 있는 제어문이다. 이를 조금 더 간결하게 쓰면 다음과 같다.
"홀수" if num % 2 == 1 else "짝수"
이 부분을 생각할 때 (참의 값) > if > 조건문 > (거짓의 값) 순서로 생각하면 된다.
이 부분은 사실 조금 어렵다고 생각한다. 그래도 아는 것이 곧 지식이기 때문에 공부하도록 하자. 아래와 같은 코드를 입력해보자.
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))
사실 이 부분은 어려워서 구글링을 했다. 구글링의 결과는 다음과 같다.
map(함수, iterable 객체)
iterable 객체? 이게 뭐지하고 역시나 구글링했다.
문자열 등을 반복가능하게 해주는 객체라고 한다. 내 생각에는 현재 people이라는 변수가 딕셔너리로 구성되어 있기 때문에 map이 사용 가능하지 않을까? 라는 생각이 든다.
따라서 나는 다음과 같은 결과를 얻을 수 있었다.
이 부분에서 result 값을 list로 받아야지만 값이 올바르게 출력된다는 것을 기억하자.
람다 함수는 간단한 함수를 만들 때 사용한다. 함수에서 a, b를 파라미터로 받고 이들의 합을 return시킬 때 lambda a, b : a+b 같이 함수를 쓰지 않아도 함수로 처리할 수 있다. 위의 코드에 대해 lambda 함수를 사용해보자.
result = map(lambda x: ('성인') if x['age'] > 20 else '청소년', people)
print(list(result))
필터 함수는 맵 함수와 유사하지만 맵은 모든 원소를 반복해서 출력하지만 필터는 참인 값만 출력한다.
result = map(lambda x: x['age'] > 20 , people)
print(list(result))
함수는 원래 파라미터를 받고 사용하는데 파라미터에 *args를 넣게 되면 갯수에 구애받지 않고 모두 받을 수 있다.
**kwargs를 사용하면 키워드 인수를 여러 개 받을 수 있다.
만약 1이라는 숫자를 계속 출력해야 한다면 어떨까? 아마 필요한 부분마다 print('1')이 생성될 것이다. 이런 불필요한 요소를 줄이기 위해 클래스라는 방식을 사용한다. 간단하게 스타크래프트 유닛 생성의 예시를 들어보겠다.
나는 마린이라는 유닛을 뽑을 것이고 이 유닛의 공격력은 10이다. 이에 해당하는 코드는 무엇일까?
class Unit:
def __init__(self, name, damage):
self.name = name
self.damage = damage
일단 마린이라는 이름을 받는 name, 공격력을 받는 damage를 받는다.
self는 현재 객체를 의미한다고 생각한다. Unit.name 정도로 생각하자. __init__은 생성자로써 클래스를 선언할 때 일종의 약속이라고 생각하면 된다.
유닛을 생성하는 함수를 구성해보겠다.
def create_unit(self):
print('{0} 이 생성되었습니다. [공격력 : {1}]'.format(self.name, self.damage)
이제 이것을 실행해보자.
Marine = Unit('마린', 10)
Marine.create_unit()
실행하면 마린이 생성되었습니다. [공격력 : 10]이 출력될 것이다. 이처럼 필요할 때마다 가져가다 쓰는 것을 클래스라고 한다.
추가로 파이썬을 공부하는 것은 이 주소를 확인하자.