파이썬 중급은 객체지향개념과 클래스, 패키지와 함수, 모듈에 대해 다루었다. 스터디 조가 배정되었고, 일주일에 한 번씩 만나 주어진 과제를 공유하고, 그 내용에 대해 얘기하고 있다. 그러면 안되는데도 개인사가 자꾸 일정을 방해한다.
def 함수명(입력값(생략가능)):
return 반환값
함수명(입력값들) # 호출법
내장 함수: 파이썬에서 기본으로 제공하는 것
사용자 함수: 사용자가 직접 선언하는 함수
함수 사용 하는 이유: 특정 기능을 재사용하기 위함
round(a, b): a숫자의 소수점 아래 b번째까지만 출력
함수 내에서 또 다른 함수 호출
def fun1():
print('fun1 호출')
fun2()
print('fun2 호출 후 실행')
def fun2():
print('fun2 호출')
fun3()
print('fun3 호출 후 실행')
def fun3():
print('fun3 호출')
pass 이용해 실행문 생략 가능, 실행문을 비워두면 error 발생
인수: 함수 호출 시 함수에 전달되는 데이터
매개변수: 호출부와 선언부에 관계에 매개를 맺어주는 변수
- *매개변수 매개변수 갯수가 정해지지 않은 경우에 사용하는 것
- type은 tuple 데이터 타입으로 iterable type
인수와 매개변수의 갯수가 동일해야 한다. 아니면 error
return 키워드를 활용하면 함수 실행 결과를 호출부로 반환할 수 있다
- return을 만나면 함수 실행을 종료한다
지역변수: 함수 안에 선언된 변수로, 함수 안에서만 사용이 가능하다
전역변수: 함수 밖에 선언된 변수로, 어디에서나 사용은 가능하지만 함수 안에서 수정은 불가능하다
global 키워드를 사용하면 함수 안에서도 전역변수 값을 수정할 수 있다
중첩함수: 함수 안에 또 다른 함수가 있는 형태
- 내부 함수를 감싸고 있는 함수 외부에서 호출 불가능
lambda 함수: 함수 선언이 보다 간단하게 가능
함수이름 = lambda 매개변수: 연산식
함수이름(매개변수) # 호출법
if __name__ == '__main__':
실행문
import sys
for path in sys.path:
print(path) # 참조하는 디렉토리 리스트를 출력해줌
venv: virtual environment의 약자, 가상환경
- 프로젝트마다 가상환경을 만들고, 그것에 맞추어 설정을 바꾸거나 작업을 할 수 있다. 각 환경마다 독립적으로 진행할 수 있음
자주 사용하는 모듈
- math: 수학
- random: 난수
- time: 시간
# 클래스명 첫 자는 대문자로 쓰는 것이 관례
class 클래스명: # 클래스 선언
def __init__(self, 변수1, 변수2): # 생성자, 속성
self.변수명1 = 변수1 # 변수명은 객체 속성을 의미
self.변수명2 = 변수2 # 변수1은 매개변수를 의미
def 함수명1(self): # 기능, self 표시는 현재 클래스안에 포함된다는 의미
실행문
def 함수명2(self): # 기능
실행문
객체는 클래스의 생성자를 호출한다.
- 객체명1 = 클래스명(변수1값, 변수2값)
객체 속성 변경
- 속성에 직접 접근하여 수정하기
- 객체명.객체속성 = 새로운 값
객체와 메모리
- 클래스에서 객체를 선언해 사용하는 것은 변수안에 저장된 객체 메모리 주소를 이용해 객체 기능을 호출하거나 속성을 변경하는 것
- 변수는 객체의 메모리 주소를 저장하고 이를 이용해 객체를 참조하는 것
- 레퍼런스 변수라고 부르기도 한다
- 얕은 복사
- 객체의 메모리 주소가 할당되는 것
- 객체가 새로 생긴 것이 아니라, 메모리 주소만 복사한 것으로 하나의 객체를 가리키는 여러 변수가 생긴 것
- 깊은 복사
- 동일한 객체가 하나 더 생기는 것
- copy.copy()함수 사용으로 가능
- import copy
사본 = copy.copy(원본)
- id() 이용하면 메모리 주소를 확인할 수 있음
- id(변수)
- 자료구조가 가지고 있는 함수를 사용해 깊은 복사가 가능하기도 함
- 반복구조 변수라면 for문을 사용해 하나씩 이어붙이는 것도 가능
클래스 상속
- 클래스가 다른 클래스를 상속해 내 것처럼 사용하는 것
- class 클래스명(다른 클래스명)
- 생성자
- 객체가 생성될 때 생성자를 호출하면 __init__()가 자동 호출됨
- 호출됨: 변수 = 클래스명()
- __init__()
- 속성을 초기화한다
- 기능은 바로 사용이 가능하지만, 속성은 __init__() 호출되어야 사용이 가능하다
- 상위 클래스의 속성을 초기화함
- 상위클래스.__init__(self, 변수명1, 변수명2)
- super() 함수 사용
- super().__init__(변수명1, 변수명2)
- 다중 상속
- 2개 이상 클래스를 상속한다
- class 클래스명(클래스1, 클래스2, 클래스3, ...)
- 동일한 이름이 있으면 헷갈리므로 남발하면 안됨
- 원칙적으로는 가장 먼저 상속받은 클래스를 이용함
- 오버라이딩
- 하위 클래스에서 상위 클래스의 메서드를 재정의(override)하는 것
- 중복된 코드를 많이 정리할 수 있고, 시간 절약도 된다
class 상위:
def __init__(self, 변수명1, 변수명2):
self.변수1 = 변수명1
self.변수2 = 변수명2
def 함수명1(self):
수행문1
class 하위(상위):
def __init__(self, 변수명1, 변수명2):
super().__init__(변수명1, 변수명2)
def 함수명1(self):
수행문2
from abc import ABCMeta
from abc import abstractmethod
class 상위(metaclass = ABCMeta):
def __init__(self, 변수명1, 변수명2):
self.변수1 = 변수명1
self.변수2 = 변수명2
@abstractmethod # decoration
def 함수명1(self):
pass # 선언만 되어있음
class 하위(상위):
def __init__(self, 변수명1, 변수명2):
super().__init__(변수명1, 변수명2)
def 함수명1(self):
수행문 # 구현을 함
try:
실행문1 # 문제가 발생할 수 있는 부분, 문제가 없는 경우 수행됨
except:
실행문2 # 문제가 발생한 경우 수행될 부분
else:
실행문3 # 예외가 발생하지 않았을 때 수행하는 부분
finally:
실행문4 # 예외 발생과 상관없이 항상 수행되는 부분
실행문5 # 에러가 없이 예외처리 정리가 잘 된 경우 마저 수행될 부분
try:
실행문1
except Exception as e: # error 발생 시 예외처리 구문을 e로 부르기로 함
print(e) # error 발생 시, 적절한 예외 처리 구문이 나옴
def 함수(변수명1, 변수명2):
if 조건문:
실행문1
else:
raise Exception('예외 처리 문구')
try:
함수(값1, 값2) # 호출
except Exception as e: # error 발생 시 예외처리 구문을 e로 부르기로 함
print(e) # error 발생 시, 위에서 만든 예외 처리 문구가 나옴
class 사용자예외클래스명(Exception):
def __init__(self, 변수명):
super().__init__('{}은 사용할 수 없습니다.'.format(변수명))
def 함수(변수명1, 변수명2):
if 조건문: # 특정 상황일 때 만들어둔 사용자 예외 클래스를 실행시킨다
raise 사용자예외클래스명(변수)
else:
실행문1
try:
함수(값1, 값2) # 호출
except Exception as e: # error 발생 시 예외처리 구문을 e로 부르기로 함
print(e) # error 발생 시, 위에서 만든 예외 처리 문구가 나옴
file = open('파일주소/파일명.확장자', 'w')
변수명 = file.write('작성할 문구') # 작성할 문구의 길이를 반환함
print(변수명)
file.close()
file = open('파일주소/파일명.확장자', 'r')
변수명 = file.read() # 텍스트파일 내용을 문자열로 읽음
print(변수명)
file.close()
time.strftime()
- 출력되고자하는 문자형태로 표시하기
- %Y
- 연
- %m
- 월
- %d
- 일
- %H
- 시
- %M
- 분
- %S
- 초
- %p
- am, pm 표시
- %I
- 12시간제
문자열.replace('문자열1', '문자열2', 횟수)
- 문자열 내에서 문자열1을 발견하면 문자열2로 바꾸겠다. 이때 횟수가 주어지면 그 횟수만큼만 적용되고, 그 횟수를 넘어간 이후 발견한 문자열1은 바꾸지 않는다.
문자열.split('구분자')
- 문자열 내에 구분자를 기준으로 문자열을 나누어 리스트에 각각 저장한다
with as 구문
- 파일 닫기를 생략할 수 있다
- with open('파일주소/파일명.확장자', 모드) as 변수명
- '파일주소/파일명.확장자'를 열어서 파일을 가리키고 있는 레퍼런스 변수를 변수명이라 하겠다.
with open('파일주소/' + '파일명.확장자', 'a') as f:
f.write('작성 문자열')
with open('파일주소/' + '파일명.확장자', 'r') as f:
print(f.read())
uri
- 인터넷에 있는 자원을 나타내는 유일한 주소(Uniform Resource Identifier)
writelines()
- 반복 가능한 자료형의 데이터를 파일에 쓸 때 사용하는 함수
readlines()
- 파일의 모든 데이터를 읽어서 리스트 형태로 반환함
readline()
- d
변수명 = 반복 가능한 자료형
for i in 변수명:
with open('파일주소/' + '파일명.확장자', 'a') as f:
f.write(i)
f.write(\n)
변수명 = 반복 가능한 자료형
with open('파일주소/' + '파일명.확장자', 'a') as f:
f.writelines(변수명) # 바로 연결됨
# 개행을 원한다면 아래와 같이 사용 가능
f.writelines(i + '\n' for i in 변수명)
with open('파일주소/' + '파일명.확장자', 'r') as f:
변수명 = f.readlines()
print(변수명)
with open('파일주소/' + '파일명.확장자', 'r') as f:
변수명 = f.readline()
while 변수명 != 0:
print('변수명)
변수명 = f.readline() # 다음 줄 읽게 됨
+ 추후에 추가
혼자 공부할 때는 어디서부터 어디까지 내가 지금 당장 알아야 활용할 수 있는지조차 모르기 때문에 필요한 정보를 찾아내는 것 자체도 힘이 드는 일이었다. 아무래도 모든 내용을 다루지 않는 다는 것은, 오히려 꼭 알아야 하는 내용을 위주로 정리한것이니 이것만큼은 꼭 이해해야겠다는 생각이 들었다.
이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.