본문 바로가기
파이썬 기초

파이썬 기초

by 나연하야 2023. 5. 6.

 

▶ 이전에 '데이터 과학을 위한 파이썬 프로그래밍'으로 파이썬 수업을 들었는데 최근 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). 데이터 과학을 위한 파이썬 프로그래밍. 한빛아카데미.