[2조:ACE] Python 스터디 #4
2조 - 강수환 고정윤 문하진 박무준 최정우 최혜윤
I. 05-1 클래스
by 최정우
클래스는 파이썬에서 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. 클래스는 데이터와 이를 조작하는 함수들을 묶어서 객체(object)를 생성하는 틀 또는 설계도와 같다고 할 수 있습니다.
여기서 '객체'란 클래스에 정의된 속성과 메소드를 실제로 가지는 실체입니다. 클래스를 기반으로 메모리에 할당되며, 이를 통해 프로그램 내에서 사용됩니다.
클래스 기본 구조
class MyClass:
def __init__(self, attribute1, attribute2):
self.attribute1 = attribute1
self.attribute2 = attribute2
def method1(self):
print(self.attribute1)
def method2(self, parameter):
return self.attribute2 + parameter
클래스의 기본 구조에서 MyClass는 클래스 이름이며 __init__함수를 통해 attribute1과 attribute2 두개의 속성을 초기화합니다. 또한 method1과 method2라는 두개의 함수를 정의하여 클래스의 행동을 설명합니다. self 키워드는 클래스 객체 자신을 참조하라는데 사용되며 이를 통해 객체 속성에 접근하거나 다른 함수를 호출할 수 있습니다.
생성자
파이썬에서 생성자는 클래스의 객체이며 즉 객체를 생성할 때 자동으로 호출되는 함수입니다. 생성자는 객체가 생성될 때 초기화 작업을 수행하는 데 주로 사용됩니다. 보통 '__init__' 함수를 사용하여 생성자를 정의합니다.
예제
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def show_info(self):
print(f"Name: {self.name}, Age: {self.age}")
person1 = Person("Code", 3)
person1.show_info()
위에 예제에서는 Person이라는 클래스가 name과 age 두개의 속성을 가지고 있습니다. 이 두 속성은 객체가 생성될 때 '__init__' 함수를 통해 초기화됩니다. 객체 person1이 생성될때 person1 = Person("Code", 3)에 의해 init함수가 호출되고 이 함수 내에서 self.name과 self.age가 각각 Code와 3으로 초기화 됩니다.
매서드 오버라이딩
메서드 오버라이딩은 상속 관계에 있는 클래스 간에 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 사용하는 기능을 말합니다. 이 기능은 객체 지향 프로그래밍에서 중요한 부분입니다.
이것의 주요 목적은 자식 클래스가 부모 클래스의 메서드를 자신의 상황에 맞게 변경해서 사용할 수 있도록 한느 것 입니다. 이를 통해 코드의 재사용성을 높이고, 유지 보수를 용이하게 합니다.
예제
class Bird(Animal):
def speak(self):
super().speak()
print("And a bird says: Tweet!")
bird = Bird()
bird.speak()
Bird 클래스는 상속받은 Animal 클래스의 speak 함수를 확장하여 부모 클래스의 메세지와 함께 And a bird says: Tweet!을 출력하는 오버라이딩된 함수를 정의합니다.
클래스 변수
클래스 변수는 클래스 정의 내에서 선언 되고 클래스 자체에 속하는 변수를 의미합니다. 클래스 변수는 해당 클래스의 모든 객체가 공유하는 데이터를 저장하기 위해 사용되며 이는 클래스 내부에서 공통적인 값을 유지해야 할 때 유용합니다.
예를 들어 어떤 클래스가 생성된 객체의 수를 추적하고자 할 때 클래스 변수를 사용할 수 있습니다. 모든 객체가 이 변수에 접근하고 수정할 수 있기 때문에, 어떤 객체가 생성되거나 소멸될 때마다 해당 변수를 업데이트하여 총 객체 수를 정확하게 유지할 수 있습니다.
class Sale:
total_sales = 0
def __init__(self, amount):
self.amount = amount
Sale.total_sales += amount
sale1 = Sale(100)
sale2 = Sale(200)
sale3 = Sale(300)
print(f"Total sales amount: {Sale.total_sales} USD")
이 예제에서는 Sale 클래스를 정의하고 각 판매 거래마다 객체를 생성합니다. 객체가 생성될 때, amount가 클래스 변수인 total_sales에 추가됩니다. 이렇게 함으로써 total_sales는 모든 Sale 객체에 의해 공유되며 총 판매액을 추적하는 데 사용됩니다.
II. 05-2 모듈
by 강수환
모듈이란? 함수나 변수 또는 클라스를 모아 높은 파이썬 파일로, 다른 파이썬 프로그램에서 불러와 사용할 수 있는 파이썬 파일입니다.
모듈은 지금까지 만든 파이썬 파일과 같이 텍스트로 이루어진 코드 모음일 뿐이다.
모듈을 사용하고 싶다면 import 모듈_이름 입력하면 그 후부터 사용할 수 있습니다. 이때 일부 함수만 사용하고 싶다면 for 모듈_이름 import 모듈_함수 와 같이 입력하면 됩니다.
if __name__=="__main__" 의 의미에 대해서 알아보겠습니다. 이게 필요한 이유가 모듈에 print함수가 있어서 출력을 자꾸 표시하려고 하기 때문입니다. 모듈에 print가 없다면 필요가 없는데 있다면 import 모듈__이름 을 했을 때 print의 결과가 출력되기 때문에 if __name__=="__main__" 를 써서 import를 사용했을 때는 print가 실행되지 않게 막는 것입니다.
sys 모듈은 파이썬을 설치할 때 함께 설치되는 라이브러리 모듈이다. 이 sys 모듈을 사용하면 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.
>>> sys.path
sys.path는 파이썬 라이브러리가 설치되어 있는 디렉터리 목록을 보여 sys.path.append 사용하기
먼저 파이썬 셸을 실행한 후 sys 모듈을 불러온다.
C:\doit>python
>>> import sys
sys 모듈은 파이썬을 설치할 때 함께 설치되는 라이브러리 모듈이다. 이 sys 모듈을 사용하면 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.
다음과 같이 입력해 보자.
>>> sys.path
['', 'C:\\Windows\\SYSTEM32\\python311.zip', 'c:\\Python311\\DLLs',
'c:\\Python311\\lib', 'c:\\Python311', 'c:\\Python311\\lib\\site-packages']
sys.path는 파이썬 라이브러리가 설치되어 있는 디렉터리를 보여 준다. 이 디렉터리 안에 저장된 파이썬 모듈은 모듈이 저장된 디렉터리로 이동할 필요 없이 바로 불러 사용할 수 있다.
그렇다면 sys.path에 C:\doit\mymod 디렉터리를 추가하면 mymod 디렉터리에 저장된 파이썬 모듈은 아무 곳에서나 불러 사용할 있다.
III. 05-3 패키지
파이썬에서 패키지(packages)란 관련 있는 모듈의 집합을 말한다. 패키지는 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해 준다.
파이썬에서 모듈은 하나의 .py 파일이다.
파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진다. 예를 들면
game/
__init__.py
sound/
__init__.py
echo.py
wav.py
graphic/
__init__.py
screen.py
render.py
play/
__init__.py
run.py
test.py
간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다. 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.
사용하는 모듈이 많다면 패키지로 이용하는게 훨씬 유리하다고 할 수 있다
IV. 05-4 예외처리
by 문하진
1. try-except문
try 블록 수행 중 오류가 발생하면 except 블록이 수행되고 try 블록에서 오류가 발생하지 않으면 except 블록은 수행되지 않는다.
1) try-except만 쓰기
오류의 종류에 상관없이 오류가 발생하면 except 블록을 수행함
try:
...
except:
...
2) 발생 오류만 포함한 except문
오류 발생 시 except 문에 미리 정해 놓은 오류와 동일한 오류일 경우에만 except 블록을 수행함
try:
...
except 발생오류:
...
3) 발생 오류와 오류 변수까지 포함한 except문
2번째 경우에서 오류의 내용까지 알고 싶을 때 사용함
try:
...
except 발생오류 as 오류변수:
...
2. try-finally 문
finally 절은 try 문 수행 도중 예외 발생 여부 상관없이 항상 수행되며 사용한 리소스를 close할 때 사용함
3. 여러 개의 오류 처리
try 문 안에서 여러 개의 오류를 처리하려면 다음과 같이 한다. except (발생오류1, 발생오류2) 이렇게 함께 처리할 수도 있다.
try:
...
except: 발생오류1:
...
except 발생오류2:
...
4. try-else문
try문 수행 중 오류가 발생하면 except절, 오류가 발생하지 않으면 else절이 수행됨
try:
...
except [발생오류[as 오류변수]]:
...
else:
...
5. 오류 회피하기
특정 오류가 발생할 경우 pass를 사용하여 오류를 회피함
6. 오류 발생시키기
오류를 일부러 발생시켜야 할 때 raise 명령어를 사용하여 오류를 강제로 발생시킬 수 있음
7. 예외 만들기
특수한 영우에만 예외 처리를 하기 위해 종종 예외를 만듦, 예외는 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있음
class MyError(Exception):
pass
V. 05-5 내장함수
by 최혜윤
<파이썬 내장 함수는 파이썬 모듈과 달리 import가 필요하지 않아 아무런 설정 없이 바로 사용 가능.>
abs - 어떤 숫자를 입력받았을 때 그 숫자의 절댓값을 리턴하는 함수
>>> abs(3)
3
>>> abs(-3)
3
>>> abs(-1, 2)
1, 2
all - 반복 가능한 데이터 x를 입력값으로 받으며 x의 요소가 모두 참이면 true, 거짓이 하나라도 있으면 false를 리턴함.
>>> all ([1, 2, 3])
True
리스트 1, 2, 3은 모든 요소가 참이므로 true를 리턴함.
>>> all ([1, 2, 3, 0])
False
요소 0은 거짓이므로 false를 리턴함.
*all ([]) 처럼 입력 인수가 빈 값인 경우에는 true를 리턴함.
any(x)는 반복 가능한 데이터 x를 입력으로 받아 x의 요소 중 하나라도 참이 있으면 true를 리턴하고 x가 모두 거짓일 때만 false를 리턴함.
Chr(i)는유니코드 숫자 값을 입력받아 그 코드에 해당하는 문자를 리턴하는 함수.
dir은 객체가 지닌 변수나 함수를 보여 주는 함수.
divmod (a, b)는 2개의 숫자 a,b를 입력으로 받는다. 그리고 a를 b로 나눈 몫과 나머지를 튜플로 리턴함.
>>> divmod(7, 3)
(2, 1)
Enumerate 는 순서가 있는 데이터를 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴함.
Eval - 문자열로 구성된 표현식을 입력으로 받아 해당 문자열을 실행한 결괏값을 리턴하는 함수.
filter - 첫 번째 인수로 함수, 두 번째 인수로 그 함수에 차례로 들어갈 반복 가능한 데이터를 받음. 반복 가능한 데이터의 요소 순서대로 함수를 호출했을 때 리턴값이 참인 것만 묵어리턴함.
그 외에도 hex, id, input, int, isinstance, len, list, map, max, min, oct, open, ord, pow, range, round, sorted, str, sum, tuple, type, zip함수가 있다.
그 중에서도 range 함수를 설명하고자 한다.
이 함수는 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 리턴한다.
1. 인수가 하나일 경우 (시작 숫자를 지정해주지 않으면 0부터 시작)
>>> list(range(5))
[0, 1, 2, 3, 4]
2. 인수가 2개일 경우 (입력으로 주어지는 2개의 인수는 시작 숫자와 끝 숫자를 나타낸다. 끝 숫자는 해당 범위에 포함되지 않음.
>>> list(range(5, 10))
[0, 1, 2, 3, 4]
3. 인수가 3개일 경우 (세 번째 인수는 숫자 사이의 거리를 말함.
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
VI. 05-6 표준 라이브러리
by 박무준
이번주 다룰 주제는 "표준 라이브러리"다.
라이브러리에 대해 배우는 것은 파이썬 인생에 '날개'를 다는 작업이라고도 불린다.
기존에 파이썬이 구현하지 못하던 것을 라이브러리에서 "import"해옴으로 인해 다양성이 늘어나게 된다.
파이썬 인생 1달이 가까이 되가는 지금, 많이 사용할 것 같은 유용한 라이브러리를 소개해볼까 한다.
1. datetime.date
날짜 차이를 쉽게 구할 수 있으며 day.weekday()를 이용하면 요일도 단번에 알 수 있다. 캘린더나 날씨예보와 같이 날짜가 중요한 코딩에 사용할 수 있을 듯 보인다.
import datetime
day1 = datetime.date(2021,3,4)
day2 = datetime.date(2024,2,18)
diff = day2 - day1
diff.days
1081
2. time
time 라이브러리는 활용성이 크다. 그러니 꼭 익히길 바란다.
쉽게는 현재시각을 알 수 있고 코딩에 사용할 때는 몇초동안 정지와 같은 것을 표현할 때 유용하게 쓰인다.
3. random
random는 이번 과제였던 구구단 게임을 만드는 데에 핵심이 되는 라이브러리이다.
동시에 random을 지난 후 구구단 문제를 틀렸을 경우 random값을 고정하고 싶어서 추가적으로 random.seed()와 같은 것도 활용해봤지만 이상하게 2번째부터 고정이 되었다. 이 문제를 해결한다면 이 밑에 추가적으로 적을 예정이다.
사용하는 방법을 아래와 같다.
import
random.randint(1, 10)
혹은
from random import choice
random_choice=choice(range(1,10))
4. json
아직 써보진 않았지만 어디선가 많이 들어본 라이브러리이다.
json은 JSON 데이터를 쉽게 처리하교자 사용하는 모듈이라고 한다.
파이썬을 데이터 처리용으로 사용하곤하는데, 초보자들은 주로 엑셀(xlsx) 데이터만 받아봤겠지만, 방대한 빅데이터를다룰 때는 JSON 데이터도 많이 쓰이곤한다.
밑에는 JSON 파일을 읽어서 딕셔너리 변환하기 위한 방법이다.
>>> import json
>>> with open('myinfo.json') as f:
... data = json.load(f)
...
>>> type(data)
<class 'dict'>
>>> data
{'name': '홍 길 동', 'birth': '0525', 'age': 30}
라이브러리를 알고 내 인생이 달라졌다.
-박무준-
감사합니다.
VII. 05-7 외부 라이브러리
by 고정윤
파이썬 설치 시 기본으로 설치되는 라이브러리 '파이썬 표준 라이브러리'
외부 라이브러리 -> pip도구 이용 설치
pip이란?
파이썬 모듈이나 패키지를 쉽게 설치할 수 있도록 도와주는 도구
pip으로 파이썬 프로그램 설치하면 의존성 있는 모듈이나 패키지 함께 설치해 주기 때문에 매우 편리
pip install SomePackage
somepackage=내려받을 수 있는 특정 패키지
pip uninstall SomePackage
설치한 패키지 삭제
pip install SomePackage==1.0.4
특정 버전 지정 설치 -> 1.0.4버전
pip install --upgrade SomePackage
패키지 최신버전 업그레이드 --upgrade옵션과 사용
설치된 패키지 확인
pip 이용하여 설치한 패키지 목록 출력
pip list
Faker
테스트용 가짜 데이터 생성할 때 사용하는 라이브러리
faker 라이브러리 pip이용하여 설치 필요
c:\> pip install Faker
테스트 데이터 30건 필요하다면?
[(이름1,주소1), (이름2,주소2), ...., (이름30, 주소30)]
Faker를 사용하면 매우 쉽게 만들기 가능
>>>from faker import Faker
>>>fake = Faker()
>>>fake.name()
'Matthew Estrada'
한글 이름 필요하다면 ko-KR을 전달하여 fake객체 생성
>>>fake=Faker('ko-KR')
>>>fake.name()
'고정윤'
주소 만드는 법
>>>fake.address()
'충청북도 수원시 잠식6실 (경자주이읍)'
이름 주소 쌍 30건 테스트데이터
>>> test_data=[(fake.name(), fake.address()) for i in range(30)
Faker 활용하기
sympy
방정식 기호 (symbol)를 사용하게 해 주는 외부 라이브러리
sympy 설치 - pip이용
c:\> pip install sympy
sympy 사용
Q. 시윤이는 가진 돈의 2/5로 학용품을 샀다고 한다. 이때 학용품을 사는 데 쓴 돈이 1,760원이라면 남은 돈은 어떻게 구하면 될까?
>>> from fractions import Fraction
>>> import sympy
시윤이가 가진 돈을 x라고 하면
x = sympy.symbols("x")
sympy.symbols() x처럼 방장식에 사용하는 미지수를 나타내는 기호 생성할 때 사용
여러 개 기호 사용
x, y 2개의 미지수 필요하다면
x,y = sympy.symbols('x y')
>>> f = sympy.Eq(x*Fraction('2/5'), 1760)
sympy.Eq(a, b) 는 a와 b가 같다는 방정식
Fraction은 유리수를 표현할 때 사용하는 표준라이브러리
fractions.Fraction으로 유리수 연산
>>> from fractions import Fraction
유리수는 Fraction(분자, 분모)형태로 만들기 가능
>>> a = Fraction(1,5)
>>> a
Fraction(1, 5)
Fraction('분자/분모')
>>> a = Fraction('1/5')
>>> a
Fraction(1, 5)
f라는 방정식 → sympy.solve(f) 로 x에 해당하는 값 구함
>>> result = sympy.solve(f)
>>> result
[4400]
solve() → 결괏값으로 리스트 리턴]
시윤이가 원래 가진 돈 4,400
남은 돈은 다음처럼 가진 돈으로 1,760원을 뺴면 됨
>>> remains = result[0] - 1760
>>> remains
2640
종합 풀이
#sympy_test.py
from fractions import Fraction
import sympy
#가지고 있던 돈 x
x = sympy.symbols("x")
#가지고 있던 돈의 2/5가 1760원 - 방정식 x * (2/5) = 1760
f = sympy.Eq(x*Fraction('2/5'), 1760)
#방정식 값 (result) 구하기
result = sympy.solve(f)
#남은 돈은 다음과 같이 가지고 있던 돈에서 1760 빼면 됨
remains = result[0] - 1760
print('남은 돈은 {}원 입니다.'.format(remains))
남은 돈은 2640입니다.
sympy 활용
2차방정식 해 구하기
>>> import sympy
>>> x = sympy.symbols("x")
>>> f = sympy.Eq(x**2, 1)
>>> sympy.solve(f)
[-1, 1]
연립방정식 해 구하기
x + y = 10
x - y = 4
>>> import sympy
>>> x, y = sympy.symbols('x y')
>>> f1 = sympy.Eq(x+y, 10)
>>> f2 = sympy.Eq(x-y, 4)
>>> sympy.solve([f1,f2])
{x:7, y:3}