[Python] Chater03. 파이썬 중급(함수, 모듈, 패키지, 클래스와 객체)

황성미·2023년 7월 10일
0
post-thumbnail
post-custom-banner

10일 공부한 내용 정리 스타뚜~!
이제 점점 어려워지는 내용들이 하나 둘 나오기 시작했다. 그래도 오히려 대학 때 배운 방식(?)보다 더 이해하기 쉽게 말씀해주셔서 쉽게 이해할 수 있었다:)


함수

수학 함수와 동일하다고 생각하면 편하다.
특정 기능을 재사용하기 위해서 사용하고 함수 내에 다른 함수를 호출할 수도 있다.
함수 선언과 호출은 아래 형태를 참고하기!

#함수 선언
def 함수명(매개변수명): #매개변수의 개수가 정해지지 않은 경우 *매개변수명 으로 작성
	#들여쓰기 꼭!
    #함수 내용 작성
    
    return 변수명 #함수 실행 결과를 반환할 수 있음
    #return을 만나면 실행이 즉시 종료되어 return 이후의 실행문들은 전혀 실행되지 X
    
 #함수 호출
 함수명(인수) #로 호출 가능. 이때, 인수과 매개변수 개수는 동일해야 함.

전역변수와 지역변수

전역변수는
어디에서나 사용은 가능하지만 함수 안에서 수정할 수는 없다.
지역변수는 함수 안에 선언된 변수로 함수 안에서만 사용 가능하다.

num_out = 10 #함수 밖에서 선언된 변수, 전역변수

def printNumbers():
	num_out = 20 #함수 안에서만 유효한 변수, 지역변수
	#함수 밖의 전역변수 num_out을 수정한 것이 아니고
	#새로운 num_out 변수를 생성해서 함수 내에서만 사용되는 변수임
	print(f'num_out1 : {num_out}')

printNumbers()
print(f'num_out2 : {num_out}') 

와 같이 코드를 작성해서 실행시키면
아래와 같이 출력된다.
💻출력

num_out1 : 20
num_out2 : 10


global 키워드

전역변수를 함수 안에서 수정할 수도 있다. global 키워드를 사용하면!

num_out = 10 #전역변수
def printNumbers():
	global num_out
	num_out = 20 #함수 안에서도 수정 가능
	print(f'num_out1 : {num_out}')

printNumbers()
print(f'num_out2 : {num_out}') 

위 코드는 아래와 같이 출력된다.
💻출력

num_out1 : 20
num_out2 : 20

lambda 키워드

함수 선언을 보다 간단하게 할 수 있게 해주는 키워드이다. ✨내 경험상 이후 머신러닝, 딥러닝을 하게 되면 lamdba 키워드를 사용해 함수를 선언하는 경우가 많아졌다.✨ 어려워도 꼭 기억해두기!

#1. def 키워드를 사용해서 함수를 선언하는 경우
def calculator(n1,n2):
	return n1 + n2

returnValue = calculator(10,20)
print(f'returnValue : {returnValue}')


#2 lambda 키워드를 사용해서 함수를 선언하는 경우
calculator = lambda n1, n2 : n1 + n2
returnValue = calculator(10,20)
print(f'returnValue : {returnValue}')

동일한 기능을 가진 함수를 #1은 def 키워드를 사용해 선언했고 #2는 lambda 키워드를 사용해 선언해보았다.

이처럼 lamdba는 아래의 형태를 통해 함수 선언을 할 수 있다.

함수명 = lambda 매개변수명 : 함수 내용

변수명 = 함수명(인수)




모듈

이미 만들어져있는 기능으로, 사용자가 쉽게 사용할 수 있는 함수들의 모음집이다. import 모듈명 을 통해 임포트해서 모듈 내의 함수들을 사용할 수 있다.
또한 모듈은 특정 기능을 가지고 있는 파이썬 파일 자체를 말하기도 해서, 사용자가 직접 모듈을 만들어 import 파일명 을 통해 모듈을 사용할 수도 있다.


아래 예제를 통해 확인해보자면..

로또 번호 6개를 출력하는 파이썬 파일을 만들고 이 모듈을 import 해서 실행시키는 프로그램을 완성해라.

#lottoMachine.py

import random

def getLottoNumbers():
	result = random.sample(range(1, 46), 6)
	return result

로또 번호 6개를 출력해주는 파일을 만들고

#실행 파일
import lottoMachine

lottoNumbers = lottoMachine.getLottoNumbers()
print(f'lottoNumbers : {lottoNumbers}')

이를 import 해서 사용할 수 있다.


✨자주 사용하는 모듈 3가지는 익혀두자.
math 모듈(수학 계산) , random 모듈(난수 생성), time 모듈(시간)




도대체 import가 뭔데?

import 키워드

import 모듈명 을 통해 모듈을 임포트할 수 있게 도와주는 키워드이다.

as 키워드

import 모듈명 as 모듈별명을 통해 모듈 이름을 다르게 부를 수 있도록 도와주는 키워드이다. 위 로또 예제를 다시 살펴보자면
lottoNumbers = lottoMachine.getLottoNumbers() 로 코딩했던 것을
import lottoMachine as lM으로 임포트했다면
lottoNumbers = lM.getLottoNumbers() 으로 간편하게 코딩할 수 있다.

from 키워드

from 모듈명 import 모듈내함수명 을 통해 모듈의 특정 기능만 사용할 수 있도록 도와주는 키워드이다.
모듈의 모든 기능을 사용하고 싶다면 from 모듈명 import *을,
특정 함수 몇 가지만 사용하고 싶다면 from 모듈명 import 모듈내함수1, 모듈내함수2와 같이 ,를 구분자로 나열해주면 된다.

전역변수 __name__

모듈 이름이 저장되거나 __main__ 이 저장되는 파이썬 내 변수이다.
평상시에는 작성되고 있는 파이썬 파일명이 저장되어있지만, 작성하고 있는 파일을 실행시켜 실행파일이 된다면 __main__ 이 저장되는 특징을 가진다.
이를 이용해

if __name__ == '__main__':
	#해당 파일이 실행되었을 때 실행되는 코드

아래에 내용을 적어두면 해당 파일이 실행 파일일 때만 실행되도록 하는 코드를 작성할 수도 있다.


예시를 통해 더 살펴보자.

#unitConversion.py

def cmToMm(n):
	return round(n * 10 , 3)
def cmToInch(n):
	return round(n * 0.393, 3)
def cmToM(n):
	return round(n * 0.01, 3)
def cmToFt(n):
	return round(m * 0.032, 3)

if __name__ = '__main__': #실행파일이 아니기 때문에 출력되지 않음.
	print(f'10cm : {cmToMm(10)}mm')
	print(f'10cm : {cmToInch(10)}inch')
	print(f'10cm : {cmToM(10)}m')
	print(f'10cm : {cmToFt(10)}ft')
#실행 파일
import unitConversion as uc

inputNumber = int(input('길이(cm) 입력 : '))

returnValue = uc.cmToMm(inputNumber)
print(f'returnValue : {returnValue}mm')

returnValue = uc.cmToInch(inputNumber)
print(f'returnValue : {returnValue}mm')

returnValue = uc.cmToM(inputNumber)
print(f'returnValue : {returnValue}mm')

returnValue = uc.cmToFt(inputNumber)
print(f'returnValue : {returnValue}mm')

위와 같이 2개의 파일이 있고 아래 파일을 실행시켰다면 출력은 어떻게 될까?

💻출력

길이(cm) 입력 : 20
returnValue : 200mm
returnValue : 7.86inch
returnValue : 0.2m
returnValue : 0.64ft

unitConversion.py에 있는 print문들은

if __name__ == '__main__':
	#해당 파일이 실행되었을 때 실행되는 코드

아래에 작성되어있으므로 unitConversion.py를 실행했을 때 출력되는 코드들이다. 따라서 지금은 출력되지 않는다.




패키지

관련있는 모듈을 그룹으로 관리할 수 있게 해주는 것을 패키지라 한다. from 패키지명 import 모듈명 을 통해 모듈을 임포트할 수 있다.


지금까지 한 이야기를 그림으로 표현하자면 위와 같다.
추가적으로 얘기할 것은
다른 디렉토리에 있는 모듈은 현재 나의 실행파일에서는 사용할 수가 없다. 하지만 패키지를 C:\pythonEx\project\venv\lib\site-packages 폴더에 넣어둔다면 나의 실행 디렉토리가 어디인지와는 상관없이 자유롭게 사용가능하므로 위 폴더에 패키지를 넣어두는 것을 권장한다 :)




객체지향프로그래밍

객체란, 속성과 기능을 포함한 것을 뜻한다.
예를들어 계산기라는 객체는 숫자라는 속성과 덧셈, 뺄셈과 같은 기능을 가진 것이고
자동차는 색상, 길이.. 와 같은 속성과 전진, 후진.. 과 같은 기능을 하는 객체라고 볼 수 있다.
파이썬에서는 객체를 코드 재사용과 모듈화에 좋아서 사용하고 있고 클래스에서 생성할 수 있다.



내가 대학 시절, 클래스에 대해 배웠을 때는 교수님들이 <붕어빵>에 비유를 엄청 하셨었다. 클래스는 붕어빵을 만드는 틀, 객체는 그 틀에서 나온 붕어빵 하나하나들..
직관적으로 무슨 내용인지는 알겠는데.. 직접 클래스를 코딩하고 이를 활용하는 문제들이 나오면 저어어엉말 모르겠어서 날 괴롭혔던 클래스였다 🤯🤯
그런데 이렇게 비유해주시다니....!! 한 번에 이해할 수 있었다!!ㅋㅋㅋㅋ

클래스

클래스의 형태는 아래와 같이 되어있으며
객체를 생성하고 객체들의 기능을 사용하는 것, 객체의 속성을 변경하는 법 또한 아래를 참고하면 된다 :)

class 클래스명: #클래스 선언
	def __init__(self, 속성명1, 속성명2): #생성자, 속성
		self.속성명1 = 속성명1
		self.속성명2 = 속성명2
	def 기능명1(self): #기능
		기능 내용
	def 기능명2(self):
		기능 내용


#객체 생성
객체1 = 클래스명(속성명1 인수, 속성명2 인수)
객체2 = 클래스명(속성명1 인수2, 속성명2 인수2)

#객체 기능 사용
객체1.기능명1()

#객체 속성 변경
객체1.속성명1 = '변경할 속성값'







오늘의 주저리

클래스.. 객체.. 으으...😖 정말 싫어했던 내용들 중 하나였었다. 그래도 성장한 것인지, 아니면 제로베이스에서 이해하기 쉽게 말씀해주신 덕분인지 어느정도 자신감이 생겨났다.
나는 예에에전에 누군가에게 내가 (어떠한 것에 대해) 모른다는 사실을 들키기 싫어서 오히려 더 구글링하고 자료를 찾아보고 지식을 습득하기도 했었었다. 지금도 어느정도 남아있기도 하지만ㅎㅎ 프로그래밍은.. 참 나에게 많은 것을 알려주었다.

정해진 시간 내에.. 제대로 풀지 못하고 제출해야하는 과제가 있을 수도 있다는 사실도 깨닫게 해주었고, 편법으로는 절대로 이 이상의 문제를 풀 수 없다는 것을 알려주었었다.
그래서 기본부터 하나하나 기초와 알고리즘들을 익히고 파헤쳐보고 비로소 내 것으로 만들 줄 알아야 더 발전할 수 있었고 이 단계까지 올 때에는 모든 방식을 활용했어야했다.(내가 이해할 수 있게끔 잘 정리된 사이트를 찾거나, 누군가에게 물어보거나 등등)

'남들에게(심지어 인형에게라도) 알려줄 때 사람들은 그 내용에 대해 확실히 더 알게된다.'라는 말이 있듯이 예전에는 (몰라도 일부러 더 공부해서 알게 된 내용을) 친구들과 스터디를 했다면, 프로그래밍을 공부할 땐 '내가 이해하기 힘든 내용도 있다'라는 것을 명심하고 내가 모르는 부분이 무엇인지, 이 부분은 어떻게 이해하면 좋은지 등 내가 모르는 것을 내 것으로 만드는 방법에 대해 같이 스터디를 하면서 배워나가기 시작했다.
그러다보니, 마냥 큰 벽 같아서 보기만해도 회피하고 싶던 문제들도 직접 마주해볼 용기가 생겼고, 그런 문제들을 해결할 때의 성취감은 정말 짜릿했다.

이 기분 때문에 프로그래밍에게서 벗어날 수 없나보다ㅎㅎ

profile
데이터 분석가(가 되고픈) 황성미입니다!
post-custom-banner

0개의 댓글