하나의 값을 리턴하는 함수 - skip
여러 값을 리턴하는 함수 - 용도에 따라 리스트, 또는 튜플의 형태로 묶어 반환할 수 있다.
-리스트 : 비슷한 유형의 데이터들을 반환할 때
- 튜플 : 각각의 데이터를 각기 다른 변수에 전달할 때 (언패킹)
(후략)
교과서 예제
import random
def position(number, column, title):
print(title)
students = list(range(1, number+1))
random.shuffle(students)
pos = ""
for i in range(number): #idx
if students[i] < 10:
pos += "0" + str(students[i]) + "번\t"
else:
pos += str(students[i]) + "번\t"
if (i+1) % column == 0:
pos += "\n"
print(pos)
position(20, title = "3-2반", column = 5)
출력 결과:

- 키워드 인자를 사용하여 값을 넘겨주었다.
- 출력 형식을 맞추기 위해 하나의 문자열 내에서 "\t"와 "\n"을 사용하여 줄바꿈과 띄어쓰기를 하였다.
- 줄바꿈을 위한 인덱스 보정 i+1을 하였다.
- random.shuffle(리스트) 는 반환값 없이 변경사항이 리스트에 반영되는 매소드임을 확인할 수 있다.
모듈, 패키지
*묘듈이란?
함수, 클래스 등의 정의와 변수와 실행문 등을 저장한 파일
모듈이름은 파일명을 따르며, 모듈은 파일 단위이다.
모듈을 다른 모듈에서 임포트 함으로써 원하는 기능을 빠르게 구현할 수 있다.
+ 모듈, 패키지, 프레임워크의 구조
모듈 : 함수를 담고 있는 파일
패키지 : 특정 기능과 연관된 모듈의 모음. __init__.py 파일을 가지고 있으며, 구조적으로 모듈에 접근한다.
라이브러리 : 특정 기능과 연관된 패키지의 모음을 뜻하며, 파이썬에서는 패키지와 라이브러리가 개념적으로 차이 없이 쓰인다.
프레임워크 : 애플리케이션의 기능을 수행하기 위해 설계한 데이터 흐름과 구조를 갖는 모듈과 패키지의 모음
상하관계(추상적) : 모듈 < 패키지 < 프레임워크
모듈의 유형
실행문만 있는 모듈
다음과 같이 같은 디렉토리(패키지) 내에 모듈들이 있다고 하자.
greeting2.py와 hello2.py는 실행문 만으로 되어있다.



이때 insa2.py에서 다음과 같이 두 모듈을 임포트 하였다.

이때, 예상대로 임포트한 순서대로 두 모듈이 실행되는 것을 확인할 수 있다.

특징
- 일반적으로 메인 모듈로 사용하기 위해 만든 모듈이다.
- 실행문으로 된 모듈은 임포트한 순서에 따라 결과가 달라진다.
- 이때, 임포트를 하는 것은 해당 모듈의 코드를 복사하는 효과가 있다(임포트 하는 즉시 실행되므로)\
함수, 클래스, 정의만 있는 모듈
또다시 다음과 같은 디렉토리 안에 다음과 같은 모듈들이 있다고 하자.
이때, hello_func.py 모듈과 greeting_func.py는 함수의 정의만으로 구성된 코드이다.




이때의 실행결과는 다음과 같다.

이때 '__name__'은 내장변수로, 해당 모듈이 어떤 방식으로 실행되고 있는지 알려준다.
- 해당 모듈이 다른 모듈에서 임포트되어 실행되었을 때 : __name__ : 모듈명
- 해당 모듈이 임포트 되지 않고 메인모듈로서 실행되었을 때 : __name__ : "__main__"
코드 설명 :
- 각각의 함수 모듈들은 함수 내에서 모듈의 이름과 실행 위치를 출력하였다.
- 메인모듈에서는 각각의 모듈들을 임포트 하고, 이를 호출하였다. 메인 모듈에서 또한 실행 위치를 출력하였다.
- hello_func.py와 greeting_func.py는 임포트되었기에 실행 위치가 모듈명으로 되어있는 것을 확인할 수 있으며,
main_func.py는 메인 모듈이기 때문에 실행 위치가 __main__으로 출력되는 것 또한 알 수있다.
- 각각의 모듈의 함수에 접근할 때는 모듈이름.매소드()의 형태로 접근한다.
** ' from 모듈명 import 함수명 ' 의 방식으로 접근하여 모듈명을 생략하는 방식 또한 가능하다. ****

실행문과 함수, 클래스 정의가 같이 있는 모듈
실행문과 함수, 클래스 정의가 동시에 존재하는 경우, 해당 모듈을 임포트 했을 때 실행되면 안되는 코드가 실행되는 경우가 존재한다.
ex) 해당 모듈의 함수, 클래스만 필요하지만 실행문이 실행되는 것을 원하지 않는 경우
**이때 불필요한 코드의 실행을 방지하기 위해서 __name__변수를 사용한다. **
이번에도 마찬가지로 하나의 디렉토리 안에 다음과 같은 파일들이 있다고 하자.

이때 cal.py는 n을 입력했을 때 n단을 출력하는 함수와 3단을 출력하는 실행문이 있는 모듈이다.
메인 모듈에서는 함수의 기능만 사용하기를 원하기 때문에 __name__ 변수 조건문을 통해 임포트 되었을 때
실행문이 실행되지 않도록 처리한다.


이때의 출력 결과는 다음과 같이 9단만 출력되는 것을 확인할 수 있다.

결론 : 모듈을 제작할 때 실행문이 있고 다른 모듈에서 임포트해서 사용할 경우가 있다면 __name__ 내장 변수를 활용하여
실행문이 메인 모듈로 호출될 때만 동작하도록 처리하는 것이 좋다.
모듈 만들기
모듈 이름 규칙
- 가급적 짧은 소문자로 된 이름을 사용하는 것이 좋다.
- 대. 소문자를 구분하지 않는 파일시스템에서 문제가 될 수 있기 때문이다.
(대.소문자를 혼용하여 이름을 지을 수도 있지만 소문자만 사용하는 것이 권장된다.)
- 특수문자도 사용하지 않는 것이 좋다. (가독성을 위한 언더바는 사용이 가능하다.) ex) hello_main.py
실행문만 있는 모듈 정의하기 - 앞에서 한 내용이므로 skip
함수가 있는 모듈 정의하기 - 같은 이유로 skip
스크립트로 실행한 모듈에서 인자값 얻기
해당 파트는 조금 생소할 수 있다.
본래 input()이라는 표준 입력 함수가 존재하는데 왜 sys모듈을 임포트해서 argv 리스트를 사용하는지에 대한 의문이 생길 수 있다.
때문에, 해당 방법을 사용하는 상황부터 알아보겠다.
우선 sys 모듈은 파이썬 인터프리터를 제어하는 기본 모듈 중 하나이다.
기능은 크게 네가지로 구분할 수 있는데
1. 실행 환경 관련 --> 전달된 인자, 경로에 대한 정보 등
2. 입출력 제어 --> 입출력 환경 조정
3. 인터프리터 제어 --> 프로그램 종료 등
4. 내부상태 / 플랫폼 제어 --> 실행 중인 OS 정보 등
해당 파트에서 주로 사용하는 기능은 실행 환경 관련 부분이다. (sys.argv 리스트)
사용하는 상황 :
스크립트를 실행할 때 옵션이나 입력값을 외부에서 주고 싶을 때
--> 코드 안에 하드코딩하지 않고 실행 시점에 값을 바꿀 수 있게 한다.
예시 코드
# calc.py
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
op = sys.argv[3]
if op == "add":
print(a + b)
elif op == "sub":
print(a - b)
이때 옵션을 다음과 같이 주었을 때
python calc.py 10 5 add
15가 출력된다. 즉, 내가 실행중에 덧셈 연산을 수행할 것인지, 뺄셈을 할 것인지 정할 수 있게 해주는 것이다.
--> 실행 시점에 옵션을 주어 출력값을 바꾼다.
특징
- 첫번째 값은 항상 python 실행 모듈의 파일명이다. ---> python 모듈명.py
- 첫번째 값은 sys.argv[0]에 들어간다.
- 두번째 옵션 부터는 실질적인 입력값, 즉 인자값이다. 이는 sys.argv[1:] 에 해당한다
- len(sys.argv)는 넘겨진 인자값의 개수이다.
모듈 사용하기
- 기본적인 형태는 import 모듈명이다. 이때 해당 모듈의 함수를 불러와 사용하고 싶을 때에는
모듈명. 함수명()의 형태로 불러와 사용할 수 있다.
- from 모듈명 import 함수명을 통해 임포트 하면 모듈명 없이 함수에 바로 접근할 수 있다.
함수명()
- 모듈의 모든 함수, 클래스를 임포트할 경우에도 from import문을 사용한다.
from 모듈명 import * 은 해당 모듈에서 모든 함수를 임포트한다
하지만 모듈간의 함수가 겹쳐 혼동을 유발할 수 있으므로 가급적 필요한 함수만 임포트하는 것이 권장된다.
- 모듈 이름을 바꿔서 임포트하는 방법은 'import 모듈명 as 새로운 이름'이다. 모듈 이름을 더 쉽게 바꿔 사용하기 편하게 만들 수 있다.
ex) import numpy as np
모듈 검색 경로
이부분은 sys.path의 기능에 대해 설명하는 부분으로, sys.argv 보다 내용이 어렵게 느껴질 수 있다.
하지만 파이썬에서 모듈을 임포트할때 이를 검색하는 방식을 알면 쉽게 이해할 수 있다.
우선 sys.path는 파이썬에서 모듈이나 패키지를 import할 때, 어디서 그 모듈을 찾을지를 기록한 검색 경로 리스트를 반환한다.
이해를 위해 직접 실행해 보았다.

python path.py
['/home/alice/PyCharmProjects/PythonProject/20250921test',
'/usr/lib/python3.13/python313.zip',
'/usr/lib/python3.13/plat-x86_64-linux-gnu',
'/usr/lib/python3.13/lib-dynload',
'/usr/lib/python3.13',
'/home/alice/.local/lib/python3.13/site-packages']
하나 하나씩 뜯어보겠다.
- 우선 path.py 리스트의 첫번째 요소는 지금 실행한 파일 path.py가 저장된 경로이다.
때문에 같은 폴더(디렉토리) 안에 있는 파일들을 임포트 할 수 있는 것이다.
- 두번째 경로는 압축된 상태의 파이썬 표준 라이브러리를 임포트하기 위한 경로이다.
- 세번째 경로는 파이썬 DLL 파일들이 저장된 경로이다. ex) C 라이브러리 확장 등
(필요할 때만 불러오는 라이브러리라고 생각하면 된다.)
- 네번째 경로는 표준 라이브러리가 들어있는 디렉토리이다. os, sys, math등
- 다섯번째 경로는 실행기의 루트 경로이다.
- 여섯번째 경로는 pip으로 설치한 외부 라이브러리를 담고 있는 디렉토리이다. ex) pandas, numpy, seaborn 등
즉, 쉽게 말하면 sys.path는 실행된 모듈에서 다른 모듈을 임포트 할때 그 모듈들을 찾기 위한 경로를 담은 리스트이다.
패키지
패키지란 모듈을 구조화하고 효율적으로 관리하기 위해 나눠놓은 것이다.
상위 디렉토리 아래에 서로 연관된 기능의 모듈들이 저장되어있는 형식이다.
__init__.py , __all__변수
하나의 패키지 디렉토리에는 __init__.py라는 파일이 포함되어 있어야 한다.
해당 파일에는 __all__ 변수라는 리스트 변수가 담겨져있는데, 이 변수에는 해당 패키지에서 사용하는
모듈의 이름들이 담겨있다. 패키지에 모듈이 포함되어있더라도 __all__ 리스트 변수 내에 이름이 담겨있지 않다면 임포트 해서 사용할 수 없다. '*'을 사용해서 패키지의 모든 모듈들을 임포트 할때 __all__변수 내에 담겨있는 값들을 참조한다.
패키지 사용하기
- from 상위패키지.하위패키지 import * : 하위 패키지 내에 있는 모든 모듈들이 임포트 된다.
- from 상위패키지.하위패키지.모듈명 import 함수명 : 해당 함수만 임포트 된다.
- from 상위패키지.하위패키지.모듈명 import * : 해당 모듈의 모든 함수가 임포트 된다.
- import문 만을 사용하면 해당 패키지의 경로, 모듈 이름, 함수명을 모두 작성해야 하기에 권장되지 않는다.
ex) import food.fruits.apple
food.fruits.apple.eat() ---> 비효율적
표준 라이브러리 살펴보기
os모듈

- os.getcwd() : 현재 작업 중인 디렉토리의 경로를 출력한다.
- os.system() : 운영체제에서 사용하는 명령어를 사용할 수 있다.
sys 모듈 - 같은 내용이므로 skip
math 모듈
수학 계산과 관련된 함수와 상수를 제공한다.
기능 모음
- math.pi, math.pi -> 다양한 상수 제공
- math.ceil() -> 올림
- math.floor() -> 내림
- math.factorial() -> 계승
- math.gcd(a, b) -> 두 수의 최대공약수
- math.pow() -> 실수 지수 연산
random 모듈
- randint(시작값, 끝값) : 시작값 이상, 끝값 이하의 정수값 반환
- random() : 0이상 1미만 실수 값 반환
- uniform(시작값, 끝값) : 시작값 이상 끝값 미만의 실수값 반환
- randrange() : range 함수와 형식이 동일하며, 해당 범위에서 무작위 정수 값 반환
randrange(stop) : 0 이상 stop 미만
randrange(start, stop) : start 이상 stop 미만
randrange(start, stop, step): start 부터 stop 미만 증가폭 step인 수
- random.choice(리스트) : 주어진 리스트에서 무작위로 추출한 값을 반환
- random.shuffle(리스트) : 주어진 리스트의 순서를 섞는다. reverse나 sort와 같이 변경된 정보가 리스트에 반영되므로, 반환값이 없다.
- random.sample(리스트, 개수) : 주어진 리스트에서 특정 개수를 중복 없이 추출한다. 많은 데이터에서 임의로 몇개의 데이터를 고를 때 사용


datetime 모듈


- datetime 모듈에서 datetime 클래스를 임포트 했다.
- today는 datetime 클래스의 객체
- '.'을 통해 객체의 속성에 접근하고 있다. (year, month, day 등)
- weekday() 매소드를 통해 현재 요일 (월요일)을 출력했다.
- 클래스의 생성자를 호출하여 값이 모두 지정된 day라는 객체를 만듦
- today에서 day를 뺌으로써 현재 시각을 출력한다.
** 매소드는 ()를 통해 접근하는 반면, 속성은 그 객체가 갖고 있는 데이터이기 때문에 '()'없이 접근이 가능하다. 이점을 주의 **
대단원 종합평가
import sys
if len(sys.argv) == 1:
print("안녕하세요")
elif sys.argv[1] == "-h" or sys.argv[1] == "--help":
print("도움말...")
else:
print("안녕하세요")

- sys모듈을 통해 인자값의 개수, 종류에 따라 출력값을 달리 하는 코드였다.
두번째 예제
리스트를 만들어 random.sample을 이용하여 중복값을 없애고 숫자 6개를 뽑는 코드이다.
import random
print(random.sample(range(1, 46), k = 6))

세번째. 앞에서 다룬 datetime이므로 생략
객체지향과 클래스
절차지향 언어와 객체지향 언어의 장단점
절차지향 언어
장점:
- 코드의 실행 속도가 빠르다
- 컴퓨터 구조에 대한 이해가 있으면 빠르게 동작하도록 최적화를 할 수 있다.
단점:
- 유지보수가 어렵다.
- 직관적인 코드분석이 어렵다.
- 대형 프로젝트를 하기에는 문법적 편의성이 좋지 못하다.
객체지향 언어
장점:
- 코드의 재사용이 용이하다.
- 유지보수가 쉽다.
- 대형 프로젝트를 관리하기에 적합하다.
단점:
- 코드의 실행 속도가 생대적으로 느리다
- 초기 설계가 어려우며 많은 비용이 투자된다.
클래스
클래스의 필요성 : 현실세계에서 관찰할 수 있는 여러 객체들을 코드의 형태로 구현하기 위해 필요하다. --> 현실세계를 표현하기 위해서 필요하다.
클래스 활용
생성자 메소드
*생성자 메소드란?
사용자가 지정하는 일반적인 메소드와는 달리, 특수한 경우에 실행되는 메소드를 '특수메소드'라고 한다. 생성자 메소드 또한 이에 포함되며, 객체를 생성할 때 실행된다.
형태 : def __init__(self, 변수1, 변수2 .....) :
이때 첫번째 매개변수인 self는 인자값을 넘겨줄 때 고려하지 않는다. 코드에서 내부적으로 처리되기 때문이다. 하지만 메소드를 정의할 때는 반드시 써주어야 한다.
'기록' 카테고리의 다른 글
| CodeForces 가입 2025.10.19 (2) | 2025.10.19 |
|---|---|
| 백준 플레티넘 달성기 2025.10.18 (1) | 2025.10.18 |
| 파이썬 교과서 내용 정리 53 ~ 123pg (0) | 2025.09.21 |
| 파이썬 교과서 내용 정리 10 ~ 52pg (0) | 2025.09.21 |
| 중간점검 2 (4) | 2025.08.17 |