[python] 모듈

May·2022년 6월 29일
0

python_중급

목록 보기
1/1

🌝 모듈(module)

: 코드를 파일단위로 나눠주는 게 좋다
그런 파일들을 모듈 이라고 함
+ 단순히 변수나 상수를 모아둔 것도 모듈이다!

ex) 게임을 만들려면 게임 캐릭터, 인터페이스, 상점 등등 다양한 요소가 필요한데,
그 요소를 한 파일에 구현하게 되면 길고 복잡해진다.
(코드의 어느 부분이 어떤 역할을 하는지, 프로그램 수정 시 어떤 부분을 바꿔야 하는지 알기 힘듦)
👉 그래서, 프로그램을 짤 때 코드를 파일단위로 나눠주는 게 좋다

✔ 모듈화를 시킨다면?
한 파일에서 구현하고자 하는게 더 명확해지기 떄문에 코드를 만들고 관리하는 게 쉬워진다!
+ 코드의 재사용이 가능해짐!
특정 기능이 여러 프로그램에서 필요한 경우 그 기능을 구현하는 모듈을 가져와서 쓰면 된다

🌝 모듈 사용하기

파이썬 모듈은 파일이름에서 .py(확장자)를 제외하고 불러주면 된다
ex) circle.py → circle 모듈

✔ area 모듈 만들기

# 원과 정사각형의 면적을 구하는 'area' 모듈 만들기
PI = 3.14  # 변하지 않는 pi값은 상수로 정의


def circle(radius):  # 파라미터 : 원의 반지름
	return PI * radius * radius
    
def square(length):  # 파라미터 : 변의 길이
	return length * length

✔ area 모듈 사용해보기
새 파이썬 파일 만들고, import 명령 이용해서 모듈 불러오기
+ 모듈에 저장된 기능을 가져다 쓰기 위해서 모듈을 import 하면 된다

→ 그러면 area 모듈에 있는 변수, 함수 사용 가능!

import area

print(area.circle(2))  # 모듈명.함수명()
print(area.square(3))  # 모듈명.함수명()
print(area.PI)  # 모듈명.변수명

결과값> 
12.56
9
3.14

사용방법 👉 모듈명.함수명() , 모듈명.변수명

🌝 모듈을 가져오는 여러가지 방법들

1) 모듈에 있는 함수들 중 일부함수만 가져오고 싶을 때
👉 from 모듈명 import 함수명(, 함수명2, ...)

from area import circle
		  # circle 함수 자체를 가져왔기 때문에 
print(circle(2))
	 # 앞에 모듈이름을 써주지 않아도 그대로 호출 가능

결과> 12.56

2) 불러오는 모듈이나 함수의 이름 원하는대로 바꿔주기
👉 import 모듈명 as 원하는 이름

import area as ar
# area 모듈을   ar이라는 이름이라고 할 것이다
# ar 이름은 실제 모듈(함수)이름과 비슷하게 짓자! 막 지으면 어떤걸 의미하는지 파악하기 어렵다!
print(ar.circle(4))
     # area 대신 ar 사용해서 원하는 함수 호출 가능

+ 함수도 원하는 이름 지어주고 싶을 때!
👉 from 모듈명 import 함수명 as 원하는 이름

from area import square as sq
			   #square 함수를 sq라고 부를거야~

print(sq(3))
# 함수를 직접 호출해줬기 때문에 (from ~ import ~) 앞에 모듈명 적지 않음
# square 함수를 sq로 적어줬다

+ 여러개 함수를 가져오는데 이름 붙이고 싶으면?
from 모듈명 import 함수명1 as 원하는 이름1
from 모듈명 import 함수명2 as 원하는 이름2

한줄씩 정의해주면 된다!

3) 모듈의 모든내용 가지고 오기 (비추)
👉 from 모듈명 import *

from area import *  # = import area와 같은 기능을 하지만

print(circle(3))
print(square(4))
print(PI)
	# 앞에 모듈명을 적지 않아도 함수, 변수는 호출된다!

→ 이렇게 사용하게 되면 이 함수를 어떤 모듈에서 가져왔는지 정확하게 알 수 없고,
나도 모르게 쓸데없는 것들을 가져올 수 있음!
그래서 추천하지 않는 방법

∴ 모듈 그대로 가져오거나 (import 모듈명)
모듈에서 필요한 것들 가져오는 방법 이용하기! (from 모듈명 import 함수명)

모듈 사용해보기 실습!

from cil import *

img = [
    [1,0],
    [0,1]
]
height, width = len(img), len(img[0])

for i in range(height):
    for j in range(width):
        if img[i][j] == 0:
            img[i][j] = 1
        elif img[i][j] == 1:
            img[i][j] = 0

print(img)

ㄴ 처음에 문제를 읽고 무슨소리인지 몰라서... 그리고 내가 만들 함수가 어떻게 진행될지 앞이 막막해서
우선 비트맵 이미지 예시로 만들어두고 반복문을 작성해봤다
결과는 대 성공! 근데 문제 조건에 원본 img는 변하면 안된다고 정해져있었고,

리턴 받는 값도 new_img 새 리스트에 받게 되어있었다

글서

img = [
    [1,0],
    [0,1]
]

height, width = len(img), len(img[0])
new_img = []

for i in range(height):
    for j in range(width):
        if img[i][j] == 0:
            new_img.append(1)
        elif img[i][j] == 1:
            new_img.append(0)

print(new_img)

첨엔 단순하게 new_img 빈 리스트 정의하고, .append 해서 기존 리스트의 0 값을 new_img 요소로 추가되게끔 했다
결과는 [0, 1, 1, 0]

오 생각보다 잘 나왔다

근데 원하는 리스트 반전값이 아니라... 어케하지
구글링해도 원하는 내용은 안나오고...
아예 값이 들어있는 새 리스트를 추가해야하나? 한참 생각하다가 힌트 봤다
첫번째 힌트가 new_img 리스트에 -1로 채워진 리스트 만들기...
-1로 채워진 리스트 만드는 함수가 이미 정의되어 있어서
그 함수 이용했고
공간을 만들어놓기...

def invert(img):
    # img 이미지 크기
    height, width = len(img), len(img[0]) 
    new_img = empty_image(height, width)   👈 -1로 채워진 리스트 만듦
    for i in range(height): 
        for j in range(width):
            if img[i][j] == 0:
                new_img[i][j] = 1
            elif img[i][j] == 1:
                new_img[i][j] = 0
    ### 코드를 작성해 주세요 ###

	return new_img

모범답안과 비교

# 이미지 색상 반전
def invert(img):
    # img 이미지 크기
    height, width = len(img), len(img[0])

    new_img = empty_image(height, width)
    for i in range(height):
        for j in range(width):
            new_img[i][j] = invert_bit(img[i][j])
            				👆 invert_bit 함수가 이미 정의되어 있어서 그걸 활용함.
							  (0이면 1, 1이면 0으로 바꿔주는 함수)
    return new_img

궁금한 점이 생겼다.
해당코드를 전부 올릴 순 없지만, 이번강의는 이미 정의되어있는 함수를 어떻게 활용할 것인지 확인하는 의도가 있었다

그래서, 내가 만든 ① 이미지 색상 반전 함수, ② -1로 채워진 새로운 이미지 생성 함수, ③ 비트 반전(0→1,1→0 바꿔줌) 함수
이렇게 세 함수가 나열되어 있었는데
내가 만들 이미지 색상 반전 함수에 나중에 정의된 -1 채워진~함수랑 비트반전 함수를 사용할 수 있는지?

내 머릿속엔 컴퓨터는 위에서부터 아래로 차례차례 수행한다고 알고 있는데... 나중에 정의된 함수를 사용 못하는게 아닐까? 해서 if문 사용해서 0과 1이 바꿔지게끔 진행했었다.

질문 여러가지 찾아보니까 함수 정의 순서는 상관이 없다고 한다!

함수가 호출되는 시점에 그 함수가 존재하기만 하면 돼서, 정의할 때는 순서 상관없이 함수를 적어주면 된다고 한다!!!!!!

예시

def i():
    print(j())
i()
def j():
    return 10
    
👉 위와 같은 코드가 있을 때 a() 가 호출하는 시점에 
b() 는 정의되지 않아 에러가 발생한다

def i():
    print(j())

def j():
    return 10

i()

👉 a() 호출 시점에는 b() 함수가 있기 때문에 문제없이 잘 구현된다.

또 하나 알아간다.... 👍

profile
ฅ˘◡˘ฅ

0개의 댓글