본문 바로가기

기록

파이썬 교과서 내용 정리 124 ~ 187pg

하나의 값을 리턴하는 함수 - 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는 실행문 만으로 되어있다.

 

hello2.py
greeting2.py

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

insa2.py

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

insa2.py

특징

- 일반적으로 메인 모듈로 사용하기 위해 만든 모듈이다.

- 실행문으로 된 모듈은 임포트한 순서에 따라 결과가 달라진다.

- 이때, 임포트를 하는 것은 해당 모듈의 코드를 복사하는 효과가 있다(임포트 하는 즉시 실행되므로)\

 

 

함수, 클래스, 정의만 있는 모듈

 

또다시 다음과 같은 디렉토리 안에 다음과 같은 모듈들이 있다고 하자.

이때, hello_func.py 모듈과 greeting_func.py는 함수의 정의만으로 구성된 코드이다.

같은 디렉토리 내의 모듈들
hello_func.py
greeting_func.py

 

main_func.py

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

main_func.py

 

이때  '__name__'내장변수로, 해당 모듈이 어떤 방식으로 실행되고 있는지 알려준다.

- 해당 모듈이 다른 모듈에서 임포트되어 실행되었을 때 : __name__ : 모듈명

- 해당 모듈이 임포트 되지 않고 메인모듈로서 실행되었을 때 : __name__ : "__main__"

 

코드 설명 :

- 각각의 함수 모듈들은 함수 내에서 모듈의 이름과 실행 위치를 출력하였다.

- 메인모듈에서는 각각의 모듈들을 임포트 하고, 이를 호출하였다. 메인 모듈에서 또한 실행 위치를 출력하였다.

- hello_func.py와 greeting_func.py는 임포트되었기에 실행 위치가 모듈명으로 되어있는 것을 확인할 수 있으며,

main_func.py는 메인 모듈이기 때문에 실행 위치가 __main__으로 출력되는 것 또한 알 수있다.

- 각각의 모듈의 함수에 접근할 때는 모듈이름.매소드()의 형태로 접근한다.

 **     ' from 모듈명 import 함수명 ' 의 방식으로 접근하여 모듈명을 생략하는 방식 또한 가능하다.  ****

main_func.py

 

 

 

실행문과 함수, 클래스 정의가 같이 있는 모듈

 

실행문과 함수, 클래스 정의가 동시에 존재하는 경우, 해당 모듈을 임포트 했을 때 실행되면 안되는 코드가 실행되는 경우가 존재한다.

ex) 해당 모듈의 함수, 클래스만 필요하지만 실행문이 실행되는 것을 원하지 않는 경우

 

**이때 불필요한 코드의 실행을 방지하기 위해서 __name__변수를 사용한다. **

 

이번에도 마찬가지로 하나의 디렉토리 안에 다음과 같은 파일들이 있다고 하자.

 

이때 cal.py는 n을 입력했을 때 n단을 출력하는 함수와 3단을 출력하는 실행문이 있는 모듈이다.

메인 모듈에서는 함수의 기능만 사용하기를 원하기 때문에 __name__ 변수 조건문을 통해 임포트 되었을 때

실행문이 실행되지 않도록 처리한다.

cal.py
cal_main.py

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

 

cal_main.py

 

 

 

결론 : 모듈을 제작할 때 실행문이 있고 다른 모듈에서 임포트해서 사용할 경우가 있다면 __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할 때, 어디서 그 모듈을 찾을지를 기록한 검색 경로 리스트를 반환한다.

이해를 위해 직접 실행해 보았다.

path.py

 

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모듈

 

test_os.py

 

- 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(리스트, 개수) : 주어진 리스트에서 특정 개수를 중복 없이 추출한다. 많은 데이터에서 임의로 몇개의 데이터를 고를 때 사용

random_test.py
결과값

 

 

 

datetime 모듈

 

datetime_test.py
출력값

- 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("안녕하세요")

 

os.py

- sys모듈을 통해 인자값의 개수, 종류에 따라 출력값을 달리 하는 코드였다.

 

두번째 예제

리스트를 만들어 random.sample을 이용하여 중복값을 없애고 숫자 6개를 뽑는 코드이다.

import random
print(random.sample(range(1, 46), k = 6))

lotto.py

세번째. 앞에서 다룬 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