002. 데이터 취업 스쿨 스터디 노트_2주차_파이썬중급

Julia-jh·2024년 4월 23일
0

2주차

수강한 분량

파이썬 중급은 객체지향개념과 클래스, 패키지와 함수, 모듈에 대해 다루었다. 스터디 조가 배정되었고, 일주일에 한 번씩 만나 주어진 과제를 공유하고, 그 내용에 대해 얘기하고 있다. 그러면 안되는데도 개인사가 자꾸 일정을 방해한다.

각 강의별 학습한 핵심 내용 정리

1. 함수

  • 함수: 입력값이 주어지면 특정 연산을 거쳐 출력값을 만드는 것
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 매개변수: 연산식
함수이름(매개변수) # 호출법

2. 모듈

  • 모듈: 함수가 선언되어 있는 파이썬 파일
    - 내부 모듈: 파이썬 설치 시 기본적으로 사용할 수 있는 모듈
    - 외부 모듈: 별도 설치 후 사용할 수 있는 모듈
    - 사용자 모듈: 사용자가 직접 만든 모듈

모듈 제작

  • 일반 python 파일을 만들면 된다.
    - 확장자 .py
    - as 이용하여 모듈 이름 단축 가능
    - import @#$% as @@
    - from 과 as 이용하여 모듈 특정 기능만 사용하는 것
    - from 모듈 import 함수1, 함수2, ...: 단일~복수 개 가능
    - from 모듈 import *: 모든 기능을 활용하겠다는 의미

모듈 실행

  • import 를 이용해 확장자를 제외한 파일 이름을 붙여 불러온다

3. 실행 파일

  • __name__: 에는 모듈 이름이 저장되거나 '__main__'이 저장된다
  • 실행 파일 중에 제일 먼저 실행해야 하는 파일
  • 이 파일이 실행파일이라면 그때만 아래 기능이 실행되어라
if __name__ == '__main__':
	실행문

4. 패키지

  • 패키지를 이용하면 관련 있는 모듈을 그룹으로 관리할 수 있음
  • site-packages라는 디렉토리에 있는 모듈은 어디서나 사용할 수 있다
import sys

for path in sys.path:
	print(path) # 참조하는 디렉토리 리스트를 출력해줌
  • venv: virtual environment의 약자, 가상환경
    - 프로젝트마다 가상환경을 만들고, 그것에 맞추어 설정을 바꾸거나 작업을 할 수 있다. 각 환경마다 독립적으로 진행할 수 있음

  • 자주 사용하는 모듈
    - math: 수학
    - random: 난수
    - time: 시간

5. 객체지향 프로그래밍

  • 객체를 이용한 프로그램
  • 객체(object)
    - 속성(attribute)
    - 변수
    - 기능(Function)
    - 함수
  • 객체 사용 장점
    - 코드 재사용, 모듈화에 좋다
    - 부품 결합도가 낮으면 가장 이상적인 프로그램이 될 수 있다

6. 클래스

  • class키워드와 속성(변수), 기능(함수)를 이용해 만든다
# 클래스명 첫 자는 대문자로 쓰는 것이 관례
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):
		수행문 # 구현을 함

7. 예외란?

  • 예외
    - 문법적인 문제는 없으나, 실행 중 발생하는 예상하지 못한 문제
    - 소프트웨어적으로 처리할 수 없는 문제
    - eg) syntax error, network error, system 환경 불안정, 하드웨어적 불가능
  • 예외 관련 클래스는 Exception 클래스를 상속한다
    - Exception
    - ArithmeticError
    - ZeroDivisionError
    - EnvironmentError
    - IOError
    - LookupError
    - IndexError
    - SyntaxError
    - IndentationError
  • 예외 처리
    - 발생된 예외를 별도 처리함으로써 프로그램 전체의 실행에 문제가 없도록 하는 것
    - 정확하게 문제가 발생할 부분만 try로 감싸야 함
try:
	실행문1 # 문제가 발생할 수 있는 부분, 문제가 없는 경우 수행됨
except:
	실행문2 # 문제가 발생한 경우 수행될 부분
else:
	실행문3 # 예외가 발생하지 않았을 때 수행하는 부분
finally:
	실행문4 # 예외 발생과 상관없이 항상 수행되는 부분
실행문5 # 에러가 없이 예외처리 정리가 잘 된 경우 마저 수행될 부분
  • Exception
    - 예외를 담당하는 클래스
    - 어떤 에러때문에 발생한 예외인지 알아낼 수 있다
try:
	실행문1
except Exception as e: # error 발생 시 예외처리 구문을 e로 부르기로 함
	print(e) # error 발생 시, 적절한 예외 처리 구문이 나옴
  • raise
    - 예외를 발생시킬 수 있다.
def 함수(변수명1, 변수명2):
	if 조건문:
		실행문1
	else:
		raise Exception('예외 처리 문구')
		
try:
	함수(값1, 값2) # 호출
except Exception as e: # error 발생 시 예외처리 구문을 e로 부르기로 함
	print(e) # error 발생 시, 위에서 만든 예외 처리 문구가 나옴
  • 사용자 예외 클래스
    - Exception 클래스를 상속해 만들 수 있다
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 발생 시, 위에서 만든 예외 처리 문구가 나옴

8. 텍스트 파일 쓰기

  • open('a', 'b')
    - 파일 열기
    - a: 디렉토리명
    - b: 파일의 모드
    - w 모드
    - 쓰기 전용, write
    - 파일이 존재하지 않으면 만들고, 존재하면 연다.
    - 기존의 글을 전부 지우고 새로운 글로 덮어버린다
    - r 모드
    - 읽기 전용, read
    - 파일이 존재하지 않으면 에러발생
    - 내부 내용이 무엇이건 문자열로 읽어들임
    - encoding = ''
    - UTF8 등 인코딩버전을 맞춰야할 때가 있다
    - a 모드
    - 쓰기 전용, append
    - 파일이 존재하면 덧붙인다
    - x 모드, exclusive creation
    - 쓰기 전용,
    - 파일을 만들고 작성한다
    - 파일이 존재하면 에러가 발생
  • read()
    - 읽기
  • write()
    - 쓰기
    - 내용은 문자열만 가능하다. 숫자여도 str()로 변환하기
  • close()
    - 파일 닫기
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() # 다음 줄 읽게 됨

연습문제

+ 추후에 추가

느낀점

혼자 공부할 때는 어디서부터 어디까지 내가 지금 당장 알아야 활용할 수 있는지조차 모르기 때문에 필요한 정보를 찾아내는 것 자체도 힘이 드는 일이었다. 아무래도 모든 내용을 다루지 않는 다는 것은, 오히려 꼭 알아야 하는 내용을 위주로 정리한것이니 이것만큼은 꼭 이해해야겠다는 생각이 들었다.

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 직무로 먹고 살고 싶은 사람

0개의 댓글