▶ 이전에 '데이터 과학을 위한 파이썬 프로그래밍'으로 파이썬 수업을 들었는데 최근 R을 많이 사용하다보니 파이썬 코드가 익숙하지 않아 '점프 투 파이썬'과 '데이터 과학을 위한 파이썬 프로그래밍'을 보면서 공부하였음
02-2. 문자열 자료형(점프 투 파이썬)
문자열 포매팅
"현재 온도는 18도입니다."
시간이 지나서 20도가 되면 다음 문장을 출력한다.
"현재 온도는 20도입니다."
위 두 문자열은 모두 같은데 20이라는 숫자와 18이라는 숫자만 다르며, 이와 같이 문자열 안의 특정한 값을 바꿔야 할 경우가 있을 때 이것을 가능하게 해주는 것이 바로 문자열 포매팅 기법임
예시) 정수를 대입하고 싶을 때는 %d(소수를 대입하고 싶을 떄는 %f), 문자를 대입하고 싶을 때는 %s 사용
>>> # 숫자 바로 대입
>>> "I eat %d apples."%3
'I eat 3 apples.'
# 문자 바로 대입
>>> "I eat %s apples."%"five"
'I eat five apples.'
>>> # 숫자 값을 나타내는 변수로 대입
>>> number = 3
>>> "I eat %d apples."%number
'I eat 3 apples.'
>>> # 2개 이상의 값 넣기
>>> number = 10
>>> day = "three"
>>> "I ate %d apples. so I was sick for %s days." %(number, day)
'I ate 10 apples. so I was sick for three days.'
# 소수점 표현하기
>>> "%0.4f"%3.42134234
'3.4213'
format 함수를 사용한 포매팅
- 문자열의 format함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있음
# 소수잠 표현
>>> "%0.4f"%3.42134234
'3.4213'
>>> # 숫자 바로 대입
>>> "I eat {0} apples".format(3)
'I eat 3 apples'
>>> # 문자열 바로 대입
>>> "I eat {0} apples".format("five")
'I eat five apples'
>>> # 숫자 값을 나타내는 변수로 대입
>>> number = 3
>>> "I eat {0} apples".format(number)
'I eat 3 apples'
>>> # 2개 이상의 값 넣기
>>> number = 3
>>> day = "two"
>>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
'I ate 3 apples. so I was sick for two days.'
>>> # 이름으로 넣기
>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
>>> # f문자열 포매팅
>>> name = '홍길동'
>>> age = 30
>>> f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
06-3. 문자열 서식 지정(데이터 과학을 위한 파이썬 프로그래밍)
서식 지정의 개념
- print() 함수를 사용하다 보면 어떠 형식에 맞추어 결과를 출력해야 할 일이 발생함
- 엑셀을 사용할 때도 세 자리 숫자 단위 띄어쓰기, %출력 등 다양한 형식에 맞추어 출력할 일이 생기는데 이를 서식 지정이라고 함
% 서식
- %서식은 '%자료형%(값)'으로 표현할 수 있음
>>> print("나는 %s를 %d원에 샀다"%("커피", 5000))
나는 커피를 5000원에 샀다
format() 함수
- format()은 "{자료형}".format(인수)로 표현하여 활용할 수 있음
- %서식과 비교해보면 자료형을 바로 지정해 주지 않고 순서대로 변수가 할당된다는 장점이 있음
>>> food="커피"
>>> price=5000
>>> print("나는 {}를 {}원에 샀다".format(food, price))
나는 커피를 5000원에 샀다
>>> food="커피"
>>> price=5000.00
>>> print("나는 {}를 {.2f}원에 샀다".format(food, price))
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
print("나는 {}를 {.2f}원에 샀다".format(food, price))
AttributeError: 'float' object has no attribute '2f'
>>> print("나는 {}를 {:.2f}원에 샀다".format(food, price))
나는 커피를 5000.00원에 샀다
----------------------------------------------------------------------------------------------------------------------------------------------
02-8. 자료형의 값을 저장하는 공간, 변수(점프 투 파이썬)
변수란?
- a=[1,2,3]이라고 하면 [1,2,3] 값을 가지는 리스트 데이터가 자동으로 메모리에 생성되고 변수 a는 [1,2,3] 리스트가 저장된 메모리의 주소를 가리키게 됨
----------------------------------------------------------------------------------------------------------------------------------------------
04-1. 함수(점프 투 파이썬)
입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?
입력값이 여러 개일 때 그 입력값을 모두 더해 주는 함수를 생각해보자. 하지만 몇 개가 입력될지 모를 떄는 어떻게 해야 할까?
def add_many(*args):
result = 0
for i in args:
result = result+i
return result
result = add_many(1,2,3)
print(result)
6
result = add_many(1,2,3,4,5,6,7,8,9,10)
print(result)
55
위에서 만든 add_many 함수는 입력값이 몇 개이든 상관이 없다.
*args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 주기 때문
만약 add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1,2,3)이 됨
args는 인수를 뜻하는 영어 단어 arguments의 약자이기 때문에 관례적으로 자주 사용
키워드 매개변수 kwargs
키워드 매개변수를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙임
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(name='foo', age=3)
{'name': 'foo', 'age': 3}
09-3. 별표의 활용(데이터 과학을 위한 파이썬 프로그래밍)
- 별표는 보통 곱하기 기호를 뜻하지만 함수의 가변 인수(variable length arguments)를 사용할 때도 변수명 앞에 별표를 붙임
>>> def asterisk_test(a, *args):
print(a, args)
print(type(a))
print(type(args))
>>> asterisk_test(1, 2, 3, 4, 5)
1 (2, 3, 4, 5)
<class 'int'>
<class 'tuple'>
>>> def asterisk_test(a, **kargs):
print(a, kargs)
print(type(a))
print(type(kargs))
>>> asterisk_test(a=1, b=2, c=3, d=4, e=5)
1 {'d': 4, 'e': 5, 'c': 3, 'b': 2}
<class 'int'>
<class 'dict'>
>>> a, b, c = ([1, 2], [3, 4], [5, 6])
>>> print(a, b, c)
[1, 2] [3, 4] [5, 6]
>>> data = ([1, 2], [3, 4], [5, 6])
>>> print(*data)
[1, 2] [3, 4] [5, 6]
----------------------------------------------------------------------------------------------------------------------------------------------
09-1. 람다 함수(데이터 과학을 위한 파이썬 프로그래밍)
- 람다(lambda) 함수는 함수의 이름 없이, 함수처럼 사용할 수 있는 익명의 함수를 말함
- 람다 함수는 별도의 def나 return을 작성하지 않아도 됨
>>> f=lambda x, y:x+y
>>> print(f(1,4))
----------------------------------------------------------------------------------------------------------------------------------------------
05-1. 클래스(점프 투 파이썬)
클래스와 객체
클래스 -> 과자 틀
객체 -> 과자 틀에 의해서 만들어진 과자
- 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있음
class Cookie:
pass
a = Cookie()
b = Cookie()
- 클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지함
>>> class Cal:
def set(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
>>> a=Cal()
>>> b=Cal()
>>>
>>> a.set(2,3)
>>> a.add()
5
>>> a.set(5,6)
>>> a.add()
11
>>> b.set(2,3)
>>> b.add()
5
>>> a.add()
11
생성자(Constructor)
>>> c=Cal()
>>> c.add()
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
c.add()
File "<pyshell#9>", line 6, in add
result = self.first + self.second
AttributeError: 'Cal' object has no attribute 'first'
>>>
- 이와 같이 오류가 발생한 이유는 set 메서드를 수행해야 객체 c의 객체변수 first와 second가 생성되기 때문
- 이렇게 객체에 first, second와 같은 초깃값을 설정해야 할 필요가 있을 때는 set과 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법
- 생성자란 객체가 생성될 때 자동으로 호출되는 매서드를 의미
- 파이썬 메서드 이름으로 __int__를 사용하면 이 메서드는 생성자가 됨
>>> class Cal:
def __init__(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
>>> a=Cal(4,2)
>>> a.first
4
>>> a.second
2
>>> a.add()
6
클래스의 상속
- 상속이란 "물려받다"라는 뜻으로, 클래스에도 이 개념을 적용할 수 있음
- 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것임
>>> class MoreCal(Cal):
def pow(self):
result = self.first**self.second
return result
>>> a=MoreCal(2, 4)
>>> a.pow()
16
10-1. 객체 지향 프로그래밍의 이해(데이터 과학을 위한 파이썬 프로그래밍)
- 객체 지향 프로그래밍은 다른 사람이 만든 코드를 재사용하고 싶을 떄 사용하는 대표적인 방법임
- 함수처럼 어떤 기능을 함수 코드에 묶어 두는 것이 아니라, 그런 기능을 묶은 하나의 단일 프로그램을 객체라고 하는 코드에 넣어 다른 프로그래머가 재사용할 수 있도록 하는 것임
객체, 속성, 행동
개념 | 설명 | 예시 |
객체 | 실생활에 존재하는 실제적인 물건 또는 개념 | 심판, 선수, 팀 |
속성 | 객체가 가지고 있는 변수 | 선수의 이름, 포지션, 소속팀 |
행동 | 객체가 실제로 작동할 수 있는 함수, 메서드 | 공을 차다, 패스하다 |
인스턴스 사용하기
- 인스턴스는 클래스에서 실제적인 데이터가 입력되어 사용할 수 있는 형태의 객체를 뜻함
- 붕어빵틀은 클래스, 인스턴스는 여러 가지 재료가 들어간 붕어빵 자체라고 볼 수 있음
- 아래의 코드에서 인스턴스 내의 값을 호출하여 사용하기 위해서는 jinhyun.back_number을 사용할 수 있음
-> 여기서 중요한 것은 인스턴스가 생성된 후에는 해당 인스턴스의 이름으로 값을 할당하거나 함수를 부르면 되지만, 클래스 내에서는 self로 호출됨!
-> 즉, 생성된 인스턴스인 jinhyun과 클래스 내 self가 같은 역할을 하는 것임!
>>> class SoccerPlayer(object):
def __init__(self, name, position, back_number): # class에서 사용할 변수를 정의하는 함수(:에서 에러 발생ㅠㅠ)
self.name = name # self는 생성된 인스턴스를 지정하는 변수(생성된 인스턴스에 name, position, back_number 할당)
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print("선수의 등번호를 변경한다: From %d to %d"%(self.back_number, new_number))
self.back_number = new_number
def __str__(self): # __str__함수로 선언된 부분이 print() 함수를 사용하면 반환되는 함수
return "Hello, My name is %s. I play in %s in center."%(self.name, self.position)
# SoccerPlayer를 사용하는 instance 코드
>>> jinhyun=SoccerPlayer("Jinhyun", "MF", 10)
>>> jinhyun.back_number
10
10-4. 객체 지향 프로그래밍의 특징(데이터 과학을 위한 파이썬 프로그래밍)
상속
- 아래의 코드에서 먼저 Person 클래스를 생성하였으며, 다음으로 Korean 클래스를 만들어서 Person 클래스를 상속받게 하였음
>>> class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
>>> class Korean(Person):
pass
>>> first_korean = Korean("Sungchul", 35)
>>> print(first_korean.name)
Sungchul
>>> class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def about_me(self):
print("저의 이름은 %s이고, 나이는 %d살입니다."%(self.name, self.age))
>>> class Employee(Person): # 부모 클래스 Person으로부터 상속
def __init__(self,name,age,salary,hire_date):
super().__init__(name,age) # 부모 객체 사용
self.salary = salary # 속성값 추가
self.hire_date=hire_date
def do_work(self): # 새로운 메서드 추가
print("열심히 일을 한다.")
def about_me(self): # 부모 클래스 함수 재정의
super().about_me() # 부모 클래스 함수 사용
print("제 급여는 {}원이고, 제 입사일은 {}입니다.".format(self.salary, self.hire_date))
>>> jun=Employee("Jun",20,50000000,"3월 19일")
>>> jun.about_me()
저의 이름은 Jun이고, 나이는 20살입니다.
제 급여는 50000000원이고, 제 입사일은 3월 19일입니다.
----------------------------------------------------------------------------------------------------------------------------------------------
05-2. 모듈(점프 투 파이썬)
- 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일
- import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있음
# import 사용법
inport 모듈이름
- mod1.add, mod1.sub처럼 쓰지 않고 add, sub처럼 모듈 이름없이 함수 이름만 쓰고 싶은 경우 다음과 같이 사용하면 됨
>>> from mod1 import add
>>> add(3, 4)
7
from mod1 import add, sub
from mod1 import *
if__name__=="__main__"의 의미
- if__name__=="__main__"을 사용하면 직접 이 파일을 실행했을 때는 __name__=="__main__"이 참이 되어 if문 다음 문장이 수행됨
- 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__=="__main__"이 거짓이 되어 if문 다음 문장이 수행되지 않음
def add(a, b):
return a+b
def sub(a, b):
return a-b
if __name__ == "__main__":
print(add(1, 4))
print(sub(4, 2))
__name__변수란?
- 파이썬의 __name__변수는 파이썬 내부적으로 사용한는 특별한 변수 이름
- 만약 직접 파이썬 파일을 실행할 경우 __name__변수에는 __main__값이 저장됨
- 하지만 파이썬 셸이나 다른 파이썬 모듈에서 mod1을 import 할 경에는 __name__변수에는 mod1이 저장됨
----------------------------------------------------------------------------------------------------------------------------------------------
05-4. 내장함수(점프 투 파이썬)
enumerate
- enumerate는 "열거하다"라는 뜻으로 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴함
for i, name in enumerate(['body', 'foo', 'bar']):
print(i, name)
0 body
1 foo
2 bar
- 위 예제와 같이 enumerate를 for문과 함께 사용하면 자료형의 현재 순서와 그 값을 쉽게 알 수 있음
- 객체가 현재 어느 위치에 있는지 알려주는 인덱스 값이 필요할 때 enumerate함수를 사용하면 유용함
출처: 박응용(2023). 점프 투 파이썬. https://wikidocs.net/book/1
최성철(2019). 데이터 과학을 위한 파이썬 프로그래밍. 한빛아카데미.
'파이썬 기초' 카테고리의 다른 글
[데이터 과학을 위한 파이썬 프로그래밍] 파이썬 기초 (0) | 2023.06.02 |
---|---|
[파이썬] main, argparse (0) | 2023.05.08 |