직접 정의한 클래스에 의해 생성된 객체는 기본적으로 연산이 불가능합니다.

연산자 오버로딩

직접 정의한 클래스의 객체에 +, -, *와 같은 일반 연산을 적용하려면, 객체를 연산 가능한(operable) 상태로 만들어야 합니다. 연산자 오버로딩을 통해 이를 구현하며, 이전에 언급했던 매직 메소드를 클래스에 정의하여 연산자 오버로딩을 구현할 수 있습니다.

여기서는 __add__라는 매직 메소드를 구현했습니다. 이는 해당 객체에 대한 + 연산을 오버로딩합니다. 이렇게 되면, 객체에 + 연산이 이루어질 경우 Python 인터프리터가 __add__ 메소드를 호출합니다. 함수 내부에서는 self(객체 자신)other(더하고자 하는 값)을 명시하였습니다.

  • other가 Number 클래스의 객체라면 self.n과 other.n을 더해 Number 객체를 만들어 반환하고
  • other가 int 클래스의 객체(정수)라면 self.n과 other를 더해 Number 객체를 만들어 반환합니다.

연산자 오버로딩 메소드의 종류

Python에서 사용되는 모든 연산자들은 매직 메소드로 정의하여 오버로딩 가능합니다.

  • __add__(self, other) : 이항 + 연산자(A + B, A += B)
  • __sub__(self, other) : 이항 - 연산자(A - B, A -= B)
  • __mul__(self, other) : 이항 * 연산자(A * B, A *= B)
  • __truediv__(self, other) : 이항 / 연산자(A / B, A /= B)
  • __floordiv__(self, other) : 이항 // 연산자(A // B, A //= B)
  • __mod__(self, other) : 이항 % 연산자(A % B, A %= B)
  • __pow__(self, other) : 이항 연산자(A B, pow(A, B))
  • __lshift__(self, other) : 이항 << 연산자(A << B, A <<= B)
  • __rshift__(self, other) : 이항 >> 연산자(A >> B, A >>= B)
  • __and__(self, other) : 이항 & 연산자(A & B, A &= B)
  • __xor__(self, other) : 이항 ^ 연산자(A ^ B, A ^= B)
  • __or__(self, other) : 이항 | 연산자(A | B, A |= B)
  • __not__(self) : 단항 ~ 연산자(~A)
  • __abs__(self) : 단항 절대값 연산자(abs(A))

비교 연산자 오버로딩

비교 연산자들도 오버로딩 가능합니다.

비교 연산자 오버로딩 메소드의 종류

  • __lt__(self, other) : < 연산자 - Less than(self가 other 미만인지)
  • __le__(self, other) : <= 연산자 - Less than or equal to(self가 other 이하인지)
  • __gt__(self, other) : > 연산자 - Greater than(self가 other 초과인지)
  • __ge__(self, other) : >= 연산자 - Greater than or equal to(self가 other 이상인지)
  • __eq__(self, other) : == 연산자 - Equal to(self와 other가 같은지)
  • __ne__(self, other) : != 연산자 - Not equal to(self와 other가 다른지)


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 사용자 정의 에러  (0) 2018.07.05
[Python] 에러 처리  (0) 2018.07.04
[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 객체지향  (0) 2018.06.29

Python에서 언더스코어(_)는 중요한 문법적 요소 중 하나이며, 다른 언어들에 비해 조금 특별합니다.

값을 무시하고 싶을 때

Unpacking에서 값을 무시하기 위해 사용 가능합니다.

특별한 의미의 네이밍을 위해 사용하는 경우

Java는 캡슐화(변수나 메소드에 대한 접근을 막는 것)를 지원하기 위해 private과 같은 접근 제한자를 사용합니다. 그러나 Python은 문법적으로 캡슐화를 지원하지 않으며, 암시적으로 private를 나타내기 위해 언더스코어로 시작하는 네이밍(private expression)을 사용합니다. 이는 Java와 같은 방어적 프로그래밍 언어에서 사용하는 진정한 의미의 private은 아니지만, Python의 Trust a developer라는 원칙에 의해 생긴 '책임 있는 개발자'를 지향하기 위한 문화입니다.

하나의 언더스코어로 시작하는 single leading underscored naming은 암시적으로 private을 표현하기 위해 사용합니다. 따라서 이와 같은 네이밍 룰에 의해 정의된 요소는 '외부에서 접근하지 말라'라는 권고의 의미를 지닙니다. 그러나 개발자를 믿는 문화를 기반으로 하고 있기 때문에, 이렇게 private 처리된 요소에 접근하더라도 warning 정도만 발생합니다.

두 개의 언더스코어로 시작하는 double leading underscored naming은 컨벤션이라기 보단 문법적인 요소입니다. 이는 해당 요소를 맹글링(컴파일러나 인터프리터가 요소의 이름을 그대로 사용하지 않고 변형시키는 것)하여 충돌을 방지하는 용도로 쓰입니다. 이와 같은 네이밍을 private를 구현하기 위해 사용하는 코드도 있지만, 이는 맹글링에 의해 private처럼 보여질 뿐이므로 이상적인 구현은 아닙니다.

매직 메소드

클래스에 대해 설명할 때, 생성자와 소멸자 메소드의 이름이 각각 __init____del__이었습니다. 이것도 특별한 방식의 네이밍에 속하며, 이와 같은 double leading, double trailing underscored naming 방식의 메소드를 magic method라고 부릅니다. 이러한 매직 메소드들은 Python 인터프리터에 의해 호출되는 메타 메소드(__init__ : 생성자, __del__ : 소멸자 등), 빌트인 함수에 의해 호출되는 메소드(__int__, __str__, __float__ 등)연산자 오버로딩 메소드 등을 정의할 때 사용합니다. 예를 들어, 빌트인 함수 len()의 경우 내부적으로 전달된 객체의 매직 메소드인 __len__을 호출하며, reversed()의 경우 매직 메소드 __reversed__를 호출합니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 에러 처리  (0) 2018.07.04
[Python] 연산자 오버로딩  (0) 2018.07.02
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 객체지향  (0) 2018.06.29
[Python] 빌트인 함수  (0) 2018.06.28

다른 객체지향 프로그래밍 언어들처럼, Python도 클래스의 상속을 지원합니다. 객체지향 프로그래밍이라는 패러다임은 현실 세계를 객체로 표현하기 위해 만들어졌으므로, 객체의 상속이라는 개념은 더 효율적으로 객체지향을 표현할 수 있도록 합니다. 예를 들어 토끼(Rabbit)와 고양이(Cat)가 동물(Animal)에 속하는 것을 상속 구조로 표현할 수 있습니다.

Animal이라는 클래스에 run 메소드를 정의했고, 메소드에 하나의 출력문을 두었습니다. 그리고 이 클래스를 상속받는 CatRabbit 클래스를 정의하였습니다. Cat 클래스는 상위 클래스가 가지고 있는 run 메소드를 재정의(오버라이딩)했고, Rabbit 클래스는 해당 메소드를 별도로 정의하지 않았습니다.

이후 Cat 클래스의 인스턴스에서 run 호출 시 해당 클래스의 오버라이딩된 run 메소드가 호출되며 'Cat catty is running'이 출력되었고, Cat 클래스만 가지고 있는 cry 메소드를 호출하며 'Cat catty is crying'이 출력되었습니다. Rabbit 클래스의 인스턴스에서 run 호출 시 상위 클래스인 Animal.run 메소드가 호출되며 'carrot is running'이 출력되었습니다.

상속은 보통 기존 클래스를 변경하지 않고 기능을 확장하기 위해 사용합니다. 상위 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 이용해야만 할 것입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 연산자 오버로딩  (0) 2018.07.02
[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 객체지향  (0) 2018.06.29
[Python] 빌트인 함수  (0) 2018.06.28
[Python] 값으로서의 함수와 lambda  (0) 2018.06.27

객체 지향 프로그래밍은 실제 세계의 모습을 프로그램 코드에 그대로 반영하기 위하여 만들어졌습니다. 과거에 시뮬레이션 프로그램을 구현하기 위해 현실 세계의 것들을 프로그래밍 언어로 표현할 필요가 있었고, 이를 위하여 객체지향 프로그래밍 패러다임이 등장하게 됩니다.

객체지향 프로그래밍 패러다임에서는 현실 세계의 물건들을 객체(object)로 표현하고, 객체를 만들기 위한 틀을 클래스(class)로 정의합니다. 기능과 특성의 모음을 변수와 메소드로서 클래스(class)라는 캡슐에 넣고, 클래스를 실체화(instance)하면 객체(object)를 만들 수 있는 것입니다.

사실 객체지향은 프로그래밍 입문자들이 종종 힘들어하는 장벽 중 하나입니다. '클래스가 어려워요'라는 생각은, 실제로 프로그래밍 언어의 요소로서 어려운 게 아니라 객체지향 프로그래밍 패러다임에 대한 이해가 부족하기 때문이므로 패러다임 자체에 대한 학습을 조금 더 하는 것이 좋습니다.

Python의 객체지향

Python은 객체지향을 지원하는 멀티 패러다임 언어입니다. 아래는 Python 클래스의 가장 간단한 예입니다.

아무런 기능도 갖고 있지 않고, 객체지향으로 따지면 정말 '틀'만을 가지고 있는 클래스입니다. 그러나 객체를 생성하는 기능은 가지고 있습니다.

FishBread()의 결과값을 돌려받은 fish_breadfish_bread_2가 객체입니다. 붕어빵을 의미하는 'FishBread'라는 틀(클래스)을 이용해 붕어빵 객체 두 개가 생성되었네요.

생성자와 소멸자, 필드와 메소드

생성자는 객체가 생성될 때 호출되는 메소드이며, 소멸자는 객체가 삭제될 때 호출되는 메소드입니다. 그리고 클래스 필드모든 객체가 공유하는 필드이고, 인스턴스 필드각각의 객체가 별도로 가지는 필드입니다. 생성자와 소멸자, 클래스 필드와 인스턴스 필드, 메소드를 모두 가지고 있는 클래스를 정의해 보겠습니다.

생성자는 __init__ 메소드로 정의(7번 라인)하고, 소멸자는 __del__ 메소드로 정의(17번 라인)합니다. 각각 객체가 생성(27, 28번 라인)되고, 삭제(43번 라인)될 때 호출됩니다. 인스턴스 필드는 self.[variable]처럼 접근(8, 9번 라인)하고, 클래스 필드는 [Class].[variable]처럼 접근(13번 라인)합니다.

한가지 특별한 점은 self 변수인데, 이는 객체 자신을 나타내며 Java의 this와 같습니다. Java와는 다르게 메소드에 self를 명시한다는 점이 조금 특별합니다. 객체에서 메소드 호출 시 자동으로 해당 객체가 self에 채워지며, 이는 Class level로 메소드를 호출하며 객체를 넘겨줄 수도 있다는 것(40번 라인)입니다.

어렵지만, 객체지향이라는 패러다임에 익숙해지길 바라는 수밖에 없습니다.

Python의 모든 요소는 객체

Python의 모든 요소(int, str, bytes, list, tuple과 같은 데이터 타입, 함수 등)는 객체입니다. 따라서 저마다의 인스턴스 필드와 메소드들이 존재합니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 빌트인 함수  (0) 2018.06.28
[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26

빌트인 함수(Built-in function)은 언어 설계 과정에서 미리 만들어진 함수를 말합니다. Hello World에서 봤던 print라는 함수도 빌트인 함수에 속합니다. 이와 같은 빌트인 함수와 혼동하지 않기 위해, 개발자가 직접 만든 함수는 사용자 정의 함수라고도 부릅니다. Python 3.6.4 기준 빌트인 함수는 총 68개가 있습니다. 여기서는 쓸만한 여러가지 빌트인 함수들을 소개합니다. Iterable 자료형을 위한 빌트인들을 설명하기 위해 sequence, iterator 등을 언급할텐데, 둘 다 그냥 iterable이라 생각하고 이해는 나중으로 넘기도록 합시다.

콘솔 출력을 위한 함수입니다.

1번 라인의 print문은 end 인자가 기본값인 \n으로 처리되어 'Hello'라는 문자열 출력과 함께 개행이 이루어지고, 2번 라인의 print문은 end를 직접 ''로 지정하였으므로 출력 이후 개행 처리되지 않습니다.

type(obj)

전달된 객체의 타입을 확인하기 위해 사용합니다. 클래스를 배우기 전이라 객체가 어떤 건지 정확히 알기 힘들다면, 그냥 변수의 타입을 반환한다고 생각해도 좋습니다.

isinstance(object, class-or-type-or-tuple)

타입 검증을 위해 사용합니다. 전달된 객체(obj)가 전달된 타입(type)에 속하는지를 boolean 타입으로 반환합니다.

sum(a, b)

두 수의 합을 반환합니다.

divmod(x, y)

a를 b로 floor div한 몫나머지를 반환합니다.

max(arg1, arg2, *args)

전달된 2개 이상의 인자 중 최댓값을 반환합니다. int와 str 등 서로 값을 비교할 수 없는 인자를 함께 전달할 경우 오류가 발생합니다.

Iterable 자료형을 위한 빌트인

len(object)

전달된 iterable 객체의 길이를 반환합니다. 정확히는 해당 객체가 가지고 있는 매직 메소드인 __len__을 호출합니다. 따라서 __len__ 메소드만 가지고 있으면 iterable 자료형이 아니더라도 오류가 발생하지 않습니다. 매직 메소드에 대한 설명은 여기에 나와 있습니다.

reversed(sequence)

전달된 sequence 객체를 역방향으로 뒤집은 iterator를 반환합니다.

sorted(iterable, cmp=None, key=None, reverse=False)

전달된 iterable 객체를 정렬하여 반환합니다.

enumerate(iterable)

전달된 iterable 객체를 이용해 0으로 시작하는 카운트와 값으로 이루어진 튜플로 구성된 iterable로 리턴합니다.

Python 공식 레퍼런스 에서 기타 빌트인 함수들을 더 알아볼 수 있습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 클래스의 상속  (0) 2018.06.30
[Python] 객체지향  (0) 2018.06.29
[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26
[Python] 함수  (0) 2018.06.25

Python의 함수는 으로서 관리됩니다. 쉽게 말하면, 변수에 할당할 수 있다는 것입니다

이를 프로그래밍 언어 디자인 측에선 일급 객체라고 부릅니다. 이는 다른 객체들에 적용 가능한 일반적인 연산을 모두 지원하는 객체를 가리킵니다. 함수에 매개변수로 넘기기, 변수에 대입하기와 같은 연산들이 여기서 말하는 일반적인 연산의 예입니다. 다음과 같은 조건을 만족할 때 일급 객체라고 말할 수 있습니다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

Python의 함수는 해당 조건을 모두 만족하며, 따라서 일급 객체입니다.

lambda

그러나 Python의 함수는 JavaScript의 함수처럼 런타임 생성과 익명 생성이 불가능하므로 일급 함수라고 분류할 수는 없습니다. 런타임 생성은 그때 그때 함수를 만든다는 의미인데, Python은 이 일이 불가능합니다. return def ...와 같은 표현을 할 수 없다는 것입니다. 이를 위해 Python에서는 lambda를 지원합니다.

lambda는 함수를 생성할 때 사용하는 예약어로, def와 동일한 역할을 합니다. 이는 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳(런타임 또는 익명으로 생성해야 하는 경우)에 주로 쓰입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 객체지향  (0) 2018.06.29
[Python] 빌트인 함수  (0) 2018.06.28
[Python] docstring  (0) 2018.06.26
[Python] 함수  (0) 2018.06.25
[Python] pass statement  (0) 2018.06.24

주석에 대해서 설명한 적이 있었고, 기본 자료형에서 문자열을 이야기할 때 샘플 코드에서 큰 따옴표 3개는 함수의 docstring에서 사용한다라고 한 적 있었습니다. docstring모듈, 함수, 클래스, 메소드 정의의 최상단에 위치하는 문자열입니다. 주석의 일종이지만, 컴파일 타임에 제외되는 # 주석과 다르게 하나의 특수 속성이 됩니다. 아래는 함수에 대한 docstring의 예입니다.

함수 정의 최상단에 큰 따옴표 3개로 묶인 문자열로 docstring을 정의했습니다. 함수에 대한 설명, 파라미터 정보, 반환값에 대한 정보가 포함되어 있습니다. 이를 통해 각 파라미터에는 어떤 타입의 값을 전달해야 하는지, 함수가 어떤 작업을 하고, 어떤 값을 반환하는지 등을 바로 이해할 수 있습니다. 한가지 신기한 점은, help라는 함수에 sum 함수를 전달하고 반환받은 docstring에 대한 정보와, __doc__이라는 함수의 속성입니다. docstring은 # 주석처럼 컴파일 타임에 제외되지 않는다는 것입니다. 따라서 Python의 docstring은 최소한의 노력으로 코드를 문서화할 수 있는 강력한 무기입니다.

docstring은 작은 따옴표 3개로 묶인 문자열로 작성해도 상관 없으나, Python docstring 제안서에서는 큰 따옴표를 권고하고 있습니다. docstring은 함수만이 아니라 모듈, 클래스, 메소드 등에 모두 작성 가능하며 docstring을 작성하는 스타일은 Google의 Python docstring guide가 가장 대표적입니다. 주석과 docstring이 필수는 아니지만, 지금의 내가 아닌 내 코드를 보는 다른 사람을 위해 꼭 적어주는 것이 좋습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 빌트인 함수  (0) 2018.06.28
[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] 함수  (0) 2018.06.25
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - while  (0) 2018.06.23

입력값을 가지고, 특정 작업을 수행한 다음에 결과물을 내어 놓는 것이 함수입니다. 프로그래밍을 하다 보면 동일한 내용을 반복해서 작성하는 경우가 있습니다. 이렇게 '특정한 목적의 작업을 수행하며 재사용성이 큰 부분'을 묶어 함수로서 작성할 수 있습니다. 예로 두 수의 합이나, 두 수의 몫과 나머지를 구하는 것 등을 함수로 정의할 수 있습니다.

함수 정의하기

간단하게, 두 수를 입력받아 합을 리턴하는 함수를 작성하겠습니다.

Python에서는 함수를 정의하기 위해 def라는 키워드를 사용하며, 각 함수에는 이름0개 이상의 인자를 명시해야 합니다. def [func_name](params) 형태이며, 이를 함수의 signature라고 합니다. 위 함수의 이름은 sum이며, 입력 인수는 a와 b로 2개이고, 리턴 값은 a + b입니다. 따라서 sum(1, 5)의 결과값은 6이 됩니다.

위의 sum(1, 5)와 같은 구문을 함수 호출이라고 부릅니다. 함수의 이름 뒤에 소괄호를 붙이고, 인자를 필요로 하는 경우에는 콤마(,)로 구분하여 전달합니다. 함수를 호출하게 되면 도로에서 차선을 이동하듯 제어가 넘어가고, 함수가 종료되면 다시 제어가 되돌아옵니다.

Python의 함수는 0개 이상의 인자를 받고, 0개 이상의 값을 리턴할 수 있습니다. 그러므로 함수의 리턴은 있을 수도 있고 없을 수도 있으며, 여러 개의 값을 리턴할 수도 있습니다.

리턴이 없는 함수

위의 say_hello 함수는 아무 인자도 받지 않고, 'hello'를 출력하며 리턴이 없습니다. 그러나 함수의 리턴 값은 None으로 처리됩니다. 함수에 리턴이 없다면, 자동으로 return None 처리가 되는 것입니다.

여러 개의 값을 리턴하는 함수

위의 divmod 함수는 두 개의 인자를 받고, floor div의 결과값(몫)나머지를 리턴합니다. Python은 함수에서 2개 이상의 값을 리턴할 경우 Tuple 타입으로 처리되며, 따라서 위의 예처럼 함수의 리턴 값을 unpacking할 수 있습니다.

함수 인자의 기본값

함수의 인자에 기본값을 설정할 수 있습니다.

함수 호출 시, 위처럼 기본값이 설정된 인자(a, b)에 별도로 값을 전달하지 않으면 기본값으로 처리됩니다. 인자를 전달하든 전달하지 않든 상관 없으므로, 기본값이 설정된 인자를 선택 인자라고 부릅니다. 위 함수의 경우 a와 b 모두 기본값이 0으로 설정되어 있고, 따라서 sum()처럼 별도의 인자 전달 없이 호출하면 a와 b 모두 기본값인 0을 갖습니다.

함수 인자의 종류

위에선 함수 호출 시 모든 인자를 순차적으로 전달했고, 이를 위치 인자로 부릅니다. 인자를 키워드와 함께 명시적으로 전달할 수도 있으며, 이를 키워드 인자라고 부릅니다.

만약 전달된 모든 문자열을 이어붙여 리턴하는 함수를 작성하려면, 인자의 갯수가 동적이어야 합니다. 이를 위해 가변 인자(variable argument)를 사용합니다.

변수 앞에 asterisk(*) 기호를 붙이면, 해당 변수는 가변 인자로 관리되며 전달된 인자들은 Tuple로 처리됩니다. 따라서 위 함수는 인자의 갯수가 자유롭습니다. 위치 인자를 가변적으로 받으며 이를 튜플로 처리하므로, 이를 가변 위치 인자 튜플이라고 부릅니다. 키워드 인자도 가변으로 정의할 수 있는데, 아래처럼 변수 앞에 asterisk(*)를 두 개 이어붙이면 됩니다.

해당 변수는 가변 인자로서 관리되며 전달된 인자들은 Dictionary로 처리됩니다. 따라서, 함수의 인자는 아래 4종류가 있습니다.

  • 필수 인자
  • 선택 인자
  • 가변 위치 인자 Tuple
  • 가변 키워드 인자 Dictionary

함수에 이 4종류의 인자를 모두 사용하는 경우, 위치 인자 - 키워드 인자 - 가변 위치 인자 튜플 - 가변 키워드 인자 딕셔너리 순으로 정의해야 합니다. 이 순서를 지키지 않을 경우, 인자 할당에 애매함이 생기므로 가변 인자는 맨 뒤쪽에 정의해야 문제가 생기지 않습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - while  (0) 2018.06.23
[Python] 반복문 - for  (0) 2018.06.22

pass'아무 것도 하지 않게'하는 키워드입니다. continue는 현재 루프를 건너뛰고 다음 순번으로 넘어가도록 하지만, pass는 수행할 코드가 없다는 것을 명시적으로 나타내주기 위한 역할을 합니다. null statement라고도 표현합니다.

위와 같이 if, for, while에 모두 적용 가능하며, 이후 배울 함수클래스에도 pass statement를 적용할 수 있습니다. 콜론(:)과 들여쓰기로 표현되는 코드 블럭이라면 모두 적용할 수 있다는 것입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] docstring  (0) 2018.06.26
[Python] 함수  (0) 2018.06.25
[Python] 반복문 - while  (0) 2018.06.23
[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21

while조건식이 속해 있는 반복문입니다. 조건 반복문이라고도 부릅니다. 아래 코드는 무한루프를 발생시킵니다.

위처럼 while [condition] 형태로 반복문을 표현하며, condition이 True인 동안 블럭 내부의 코드를 반복하며 실행합니다. while문을 이용해 1부터 100까지의 수를 누적하여 출력하는 코드를 작성하겠습니다.

사실 이 코드는 for문으로도 표현 가능합니다.

대부분의 while문은 이처럼 for문으로 대체 가능하며, for문은 비교적 더 간결하고, iterable 자료형을 쉽게 다룰 수 있기 때문에 더 유연하기도 합니다. 대부분의 스타일 가이드에서도 while보단 for를 장려하고 있으니, while을 통해 코드를 매우 직관적으로 작성할 수 있는 상황이 아니라면 for를 사용하는 편이 더 좋습니다.

break, continue statement

while문도 반복문으로 분류되므로, for처럼 breakcontinue를 사용할 수 있습니다.

while - else

for-else가 있는 것처럼, while문에서도 else를 사용할 수 있습니다. for에 붙은 else는 for가 break되지 않고 정상 종료되었을 때 해당 블럭의 코드가 실행되는 것처럼, while의 else도 조건식이 거짓인 경우(while이 break되지 않고 정상 종료될 때) 해당 블럭의 코드가 실행됩니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 함수  (0) 2018.06.25
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21
[Python] Iterable 자료형 - Dictionary, Set  (0) 2018.06.20

+ Recent posts