파이썬 입출력 및 함수

Suhyeon Lee·2024년 10월 18일
0

함수 및 모듈

함수

  • 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것
  • 프로그래밍을 하다 보면 하나의 기능을 여러 군데에서 사용해야 하는 경우가 있는데, 그럴 때마다 반복해서 똑같은 내용을 적는 것이 아닌 기능 단위로 함수로 만들어 재사용할 수 있음

예시

"""
기본 함수의 구조

def 함수명(매개변수):
    수행할문장
"""

def add(x, y):
    return x + y

print(add(4,5))
  • 숫자 두 개를 입력받아 더해주는 함수
    • 함수 이름: add
    • 두 개의 입력을 받아 둘을 합친 값을 리턴(출력)

헷갈릴 수 있는 정의 짚고 넘어가기

  • 매개변수(parameter): 함수를 정의할 때 사용되는 변수(variable)
  • 인수(argument): 함수를 호출할 때 넘기는 변수(variable)
  • 위의 함수에서 add(x,y)의 x, y는 매개변수, print 안의 add(4,5)에서의 4, 5는 인수

입/출력(인쇄, 입력)

"""
입출력
입력을 받아 어떤 변수에 대입하고 싶을 때는 어떻게 할까?
"""

a = input()

print(a)

num = input("숫자를 입력하세요: ")

print(num)

"""
출력
"""
# 출력을 ""로 구분하면 +와 같다
print("Hello""world")
print("Hello"+"world")
# 출력을 ,로 구분하면 띄어쓰기
print("Hello","world")


파일 입/출력(열기, 읽기, 쓰기)

"""
파일 읽고 쓰기
open("파일.txt", "r") 파일 내용을 읽을때
open("파일.txt", "w") 파일 내용을 쓸때
open("파일.txt", "a") 파일 마지막에 새로운 내용을 추가할때
"""

# 파일 생성
f = open("텍스트파일.txt", "w")
f.close()

# 파일 쓰기
f = open("텍스트파일.txt", "w")
for i in range(1, 11):
    line = f"{i}번째 줄\\n"
    f.write(line)
f.close()

# 파일에 새로운 내용 추가하기
f = open("텍스트파일.txt", "a")
for i in range(11, 21):
    line = f"{i}번째 줄\\n"
    f.write(line)
f.close()

"""
파일읽기
"""
# readline 한줄
f = open("텍스트파일.txt", "r")
line = f.readline()
print(line)
f.close()

# readline 모든줄
f = open("텍스트파일.txt", "r")
while True:
    line = f.readline()
    if not line:
        break
    print(line)
f.close()

# readlines
f = open("텍스트파일.txt", "r")
lines = f.readlines()
for line in lines:
    print(line)
f.close()

# \\n제거하여 출력하기
f = open("텍스트파일.txt", "r")
lines = f.readlines()
for line in lines:
    print(line.strip())
f.close()

# read 파일 전체 내용을 문자열로 리턴
f = open("텍스트파일.txt", "r")
all_lines = f.read()
print(all_lines)
f.close()

# 파일 객체를 반복하여 출력하기
f = open("텍스트파일.txt", "r")
for line in f:
    print(line)
f.close()

# with 문을 사용하여 파일을 f.close()를 자동으로
with open("텍스트파일.txt", "r") as f:
    print(f.read())

기본 객체 지향 프로그래밍(클래스, 객체)

객체지향 프로그래밍의 특징

클래스(class)

  • 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것
  • 객체를 만들기 위한 메타정보
  • '사과'라는 부류

인스턴스(instance; 객체)

  • 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것
  • 실제 프로그램에서 사용되는 데이터
  • '오늘 먹은 사과 두 개 중 첫 번째 것'이라고 콕 집을 수 있는 실체(instance)

객체지향 프로그래밍

  • 컴퓨터 프로그래밍 패러다임 중 하나
  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태화 행위를 가진 객체를 만들고 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
  • 4가지 특징과 5가지 원칙으로 많이 설명
  • 단일 책임의 원칙(SRP, Single Responsibility Principle)
    • 모듈이 변경되는 이유가 한 가지여야 함
    • 해당 모듈이 여러 대상 또는 액터들에 대해 책임을 가져서는 안 되고, 오직 하나의 액터에 대해서만 책임을 져야 한다
  • 개방 폐쇄 원칙 (Open-Closed Principle, OCP)
    • 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다
  • 인터페이스 분리 원칙 (Interface segregation principle, ISP)
    • 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해야 한다(클라이언트의 목적과 용도에 적합한 인터페이스만 제공)
    • 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스만을 접근하여 불필요한 간섭을 최소화
      • 퍼블릭 인터페이스: 외부에서 접근 가능한 메시지
  • 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
    • 하위 타윕은 상위 타입을 대체할 수 있어야 한다
    • 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다
  • 의존 역전 원칙 (Dependency Inversion Principle, DIP)
    • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에 의존해야 한다

객체 지향의 4가지 특징

1) 추상화(Abstraction)

  • "공통의" 속성이나 기능을 묶어 이름을 붙이는 것
  • 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미

2) 캡슐화(Encapsultaiton)

  • 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는 것
  • 목적
    1. 코드를 재수정 없이 재활용 가능하게 하기 위해서
    2. 접근 제어자를 통한 정보 은닉

3) 상속(Inheritance)

  • 부모 클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하는 것
  • 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것

4) 다형성(Polymorphism)

  • 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것
  • 오버라이딩(Overriding), 오버로딩(Overloading)이 가능
    • 오버라이딩(Overriding)
      • 부모 클래스의 매서드와 같은 이름, 매개변수를 재정의 하는 것
      • 원래 있던 내용을 상속받아 쓰면서 다른 기능으로 사용할 수 있게 해주는 것
    • 오버로딩(Overloading)
      • 같은 이름의 함수를 여러 개 정의하고 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
      • 이름은 같은 함수가 매개변수의 개수에 따라 다른 동작을 하는 것
'''
오버라이딩
'''
class Animal:
    def make_sound(self):
        print("The animal makes a sound.")

class Dog(Animal):
    def make_sound(self):
        print("The dog barks.")

# create an instance of the Dog class
my_dog = Dog()

# call the make_sound method of the Dog class
my_dog.make_sound()

'''
오버로딩
'''
class Calculator:
    def add(self, a, b, c=0):
        return a + b + c
    
# create an instance of the Calculator class
my_calculator = Calculator()

# call the add method with two arguments
result1 = my_calculator.add(2, 3)
print(result1)  # outputs 5

# call the add method with three arguments
result2 = my_calculator.add(2, 3, 4)
print(result2)  # outputs 9

파이썬에서는 오버로딩을 정식으로 지원하지 않고 구현은 가능하다

클래스 예시

class Animal:
    def __init__(self, name):
        self.name = name
    def move(self):
        print("move")
    def speak(self):
        pass
 
class Dog (Animal):
    def speak(self):
        print("bark")
 
class Duck (Animal):
    def speak(self):
        print("quack")

Quiz

Q1

  • 함수와 메소드의 차이점은 무엇인가요?

🡆
메소드는 클래스 내에서 정의되고 해당 클래스의 인스턴스에서 호출되는 함수
함수는 보통 모듈 수준에서 정의되고 호출되는 코드 블록

함수는 일반적으로 모듈 수준에서 정의되고 호출되는 코드 블록입니다. 메소드는 클래스 내에서 정의되고 해당 클래스의 인스턴스에서 호출되는 함수입니다.

Q2

  • 객체 지향 프로그래밍에서 객체는 무엇인가요? 파이썬에서 객체는 어떻게 만들어지나요?

🡆
객체는 어떤 속성값과 행동을 가지고 있는 데이터
클래스를 정의하고 이걸 인스턴스(실제로 메모리에 할당하는 것)화하면 객체를 만들 수 있음

객체는 데이터와 해당 데이터를 조작하는 메소드를 포함하는 소프트웨어 개체입니다. 파이썬에서 객체는 클래스를 정의하고 이를 인스턴스화하여 생성됩니다.

Q3

  • 파이썬에서 함수의 매개변수에 디폴트 값을 설정하는 방법은 무엇인가요?

🡆
매개변수 이름 뒤에 등호 쓰고 원하는 값 넣으면 됨

파이썬에서 함수의 매개변수에 디폴트 값을 설정하려면 매개변수 이름 뒤에 등호와 함께 값을 할당하면 됩니다. 예를 들어,
def my_func(a, b=2, c=3)
와 같이 함수를 정의하면, b와 c 매개변수에는 각각 기본값 2와 3이 설정됩니다.

Q4

  • 아래 코드에서 예상되는 출력은 무엇인가요?
def square(x):
    return x * x

def apply(func, x):
    return func(x)

print(apply(square, 5))

🡆
25

코드는 25를 출력합니다. apply 함수는 함수와 값을 인수로 받으며, 함수를 해당 값에 적용하여 결과를 반환합니다. 여기서 square 함수와 인수 5
apply 함수에 전달하면 square(5)가 실행됩니다

Q5

  • 다음과 같이 클래스를 정의했다고 가정하고 이 클래스를 통하여 객체를 생성하고, 너비와 높이를 5와 10으로 설정, 넓이와 둘레를 출력하는 코드를 작성해보세요
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def around(self):
        return 2 * (self.width + self.height)

🡆

rect = Rectangle(5, 10)
print(Rectangle.area())
print(Rectangle.round())

Q6

  • 아래 코드의 결과값은 무엇일까요?
def my_func(a, b, c):
    print(a, b, c)


my_list = [1, 2, 3]

my_func(*my_list)

🡆
1 2 3

코드는 1 2 3을 출력합니다. my_list[1, 2, 3]이고, my_func(*my_list)my_func(1, 2, 3)과 동일합니다. 함수 my_func는 인수를 세 개 받으므로, 1, 2, 3이 차례대로 출력됩니다.

profile
2 B R 0 2 B

0개의 댓글