시리즈:중급 프로그래밍 시리즈/파이썬

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.
리브레 프로그래밍 시리즈
초급
프로그래밍
중급
프로그래밍
고급
프로그래밍
Python
협업

초급 단계[편집 | 원본 편집]

스크립트 파일을 만들자[편집 | 원본 편집]

그동안은 이런 창에서 코드를 입력하여 결과를 보았습니다. 지금부터는 파일에 코드를 입력하여 한꺼번에 실행하는 방법을 배우도록 하겠습니다.

함수[편집 | 원본 편집]

내장함수[편집 | 원본 편집]

내장함수란 것은 범위를 어떻게 잡느냐에 따라서 의미가 변합니다.

하지만 이 곳에서는 import를 하지 않고 기본적으로 사용할 수 있는 클래스와 함수를 대상으로 설명합니다.

위에서 언급 했듯이 import를 하지 않고 사용할 수 있는 함수가 내장함수입니다.

print, for, if, while... 등 모두 내장함수로 분류되는 함수들입니다.

크게보면 list(), dict(), str(), int() 등 생성자(constructor)로 생성한 객체에서 쓸 수 있는 함수도 내장함수라 부를 수 있겠습니다.

선택 매개변수[편집 | 원본 편집]

Python에서는 매개변수에 기본 값을 넣어서 함수를 사용할 때, 인자를 생략할 수 있게 하는 방법이 있습니다.

다만 기본 값 생략은 오른쪽 인자에서부터 좌측으로부터 순서대로 사용이 가능합니다.

def NumAdd( v , v2 = 1):
 return v + v2
변수1 = 5
변수1 = NumAdd(변수1,5)
print(변수1)
변수1 = NumAdd(변수1)

람다 함수[편집 | 원본 편집]

람다 함수(익명 함수)는 특이한 함수인데요, 바로 이름이 없는 함수입니다. 주로 한번 사용하고 버리는 함수, 함수에 변수로써 넘겨줄 함수에 사용됩니다. 람다 함수를 변수에 넣어줄 수도 있습니다. 또한 람다 함수를 매개변수로 받는 함수도 있습니다.

lambda 변수 목록: 명령문

예시:
칭찬 = lambda 누구, 어떤: 누구+"은(는) 되게 "+어떤+"것 같아." #lambda 함수의 가장 큰 특징은 return 함수가 없어도 자동으로 return이 된다는 점입니다.

print (칭찬("파이썬", "쉬운"))
print (칭찬("너", "잘 생긴"))

def 말하기(방법, 내용들):
    for 내용 in 내용들:
        방법(내용)

말하기(lambda 내용: print(내용+"?"), ["이것은 근성체다"])#이런식으로 다른 함수에게 인자로 넘길 수도 있고, 값을 넘기는 대신 실행만 할 수도 있습니다.
말하기(lambda 글자: print(" " if 글자 == " " else "ㄹ", end=""), "이것은 ㄹ체다")
print()

결과:
파이썬은() 되게 쉬운  같아.
너은() 되게  생긴  같아.
이것은 근성체다?
ㄹㄹㄹ ㄹㄹㄹ

함수스택[편집 | 원본 편집]

재귀함수[편집 | 원본 편집]

재귀함수란 쉽게 풀어 쓰면 자기호출을 하는 함수라는 뜻입니다.

def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

위의 코드는 피보나치수를 반환하는 함수입니다.

위와같이 자기 자신을 불러 계산하는 것을 재귀함수라 부릅니다.

재귀함수는 과거 반복문이 없었을 때에 반복문으로 사용하기 위해 나온 편법이므로 반드시 필요하지 않으면 사용하지 않는 것이 좋습니다.

도와줘요! help 함수 사용하기[편집 | 원본 편집]

객체지향[편집 | 원본 편집]

객체지향이란[편집 | 원본 편집]

객체지향 프로그래밍(Object-Oriented Programming/OOP)이란 우리가 일상생활에서 생각하는 대로 프로그램 내부의 '객체'를 다루기 위한 기법입니다.

올바르지 않은 표현이지만 자동차를 예로 들면, 자동차는 크게 나누어 바퀴와 차체로 나누어 집니다.

기능적으로 설명하면 바퀴는 굴러가고 차체는 안에 사람이나 짐을 싣고 동력을 바퀴에 전달하죠.

또 차체는 문과 창문, 프레임, 파워트레인, 엔진 등으로 나눌 수 있고요.

또 그것을 기능적으로 설명하고, 그 물건을 또 나누고....

이렇게 해서 모든 부품과 부품의 역할을 설명할 수 있게 하는 것이 객체지향 프로그래밍의 첫 번째 목적입니다.

객체지향 프로그래밍을 하다보면 용어가 헷갈릴 수 있는데요. 객체를 로봇에 비유하면 클래스는 로봇의 설계도이고 객체(오브젝트)는 설계도대로 찍어낸 로봇입니다. 여기서 메소드는 로봇의 팔다리로 비유할 수 있습니다.

C 언어에 비유하면 함수가 딸린 구조체입니다.

클래스[편집 | 원본 편집]

클래스는 쉽게 말해서 로봇의 설계도 입니다.

모든 로봇은 설계도가 필요합니다.

그 설계도로 찍어낸 것이 객체입니다.

그 객체들이 자기 자신을 움직이거나 어떤 행동을 할 때 메소드가 작동하는 것이고 이때 자신이 가지고 있는 물건(필드)을 사용하기도 합니다.

설계도 혼자서는 아무 것도 할 수 없습니다. 때문에 클래스는 정적인 존재 객체는 동적인 존재로 봐도 무방합니다.

물론 이 설명이 완벽한 것은 아니지만 대충 비슷한 원리로 생각하시면 될 것 같습니다.

객체[편집 | 원본 편집]

객체는 여러 기능과 사용할 물건들이 명시되어 있는 클래스에 의해 만들어진 로봇입니다. 로봇끼리도 상호작용을 하지요. 객체가 없는 언어에서는 외부의 함수가 물건들을 만지고 버리고 만드는 수 밖에 없습니다. 객체가 있는 언어에서는 물건에 달린 기능(메소드)을 이용해서도 물건을 만질 수 있습니다.

스피커에 비유하면 C언어에서는 스피커의 볼륨을 조절하는 함수가 따로 있고 객체지향에서는 스피커에 달린 볼륨 다이얼(메소드)로 볼륨을 조절할 수 있습니다.

ABS라는 이름을 가진 물건(A)들을 조작하는 함수가 있습니다. 그런데 이 함수는 어떤 물건(B)에서는 작동이 안됩니다. 그래서 ABS-B라는 함수를 만들었습니다. 그런데.. 또 다른 물건(C)에서는 작동이 안됩니다. 또 ABS-C라는 함수를 만듭니다. 이렇게 되면 나중에는 함수의 이름을 짓는데도 머리가 아프게 됩니다. 차라리 이걸 물건에 함수를 달아서 사용해 봅시다. (물건A).ABS, (물건B).ABS처럼 사용하면 물건의 종류에 관계없이 같은 이름을 사용할 수 있게 됩니다.

여러 이유 때문에 객체를 사용하면 생산성이 크게 늘어나게 됩니다. 객체지향의 세계에 오신 것을 환영합니다.

모든 것은 객체다[편집 | 원본 편집]

파이썬의 세계에서 모든 것은 객체입니다.

심지어 문자열을 변수에 넣기만 해도 객체가 생성됩니다.

자바나 C++로 프로그래밍을 조금 배우셨던 분이면 이런 말씀을 하실 수도 있습니다. int나 float같은 건 객체가 아니지 않느냐?

네. 그건 그 언어에서의 이야기고요. 파이썬에서는 모든 것이 객체입니다.[1]

이전 판에서 설명되었던 것이지만 int(3.151492)이걸 내장 함수라고 설명했던 게 있었는데, 사실 그건 함수가 아니라 클래스 생성자입니다. 그러니까 int 타입의 객체를 하나 생성한 겁니다. 변수를 하나 만들어서 값을 넣는 순간 객체가 만들어 집니다. 이에 대해선 밑에서 설명합니다.

클래스를 만들어 보자[편집 | 원본 편집]

간단한 파이썬의 클래스를 만들어 보겠습니다.

class 동물:
    나이 = 0
    성별 = None
    공복도 = 50
    def 밥먹기(self, 식사량):
        self.공복도 -= 식사량
    def 운동하기(self, 운동량):
        self.공복도 += 운동량

class 사람(동물):
    이름 = ""
    def 말하기(self, 내용):
        print(내용)

사람 = 사람()
사람.밥먹기(25)
사람.말하기("안녕하세요!")
동물 = 동물()
동물.밥먹기(25)
동물.말하기("안녕하세요!")

결과:
안녕하세요!
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<string>", line 20, in <module>
AttributeError: '동물' object has no attribute '말하기'
  • "사람(동물)"은 왜 괄호를 쓰고 "동물"은 왜 그대로 쓰죠?
파이썬에서는 클래스를 선언할 때 클래스를 상속받게 됩니다. 이전 글에는 항상 object를 상속받는 것으로 나와 있었으나, "동물"과 같이 적지 않으면 암묵적으로 " object" 클래스를 상속받게 됩니다. 사람은 동물 클래스를 상속받기 위하여 (동물)이라고 코드를 친 것입니다. 상속에 대해서는 뒤에서 더 자세히 설명할께요.
  • 함수안의 self인자는 뭔데 정의할 땐 써놓고 사용할 땐 쓰지 않는 거죠?
파이썬의 필드(객체의 내부 변수)를 수정하거나, 값을 확인할 때, 명시적으로 객체의 필드인 것을 알려줘야 합니다. 그래서 self(스스로의) 입니다. 실제로 사용하는 것은 객체가 아니라 다른 곳이기 때문에 자신을 가리키는 "self"를 적지 않습니다. (이건 적으면 에러가 납니다.)
  • 왜 사람 클래스에선 밥먹기를 만들지 않았는데 잘 되고 동물은 말하기가 안 되는 거죠?

이것도 앞에서 말한 상속과 관련이 있습니다. 간략하게 설명하자면 상속은 말 그대로 "물려받는 것"을 의미합니다. 여러분이 부모님의 유전자를 "물려받"았듯이 클래스도 함수와 변수 등등을 다른 클래스에게 물려주고 상속받은 클래스는 부모의 성질(여기서는 "동물"의 성질이 되겠죠.)을 유지하면서 새로운 것을 추가할 수 있습니다. (여기서는 "말하기" 함수가 되겠죠.) 그래서 동물은 말하기 함수가 없기 때문에 오류가 나고, 사람은 "밥먹기" 함수를 따로 만들지는 않았지만 동물의 "밥먹기" 함수를 상속받아 사용했기에 오류가 나지 않습니다.

사람 객체를 생성해 보자[편집 | 원본 편집]
철수 = 사람()
철수.이름 = "철수"
철수.나이 = 19
철수.성별 = "남자"

철수.말하기("안녕, 나는 "+철수.이름+"야.")

결과:
안녕, 나는 철수야.

예외처리[편집 | 원본 편집]

for문 활용[편집 | 원본 편집]

리스트를 for문으로 수정할 때는 아래처럼 하면 됩니다.

t = [1, 2, 3, 4]
for v in t:
    t[t.index(v)] = 0

리스트 스택[편집 | 원본 편집]

연산자 오버로딩[편집 | 원본 편집]

print 함수의 매개변수[편집 | 원본 편집]

print 함수는 sep, end의 매개변수도 있습니다.

주석[편집 | 원본 편집]

타입 힌트[편집 | 원본 편집]

매개변수[편집 | 원본 편집]

매개변수의 타입을 표기하는 방법입니다. 파이썬은 타입 지정 없이 그냥 변수를 선언할 수 있게 되어있는데 이렇게 되면 타입 불일치로 인한 실수가 늘어나게 됩니다. 타입 힌트로 이 함수는 어떤 타입의 변수를 받는지 적으면 실수를 줄일 수 있게 됩니다.

타입 힌트는 아래처럼 콜론(:)을 입력하고 그 뒤에 타입을 적으면 됩니다.

# int 형의 매개변수
def print2(a: int):
    return a
    
# str 형의 매개변수
def print2(a: str):
    return a
    
# str나 int 형 매개변수
def print2(a: Union[str, int]):
    return a

from typing import Union으로 Union을 불러오고 Union[str, int]처럼 쓰면 이 함수는 str과 int를 받는다는 것을 알 수 있습니다. 타입에 따라 작업이 달라지는 함수에 쓰면 유용합니다.

  1. 이렇게 모든 것이 객체인 언어의 또 다른 예로는 스칼라가 있습니다. 벡터 스칼라 말고 공교롭게도공교롭게도? 자바 바이트코드로 컴파일할 수 있고, 자바 API 또한 사용이 가능합니다.