[인공지능사관학교] Python (6)

Suhyeon Lee·2025년 6월 15일

지난 시간 복습

os 라이브러리

os — Miscellaneous operating system interfaces

  • 기능에 대해 알아볼 때 파이썬 기술 문서(docs.python.org)를 가장 먼저 볼 것!

cmd

  • dir
    • 현재 디렉토리의 파일 및 하위 디렉토리 목록을 표시
    • 하위 객체 세부 정보 확인
  • dir/w
    • 하위 객체 이름 확인

헷갈리는 용어 정리

자세한 내용은 이 블로그 글 읽어보기

library/package/module

  • 모듈이 모이면 패키지가 되고, 패키지가 모이면 라이브러리가 됩니다.
    (라이브러리 ≥ 패키지 ≥ 모듈)
  • 라이브러리는 여러 패키지와 모듈을 모아둔 것
    • 판다스, 셀레니움과 같은 것들이 라이브러리
  • 패키지는 특정 기능과 관련되어 있는 여러 가지 모듈을 모아 둔 폴더
  • 모듈은 함수와 변수, 클래스를 모아둔 것
    • 일반적으로 파일 하나가 모듈('math.py')

library/framework/API

  • 라이브러리
    • 응용 프로그램 개발을 위해 필요한 기능을 모아 놓은 소프트웨어
    • 그 기능에 대한 도구 또는 함수들의 집합
  • API
    • 응용 프로그램을 만드는데 사용되는 interface
      • interface: 사물간, 사람간, 또는 사람과 사물간에 상호작용을 할 수 있도록 연결해주는 장치, 방법, 형식, 공간 등을 통칭
    • 응용 프로그램을 만드는데 필요한 연결 장치, 매개체
    • 실제 개발을 할 때는 여러 컴포넌트를 합쳐서 개발을 하게 되고, 각각의 컴포넌트들은 API를 가지고 있으며 이때 많은 컴포넌트들이 라이브러리의 형태로 제공되기 때문에 API와 라이브러리는 혼동할 수 있음
  • framework
    • 뼈대나 기반구조라는 뜻
    • 응용프로그램이나 소프트웨어 구현을 수월하게 하기 위해 제공된 소프트웨어 환경
    • 프로그래밍을 진행할 때 필수적인 코드, 알고리즘 등과 같이 어느 정도 구조를 제공해주기 때문에 프레임워크를 사용하는 프로그래머는 이 프레임워크 뼈대 위에서 코드를 작성하여 프로그램을 개발하면 됨
      • 프레임워크만으로 실행되지 않고, 기능을 추가해야 하며, 프레임워크에 의존하여 개발해야 하고, 프레임워크가 정의한 규칙을 준수해야 함
    • 완성된 제품을 만들기 위해 개발자를 도와주는 또는 기반이 되는 역할: 소프트웨어의 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합
      • 예 : Spring, Django, Node.js
  • vs. framework
    • 라이브러리: 내가 직접 라이브러리를 호출해서 사용
      • 시험 평균 점수를 구하고자 한다면, 아래와 같이 내가 필요한 시점에 라이브러리를 호출해서 사용
        double average = library.calculate(scores);
    • 프레임워크: 프레임워크가 나를 호출하는 방식으로 동작
    • 차이점 : 흐름을 누가 가지고 있는가
      • 프레임워크는 전체적인 흐름을 자체적으로 가지고 있어 프로그래머는 그 안에서 필요한 코드를 작성
      • 라이브러리는 프로그래머가 전체적인 흐름을 가지고 있어 라이브러리를 자기가 원하는 기능을 구현하고 싶을 때 가져다 사용
      • 프레임워크는 가져다 사용하는 개념보다는 프레임워크라는 특정 공간에 들어가서 사용한다는 느낌이 더 강함
흐름 소유예시
프레임워크전체적인 흐름을 자체적으로 지님
라이브러리프로그래머가 전체적인 흐름을 지님가구
  • vs. API
    • 라이브러리
      • 컴포넌트 자체
    • API(Application Programming Interface)
      • 컴포넌트를 활용하기 위한 규약

vs. flatform/architecture

  • 라이브러리
    • 간략 설명: 프로그램 제작 시 필요한 기능
    • 비교 설명: 자동차 바퀴, 자동차 헤드라이트, 자동차 에어백

재사용이 필요한 기능으로 반복적인 코드 작성을 없애기 위해 언제든지 필요한 곳에서 호출하여 사용할 수 있도록 Class나 Function으로 만들어진 것
사용 여부는 코드 작성자 선택 사항이며 새로운 라이브러리 제작 시에도 엄격한 규칙이 존재하지 않아 제작 의도에 맞게 작성하면 됨

  • 가장 유명한 자바스크립트 라이브러리는 jQuery임
  • 그래픽 사용자 인터페이스(Graphical user interface , GUI)에서 재사용하기 쉽게 버튼, 테이블 같은 구성 요소를 호출해서 쓸수 있도록 분리해두었다면 라이브러리임
  • Windows에서 간혹 보았을 dll 확장자는 동적 링크 라이브러리(dynamic-link library, DLL)의 약자로 라이브러리라고 할수 있음
  • 객체지향 프로그래밍(object-oriented programming, OOP)은 기본적으로 각 기능마다 함수화하는 것 → 클래스 라이브러리라고 할 수 있음
  • 프레임워크
    • 간략 설명: 프로그램 기본 구조(뼈대)
    • 비교 설명: 자동차 프레임

원하는 기능 구현에만 집중하여 빠르게 개발 할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것
위에서 설명한 라이브러리가 포함되어 있음
겉보기에는 비슷하지만 많은 프레임워크가 존재하는 이유는 아래에서 설명하게 될 아키텍처가 다른 것이며 규칙을 준수해야 되는 이유이기도 함

  • Java 개발자라면 Spring!
  • Python 개발자라면 Django!
  • JavaScript 개발자라면 Angularjs!
  • PHP 개발자라면 Laravel!
  • 아키텍처
    • 간략 설명: 프로그램 주요 구조 설계
    • 비교 설명: 자동차 도면

기획한 내용을 프로그램화했을 경우 필요한 주요 특징을 기술적으로 설계하고 명시하는 것
결과물에 필요한 모든 구성 요소를 명시하지만, 구체적인 구현 방법은 포함되어 있지 않음
(플랫폼은 주요 특징이지만 프레임워크와 라이브러리는 주요 특징이 아니므로 명시되지 않을 가능성이 큼)
자동차 설계로 예를 들면 자동차 헤드라이트가 본넷 밑에 사각형 모양으로 존재한다고 설계하고 헤드라이트 고정 방식이 접착제인지, 볼트인지는 명시되지 않는다고 볼 수 있음(하지만 상황에 따라 포함될 수도)

  • 플랫폼
    • 간략 설명: 프로그램 실행 환경
    • 비교 설명: 자동차 주행 환경(일반 고속도로용, 사막 전용, 경주용, 달 탐사용)

프로그램이 실행되는 환경
플랫폼 위에 다른 플랫폼이 존재할 수 있음
(Windows에서 Java로 개발, 앱스토어에서 어플을 내려받는 과정 → 이미 3개의 플랫폼을 사용하고 있는 것)
플랫폼은 같은 영역에도 다양한 목적과 가치로 많이 만들어지고 있으며 모든 플랫폼에서 실행되도록 개발하기는 어려움: 프로그램의 목적에 맞도록 플랫폼을 선택하는 것이 중요함

  • Windows, Linux, macOS등 O/S는 모두 플랫폼
  • 어플을 다운받는 앱스토어, 구글플레이, 원스토어도 플랫폼
  • V8 JavaScript Engine: JavaScript에게 큰 힘이 되어주고 있는 플랫폼
  • Java 프로그램은 OS제약이 없지만 실행하기 위해서는 해당 OS에 자바 가상 머신(Java Virtual Machine, JVM)위에서 실행되므로 Java 플랫폼이 필요

function/method

  • 함수는 특정 작업을 독립적으로 수행하는 단위
  • 메서드는 클래스 안에 포함되어 있는 함수
    • 클래스 함수라고도 함
    • 특정 자료에 대해 특정 기능을 하는 코드(특정 자료형 뒤에 .을 찍어 사용)
  • 즉, 함수는 메서드의 개념을 포함(함수 ⊃ 메서드)
def get_square_num(n):
	return n * 2
print(get_square_num(3))
class MathTest():
	def get_square_num(self, num):
    	return num * 2
test = MathTest()
print(test.get_square_num(3))

parameter/argument

  • 매개변수
    • 입력 변수(variable)명
    • 함수의 정의에서, 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수
  • (전달) 인자
    • 함수와 메서드의 입력 값(value)
    • 함수가 호출될 때 함수로 값을 전달해주는 값

class/object

  • 클래스를 기반으로 객체를 만듦
    • 붕어빵 틀과 붕어빵
  • 클래스: 객체를 위한 설계도
  • 객체: 클래스를 기반으로 만들어진 객체

모듈

모듈의 개념

모듈(Module)

  • 파이썬 파일(.py) 하나가 하나의 모듈
  • 여러 함수와 변수를 모아놓은 파일
  • 다른 파일에서 가져와서 사용할 수 있음

모듈과 라이브러리
라이브러리는 모듈과 비슷한(거의 같은) 개념이다.
라이브러리는 여러 모듈을 포함하는 더 큰 개념
모듈은 단일 파일에 담긴 코드 단위이고, 라이브러리는 여러 모듈이나 패키지를 포함하여 특정 기능을 제공하는 코드 집합
즉, 모듈이 모여 라이브러리를 구성한다고 볼 수 있음

  • 생활 코딩에서 설명하는 차이점
    • 모듈이 프로그램을 구성하는 작은 부품의 느낌이라면, 라이브러리는 자주 사용 되는 로직을 잘 정리한 집합 느낌이다.
  • 위키독스 '문과생도 할 수 있는 파이썬 업무':
    • 모듈은 하나의 파이썬 파일, 패키지는 여러 모듈들을 구조적으로 관리하는 방법, 그리고 라이브러리는 특정 기능을 제공하기 위한 코드의 집합(모듈 또는 패키지)
  • 위키백과에서는 라이브러리를 다음과 같이 설명:
    • 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임으로 구성 데이터, 문서, 도움말 자료, 메시지 틀, 미리 작성된 코드, 서브루틴(함수), 클래스, 값, 자료형 사양을 포함할 수 있다.

모듈 가져오기(import)

  • import 키워드를 사용해 다른 파일에서 정의된 함수와 변수를 가져올 수 있음
import math
print(math.sqrt(16)) # 출력: 4.0

모듈의 특정 함수만 가져오기

  • from ... import ... 구문을 사용하면 모듈에서 특정 함수나 변수만 가져올 수 있음
from math import sqrt
print(sqrt(16)) # 출력: 4.0

모듈 이름 변경

  • as 키워드를 사용해 모듈 이름을 다른 이름으로 변경할 수 있음
import math as m
print(m.sqrt(16)) # 출력: 4.0

모듈의 모든 함수 가져오기

  • from ... import * 구문을 사용해 모듈 내 모든 함수나 변수를 가져올 수 있음
from math import *
print(sqrt(16)) # 출력: 4.0
print(pi) # 출력: 3.141592653589793

모듈 만들기

math_utils.py

def add(a, b):
    return a + b
def multiply(a, b):
    return a * b

모듈 불러오기

main.py

import math_utils

print(math_utils.add(3, 5)) # 출력: 8
print(math_utils.multiply(4, 6)) # 출력: 24

람다 함수 & 컴프리헨션

lambda

  • 이름이 없는 함수(익명 함수)
    • def 키워드를 사용하여 정의하는 일반적인 함수와 달리 한 줄로 간단하게 정의 가능
    • '람다 식'이라 부르기도 함

문법

lambda 매개변수1, 매개변수2, ... : 표현식
  • lambda: 람다 함수를 선언하는 키워드
  • 매개변수: 입력 값(여러 개 가능)
  • 표현식: 연산 결과를 반환(return 사용 불가)

비교: 일반 함수 vs 람다 함수

  • 일반적인 함수
def add(x, y):
	return x + y

print(add(3, 4)) # 출력: 7
  • 람다 함수로 변환
add = lambda x,y: x+y
print(add(3,4))

  • def 키워드를 사용한 일반 함수는 여러 줄을 사용할 수 있지만, lambda 함수는 한 줄로 간단히 표현할 수 있음

변수에 람다 함수 저장

add = lambda a, b: a + b
print(add(10, 20))
  • 람다 함수를 변수에 할당해 재사용할 수 있음
    • lambda a, b: a + badd 변수에 저장
    • add(10, 20)을 호출하면 30 출력

람다 함수를 직접 호출

print((lambda x, y: x * y)(3, 5))
  • 람다 함수는 변수에 저장하지 않고도 바로 실행 가능
    • lambda x, y: x + y와 같이 람다 함수를 정의하고 (3, 5) 값을 즉시 전달하여 실행
    • 결과값 3 * 5 = 15가 출력됨

람다 함수 예제

  • 리스트 요소 제곱: map 활용
    • map(함수, 함수에 쓸 연속 자료형)을 사용해 리스트의 모든 요소를 람다 함수로 처리 가능
numbers = [1, 2, 3, 4, 5,]
squared = list(map(lambda x: x**2, numbers))
print(squared)

List Comprehension

  • 한 줄로 리스트를 생성하는 방법
  • 기존 for 문을 사용하는 방법보다 더 간결하고 가독성이 좋음

문법

[표현식 for 변수 in 반복할_리스트]
  • 표현식: 리스트의 요소를 어떻게 변환할지 지정
  • for 변수 in 반복할_리스트: 기존 리스트를 순회하면서 요소를 가져옴

예제

  • 기존 for문 방식
numbers = [1, 2, 3, 4, 5,]
squared = []
for num in numbers:
    squared.append(num**2)

print(squared)
  • 리스트 컴프리헨션 방식
numbers = [1, 2, 3, 4, 5,]
squared = [num ** 2 for num in numbers]

print(squared)

→ 리스트 컴프리헨션을 사용하면 코드가 더 짧아지고 직관적임

조건문을 포함한 리스트 컴프리헨션

  • 짝수만 필터링해서 리스트 생성(if문 활용)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers)
profile
2 B R 0 2 B

0개의 댓글