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

Senior9324 (토론 | 기여)님의 2015년 12월 4일 (금) 00:25 판 (Senior9324 사용자가 중급 프로그래밍 시리즈/파이썬 문서를 시리즈:중급 프로그래밍 시리즈/파이썬 문서로 옮겼습니다)

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

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.

초급 단계

스크립트 파일을 만들자

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

함수

내장함수

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

하지만 이 곳에서는 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)이란 우리가 일상생활에서 생각하는 대로 프로그램 내부의 '객체'를 다루기 위한 기법입니다.

올바르지 않은 표현이지만 자동차를 예로 들면,

자동차는 크게 나누어 바퀴와 차체로 나누어 집니다.

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

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

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

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

클래스

클래스는 쉽게 말해서 교실입니다.

교실 안에는 여러 사람들(학생)이 모여 있겠죠.

그리고 또한 물건(책상, 의자 등)이 놓여 있고요.

학생을 메소드(함수)라고 치고 물건을 필드(변수)라고 치면,

학생이 물건을 이용해서 무언가를 한다.

= 메소드가 필드를 이용해서 무언가를 한다.

라는 설명이 완성됩니다.

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

객체

객체란 위에서 설명했듯이, 모든것이 객체가 됩니다.

클래스도 교실이 되고요, 필드(변수)도 객체입니다.

하지만 학생은 객체가 아닙니다. 학생으로 비유한 메소드(함수)는 행동이기 때문에 객체로 보지 않습니다.

모든 것은 객체다

네, 모든것은 객체입니다.

자바나 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
철수.성별 = "남자"

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

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

틀:중급 프로그래밍 항목

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