이번 포스팅에서는 Python의 numpy 라이브러리에 있는 함수들을 이용해서 두 개의 배열(array)을 옆으로 붙이기, 배열을 위 아래로 붙이기(concatenate) 하는 방법에 대해서 소개하겠습니다.  알아두면 편리하게 배열을 조작할 수 있는 유용한 함수들입니다. 


(1) 두 배열을 왼쪽에서 오른쪽으로 붙이기 

   : np.r_[a, b]

   : np.hstack([a, b])


(2) 두 배열을 위에서 아래로 붙이기

   : np.r_[[a], b]

   : np.vstack([a, b])


(3) 두 개의 1차원 배열을 칼럼으로 세로로 붙여서 2차원 배열 만들기

    (Stack 1-D arrays as columns into a 2-D array)

   : np.c_[a, b]

   : np.column_stack([a, b])



 [ 배열을 옆으로, 위 아래로 붙이기 : np.r_, np.c_, np.hstack(), np.vstack(), np.column_stack() ]




처음에 np.r_[a, b], np.c_[a, b] 코드를 봤을 때 '이게 뭐지?', '잘못 타이핑한거 아닌가?', '쓰다 말았나?' 하고 갸우뚱 했던 기억이 납니다. ^^; 


아래에 간단한 예를 들어서 설명하겠습니다. 

np.r_[], np.c_[] 는 코드가 완전 간단한 장점이 있구요, np.hstack(), np.vstack(), np.column_stack() 는 코드 이해가 쉬운 장점이 있는데요, 코드 작성하시는 분의 선호도에 따라 골라 쓰시면 되겠습니다. 


먼저 numpy 라이브러리 importing 한 후에 a, b 두 개의 예제 배열(array)을 만들겠습니다. 



In [1]: import numpy as np


In [2]: a = np.array([1, 2, 3])


In [3]: b = np.array([4, 5, 6])


 



(1) 두 배열을 왼쪽에서 오른쪽으로 붙이기 

   : np.r_[a, b]     <- ( ) 를 사용하지 않고 [ ] 를 사용하는 것에 주의하세요

   : np.hstack([a, b])


 

 In [4]: np.r_[a, b]

 Out[4]: array([1, 2, 3, 4, 5, 6])


 In [7]: np.hstack([a, b])

 Out[7]: array([1, 2, 3, 4, 5, 6])



(2) 두 배열을 위에서 아래로 붙이기

   : np.r_[[a], b]   <- a 배열을 [ ]을 사용해서 1-D 배열로 만든거 주의하세요

   : np.vstack([a, b])



In [5]: np.r_[[a], [b]]

Out[5]:

array([[1, 2, 3],

        [4, 5, 6]])

 


In [8]: np.vstack([a, b])

Out[8]:

array([[1, 2, 3],

        [4, 5, 6]])

 



(3) 두 개의 1차원 배열을 칼럼으로 세로로 붙여서 2차원 배열 만들기

    (Stack 1-D arrays as columns into a 2-D array)

   : np.c_[a, b]

   : np.column_stack([a, b])



In [6]: np.c_[a, b]

Out[6]:

array([[1, 4],

        [2, 5],

        [3, 6]])

 


In [9]: np.column_stack([a, b])

Out[9]:

array([[1, 4],

        [2, 5],

        [3, 6]])



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되셨다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



Posted by R Friend R_Friend

이번 포스팅에서는 Python의 for loop 반복문에서 사용할 수 있는 일정 간격, 혹은 일정 개수의 수를 생성하는 함수를 소개하겠습니다.

 

(1) range() 함수

   : start, stop, step 을 인수로 받아 일정 간격의 정수 생성

 

(2) enumerate() 함수

   : 순서가 있는 자료형(리스트, 튜플, 문자열)을 인수로 받아 인덱스(index)를 포함하는 객체를 반환

 

(3) np.linspace() 함수

   : start, stop, num 을 인수로 받아 일정 개수/간격의 샘플을 반환

 

(4) linrange() 사용자정의 함수

  : start, stop, step 을 인수로 받아 일정 간격의 샘플을 반환

 

 

[ Python의 for loop 문에 사용할 수 있는 함수들 예시 ]

 

 

 

 (1) range() : start, stop, step 을 인수로 받아 일정 간격의 정수 생성

 

for loop 문을 작성할 때 일반적으로 같이 사용하는 함수가 range() 함수 입니다. 3개의 parameter 값을 입력받게 되는데요, range(start, stop, step) 의  

 - start : 순열의 처음 시작하는 수

 - end : 순열의 끝나는 수, 단 이 숫자는 포함하지 않음

 - step : 순열 안의 각 숫자들 간의 간격

을 의미합니다.

  • 1개의 parameter 만을 입력하는 경우 그 수는 end 의 값으로 인식되며(해당 값은 미포함), start=0, step=1 의 디폴트 값이 자동으로 설정됩니다.  

# One parameter

In [1]: for i in range(10):

   ...: print(i)

   ...:

   ...:

0

1

2

3

4

5

6

7

8

9

 

 

  • 2개의 parameter를 입력하는 경우, 각 값은 start와 end 로 인식되고, step=1 로 자동 설정됩니다.

# Two parameters

In [2]: for i in range(5, 10):

   ...: print(i)

   ...:

   ...:

5

6

7

8

9

 

 

  • 3개의 parameter를 입력하는 경우, 각 값은 start, end, step의 값이 됩니다. end에 입력한 값은 포함되지 않는 다는 점에 주의하세요.

# Three parameters

In [3]: for i in range(0, 10, 2):

   ...: print(i)

   ...:

   ...:

0

2

4

6

8

 

 

  • step 위치에 음수(-) 값을 입력하면 그 수만큼 줄어드는 방향으로 순열을 생성합니다.

# Going backwards

In [4]: for i in range(5, -5, -2):

   ...: print(i)

   ...:

   ...:

5

3

1

-1

-3

 

 

  • List 에 대해서도 len() 함수로 리스트 안의 원소 개수를 파악하고 range() 함수를 적용하여 for loop으로 List 안의 원소를 indexing 해오는 반복문을 만들 수 있습니다.

 

In [5]: my_list = ['a', 'b', 'c', 'd', 'e']

   ...: for i in range(0, len(my_list)):

   ...: print(my_list[i])

   ...:

   ...:

a

b

c

d

e

 

 

 

 

 (2) enumerate() : 순서가 있는 자료형(리스트, 튜플, 문자열)을 인수로 받아
                         인덱스(index)를 포함하는 객체를 반환

 

enumerate() 함수는 아래의 예제처럼 객체의 index 를 파악하고자 할 때 사용하면 매우 유용합니다.

 

 

In [6]: name_list = ['Lee', 'Kim', 'Park', 'Choi']

   ...: for i, name in enumerate(name_list):

   ...: print(i+1, name)

   ...:

   ...:

(1, 'Lee')

(2, 'Kim')

(3, 'Park')

(4, 'Choi')

 

 

 

아래의 예제처럼 enumerate()와 format() 함수를 적절히 같이 사용하면 꽤 쓸만합니다.

 

 

In [7]: for i, name in enumerate(name_list):

   ...: print("idx: {} , name: {} ".format(i+1, name))

   ...:

   ...:

idx: 1 , name: Lee

idx: 2 , name: Kim

idx: 3 , name: Park

idx: 4 , name: Choi

 

 

 

 

 (3) np.linspace() : start, stop, num 을 인수로 받아 일정 개수/간격의 샘플을 반환

 

numpy 패키지의 linspace() 함수는 그래프의 x 축 설정할 때나 혹은 for loop을 써서 시뮬레이션 할 때 꽤 자주 사용하는 편입니다. start, stop, num 의 세 개의 parameter를 입력받아 num 개수, 일정 간격의 샘플을 반환합니다.

 

 - start : 순열의 시작 값

 - stop : 순열의 끝 값, endpoint=True가 기본 설정, 만약 endpoint=False인 경우 미포함

 - num : 생성되는 샘플의 개수

 

  • endpoint=True 가 기본값으로 설정 (stop 값을 포함하여 num 개수만큼의 등간격 순열 생성)

# endpoint=True (default setting)

In [8]: import numpy as np

   ...: np.linspace(start=0, stop=10, num=5)

   ...:

Out[8]: array([ 0. , 2.5, 5. , 7.5, 10. ])

 

 

 

  • retstep=True 를 설정하면 각 샘플 간의 간격을 배열 다음에 표시해줍니다.

# retstep: If True, return (samples, step), where step is the spacing between samples.

In [9]: np.linspace(start=0, stop=10, num=5, retstep=True)

   ...:

Out[9]: (array([ 0. , 2.5, 5. , 7.5, 10. ]), 2.5)

 

 

  • endpoint=False 를 설정하면 stop 매개변수값을 포함하지 않은 등간격의 num 개수 샘플을 생성합니다.
# endpoint: If True, stop is the last sample. Otherwise, it is not included. Default is True.

In [10]: np.linspace(start=0, stop=10, num=5, retstep=True, endpoint=False)

    ...:

Out[10]: (array([0., 2., 4., 6., 8.]), 2.0)

 

 

 

  • for loop 반복문에 np.linspace() 사용한 예제

 

In [11]: for i in np.linspace(start=0, stop=10, num=5):

    ...: print(i)

    ...:

    ...:

0.0

2.5

5.0

7.5

10.0

 

 

 

 

 (4) linrange() 사용자정의 함수 : start, stop, step을 인수로 받아 일정 간격의 샘플 반환

 

위의 (3)번에서 소개한 np.linspace() 함수를 응용하여 일정 간격(step) 의 샘플을 생성해주는 linrange() 사용자정의 함수를 소객합니다. (1)번의 range() 함수와 매우 유사하긴 한데요, stop 값이 포함되어서 step 만큼의 간격으로 순열을 생성해주는게 조금 다릅니다.

 

 

In [12]: def linrange(start=0, stop=1, step=1):

    ...: n = np.round((stop - start) / step)

    ...: array = np.linspace(start, stop, int(n+1)) # endpoint=True

    ...: return array

    

In [13]: for i in linrange(start=0, stop=10, step=2):

    ...: print(i)

    ...:

    ...:

0.0

2.0

4.0

6.0

8.0

10.0

 

 

 

많은 도움이 되었기를 바랍니다.

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^

 

 

Posted by R Friend R_Friend

이번 포스팅에서는 파이썬에서 다차원 배열(array)을 1차원 배열로 평평하게 펴주는 NumPy의 ravel() 함수에 대해서 알아보겠습니다. 


1차원 배열을 다차원 배열로 재구성/재배열 해주는 NumPy의 reshape() 함수와 반대의 기능을 하는 함수가 ravel() 이라고 보시면 되겠습니다. 


기계학습 알고리즘 학습하다보면 가끔씩 ravel() 함수가 나오는데요, 이참에 order 옵션 'C', 'F', 'K' 별 기능에 대해서도 정리해서 알아두면 좋을 듯 합니다. 


[ Python NumPy ravel() 함수 vs. reshape() 함수 ]




-- 2차원 배열 -- 


먼저 0 ~ 11 까지의 12개의 원소로 이루어진 3 x 4 배열을 만들어 보겠습니다.  



In [1]: import numpy as np

   ...: x = np.arange(12).reshape(3, 4)

   ...: x

   ...:

Out[1]:

array([[ 0, 1, 2, 3],

        [ 4, 5, 6, 7],

        [ 8, 9, 10, 11]])




위에서 만든 2차원 배열에 대해서 order='C', order='F', order='k'별로 순서대로 위의 배열 3*4 배열 x가 어떤 순서대로 평평하게 펴지는지 예제로 살펴보겠습니다. 


(1) np.ravel(x, order='C') : C와 같은 순서로 인덱싱하여 평평하게 배열 (디폴트)



In [2]: np.ravel(x, order='C') # by default

   ...:

Out[2]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

 




(2) np.ravel(x, order='F') : Fortran과 같은 순서로 인덱싱하여 평평하게 배열



In [3]: np.ravel(x, order='F')

   ...:

Out[3]: array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11])

 




 (3) np.ravel(x, order='K') : 메모리에서 발생하는 순서대로 인덱싱하여 평평하게 배열



In [4]: np.ravel(x, order='K')

   ...:

Out[4]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])





-- 3차원 배열 -- 


3차원 이상의 배열에 대해서도 ravel() 함수를 사용해서 1차원 배열로 평평하게 펼 수가 있습니다. 이때 order 매개변수를 설정해줄 때 조금 주의가 필요합니다. 아래에 2*3*2 의 3차원 배열에 대해서 축이 어떻게 설정되어있느냐(배열 순서가 어떤가)에 따라서 order='C'와 order='K'를 선택해서 사용하면 되겠습니다. 


(4) np.raver(y, order='C') : 3차원 배열의 평평하게 펴기



In [5]: y = np.arange(12).reshape(2, 3, 2)

   ...: y

Out[5]:

array([[[ 0, 1],

         [ 2, 3],

         [ 4, 5]],


        [[ 6, 7],

         [ 8, 9],

         [10, 11]]])

 



In [6]: np.ravel(y, order='C')

   ...:

Out[6]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

 




 (5) np.ravel(z, order='K') : 축이 바뀐 3차원 배열을 평평하게 펴기



In [7]: z = np.arange(12).reshape(2, 3, 2).swapaxes(1, 2)


In [8]: z

Out[8]:

array([[[ 0, 2, 4],

         [ 1, 3, 5]],


        [[ 6, 8, 10],

         [ 7, 9, 11]]])

 



In [9]: np.ravel(z, order='K')

   ...:

Out[9]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

 



이상으로 다차원 배열을 1차원 배열로 평평하게 펴주는 numpy.ravel(a, order='C', 'F', 'K') 함수에 대해서 알아보았습니다. 


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



Posted by R Friend R_Friend

외국의 블로그에 소프트엔지니어 채용 과정 중에 코딩 인터뷰에서 있을 법한 문제로 회자되는 "FizzBuzz" 문제가 있습니다. 


"FizzBuzz"문제는 


 - 1에서 100까지의 숫자를 출력하되, 

 - 만약 해당 숫자가 '3'으로 나누어지면 숫자 대신에 "Fizz"를 출력하고, 

 - 만약 해당 숫자가 '5'로 나누어지면 숫자 대신에 "Buzz"를 출력하며, 

 - 만약 해당 숫자가 '3'과 '5'로 모두 나누어지면 숫자 대신에 "FizzBuzz"를 출력


하는 코드는 짜라는 것입니다.  


1~100까지 하기에는 좀 길기 때문에 1~30까지의 숫자에 대해서만 FizzBuzz 문제를 풀어보면 아래의 Original -> FizzBuzz 변환 전/후 비교를 보시면 이해가 쉬울 것입니다. 




위의 FizzBuzz 문제를 푸는 방법이 여러가지가 있을 수 있을 텐데요, (1) if, elif, else 조건문 사용, (2) if, elif, else 조건문을 포함한 사용자 정의 함수, (3) 문자열 합치기 (concatenating strings) 의 세 가지 방법을 소개합니다. 



  (1) if, elif, else 조건문을 사용한 FizzBuzz 코딩



# (1) if, elif, and else

for num in range(1, 31):

    if num % 3 == 0 and num % 5 == 0:

        print('FizzBuzz')

    elif num % 3 == 0:

        print('Fizz')

    elif num % 5 == 0:

        print('Buzz')

    else:

        print(num)

 




  (2) if, elif, else 조건문과 사용자 정의 함수(UDF)을 사용한 FizzBuzz 코딩


사용자 정의 함수에 대해서는 조만간 포스팅 하겠습니다. ^^



# (2) User Defined Function

def fizzbuzz(num):

    if num % 3 == 0 and num % 5 == 0:

        return 'FizzBuzz'

    elif num % 3 == 0:

        return 'Fizz'

    elif num % 5 == 0:

        return 'Buzz'

    else:

        return str(num)

    

print("\n".join(fizzbuzz(num) for num in range(1, 31)))

 




  (3) 문자열 합치기(Concatenating Strings)을 이용한 FizzBuzz 코딩



# (3) Concatenating Strings

for num in range(1, 31):

    string = ""

    if num % 3 == 0:

        string = string + "Fizz"

    if num % 5 == 0:

        string = string + "Buzz"

    if num % 5 != 0 and num % 3 != 0:

        string = string + str(num)

    print(string)

 



아래 링크는 취업 인터뷰에서 FizzBuzz 코딩 문제를 듣고서 Tensorflow로 딥러닝 모형을 적용했다가 취업 실패했다는 (가상의?) 블로그 내용입니다.  


Fizz Buzz in Tensorflow (http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/)


간단한 '주먹지르기'로 해결할 수 있는 문제를 단지 '최신 유행'하는 기술이라는 이유만으로  '공중 3회전 날아 뒤돌아 발 차고 손목날로 목 가로지르기' 기술을 적용할 필요가 있는가에 대해서 우스개 (가상?) 사례로 소개한 포스팅인 듯 합니다.  Interviewer 의 반응을 유심히 보면서... 인터뷰 과정을 한번 보시는 것도 재미있을 것 같습니다. ㅋㅋ


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. 



Posted by R Friend R_Friend

Jupyter Notebook 이나 ipython 을 사용하다보면 향후 버전이 올라갈 때 변경될 사항 등을 알려주는 경고 메시지(warning message)가 거슬릴 때가 있습니다. 


이럴 때는 warnings 라이브러리를 사용해서 


 - (1) 경고 메시지를 무시하고 숨기거나 (Ignore warning message)

    : warnings.filterwarnings(action='ignore')


 - (2) 숨기기했던 경고 메시지를 다시 보이게 (Reset to default)

    : warnings.filterwarnings(action='default')


하면 됩니다.  


별 내용은 없는 포스팅이긴 한데요, 이게 또 몰라서 경고 메시지가 주피터 노트북의 화면을 잔뜩, 계속 채우는 걸 보고 있노라면 은근히 신경이 쓰이기도 하거든요. ^^; 




아래에는 경고 메시지가 나타났을 때 

import warnings

warnings.filterwarnings(action='ignore') 

로 경고 메시지를 무시하고 숨기기를 했다가, 


warnings.filterwarnings(action='default')

를 사용해서 다시 경고 메시지가 나타나게 해본 예제입니다. 




많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. 



Posted by R Friend R_Friend

파이썬 NumPy 에서 배열의 차원(Dimension)을 재구조화, 변경하고자 할 때 reshape() 메소드를 사용합니다.  가령, 3개의 행과 4개의 열로 구성된 2차원의 배열로 재설정하고 싶으면 reshape(3, 4) 처럼 reshape()의 매개변수로 변경하고자 하는 배열의 행과 열의 차원을 정수로 입력해주면 됩니다. 


그런데 reshape(-1, 2) 혹은 reshape(3, -1) 처럼 reshape() 메소드 안에 '-1'이 들어가 있는 경우가 있습니다. 이때 reshape()의 '-1'이 의미하는 바는, 변경된 배열의 '-1' 위치의 차원은 "원래 배열의 길이와 남은 차원으로 부터 추정"이 된다는 뜻입니다. (One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.)


말이 좀 어렵고, 금방 이해하기가 쉽지 않은데요, ^^; 아래에 간단한 예를 들어서 설명해보겠습니다. 


먼저 NumPy 라이브러리를 import 하고 3x4 차원의 예제 배열을 만들어보겠습니다. 

(우리가 일상적으로 사용하는 reshape() 의 사용 예제)



In [1]: import numpy as np


In [2]: x = np.arange(12).reshape(3, 4)


In [3]: x.shape

Out[3]: (3, 4)


In [4]: x

Out[4]:

array([[ 0, 1, 2, 3],

        [ 4, 5, 6, 7],

        [ 8, 9, 10, 11]])

 



  (1) reshape(-1, 정수) 의 행(row) 위치에 '-1'이 들어있을 경우


이제 reshape() 의 행(row) 차원 위치에 '-1'을 넣으면 어떻게 재구조화가 되는지 살펴보겠습니다. 

총 12개의 원소가 들어있는 배열 x에 대해서 x.reshape(-1, 정수) 를 해주면 '열(column)' 차원의 '정수'에 따라서 12개의 원소가 빠짐없이 배치될 수 있도록 '-1'이 들어가 있는 '행(row)' 의 개수가 가변적으로 정해짐을 알 수 있습니다.  


x.reshape(-1, 1)

=> shape(12,1)

x.reshape(-1, 2

=> shape(6, 2)

 x.reshape(-1, 3)

=> shape(4, 3)

x.reshape(-1, 4

=> shape(34)

 

In [5]: x.reshape(-1, 1)

Out[5]:

array([[ 0],

        [ 1],

        [ 2],

        [ 3],

        [ 4],

        [ 5],

        [ 6],

        [ 7],

        [ 8],

        [ 9],

        [10],

        [11]])


 In [6]: x.reshape(-1, 2)

Out[6]:

array([[ 0, 1],

        [ 2, 3],

        [ 4, 5],

        [ 6, 7],

        [ 8, 9],

        [10, 11]])







 In [7]: x.reshape(-1, 3)

Out[7]:

array([[ 0, 1, 2],

        [ 3, 4, 5],

        [ 6, 7, 8],

        [ 9, 10, 11]])









 In [8]: x.reshape(-1, 4)

Out[8]:

array([[ 0, 1, 2, 3],

        [ 4, 5, 6, 7],

        [ 8, 9, 10, 11]])













  (2) reshape(정수, -1) 의 열(column) 위치에 '-1'이 들어있을 경우


다음으로 reshape()의 열(column) 위치에 '-1'을 넣으면 어떻게 재구조화되는지 살펴보겠습니다. 

x의 총 원소 12개가 모두 배열될 수 있도록 행(row)의 정수가 정해지면, 이에 따라서 '-1'이 들어있는 열(column)의 개수가 정해짐을 알 수 있습니다. 


즉, 행이나 열의 특정 차원을 기준으로 재배열하고 싶은 행이나 열의 개수가 있으면 나머지 차원의 개수는 '-1'로 해두면 알아서 자동으로 재배열을 해주니 편리한 기능이라고 하겠습니다. 


x.reshape(1, -1)

  => shape(1, 12)

 

In [9]: x.reshape(1, -1)

Out[9]: array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])


 x.reshape(2, -1)

  => shape(2, 6)

 

In [10]: x.reshape(2, -1)

Out[10]:

array([[ 0, 1, 2, 3, 4, 5],

        [ 6, 7, 8, 9, 10, 11]])


 x.reshape(3, -1)

  => shape(3, 4)

 

In [11]: x.reshape(3, -1)

Out[11]:

array([[ 0, 1, 2, 3],

        [ 4, 5, 6, 7],

        [ 8, 9, 10, 11]])


 x.reshape(4, -1)

  => shape(4, 3)


In [12]: x.reshape(4, -1)

Out[12]:

array([[ 0, 1, 2],

        [ 3, 4, 5],

        [ 6, 7, 8],

        [ 9, 10, 11]])





  (3) reshape(-1) 인 경우


x.reshape(-1)은 x.reshape(1, -1)과 같이 1차원 배열을 반환합니다. 


x.reshape(-1)

 

In [13]: x.reshape(-1)

Out[13]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])


 x.reshape(1, -1)

 

x.reshape(1, -1)

Out[14]: array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])





  (4) ValueError: cannot reshape array of size 12 into shape (5)


reshape(-1, 정수) 또는 reshape(정수, -1) 메소드가 제대로 작동하기 위해서는 한가지 조건이 있는데요, 원래의 배열에 있는 원소가 재구조화 혹은 재배열 되려는 배열의 차원에 빠짐없이 분배가 될 수 있어야 한다는 점입니다.  


가령, 위의 (1), (2), (3)번 예에서는 12개의 원소로 구성된 x배열을 (1, 12), (2, 6), (3, 4), (4, 3) 으로 재배열했었습니다. 하지만 아래의 ValueError 가 난 것처럼 12개의 원소로 구성된 원래의 배열 x에 대해 x.reshape(-1, 5) 혹은 x.reshape(7, -1) 로 재구조화하려고 하면 서로 호환이 안되기 때문에 ValueError가 난 것입니다. 



In [15]: x.reshape(-1, 5)

Traceback (most recent call last):


File "<ipython-input-15-3341ca33497d>", line 1, in <module>

x.reshape(-1, 5)


ValueError: cannot reshape array of size 12 into shape (5)

In [16]: x.reshape(7, -1)

Traceback (most recent call last):


File "<ipython-input-16-c8e97ae7c9bc>", line 1, in <module>

x.reshape(7, -1)


ValueError: cannot reshape array of size 12 into shape (7,newaxis)

 




  (5) ValueError: can only specify one unknown dimension


reshape(-1, -1)은 행, 열 어느 차원도 정해주지 않았으므로 ValueError 가 발생합니다. 



In [17]: x.reshape(-1, -1)

Traceback (most recent call last):


File "<ipython-input-17-8142d87a8f95>", line 1, in <module>

x.reshape(-1, -1)


ValueError: can only specify one unknown dimension

 



많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. ^^



Posted by R Friend R_Friend

지난번 포스팅에서는 파이썬 프로그램 흐름 제어의 2가지 큰 뼈대 중에서 


(1) 조건이 참(True), 거짓(False)인지에 따라 프로그램 흐름을 나누어 주는 분기문 (Branch statements) 로서 


 - if statements

 - if, else statements

 - if, elif, else statements

 - nested if statements


에 대해서 알아보았습니다. 



이번 포스팅에서는 파이썬 프로그램 흐름 제어의 두번째 주제로서 


(2) 조건이 참이거나 순서열의 끝까지 반복, 중단하게 해주는 반복문(Loop statements) 으로서 


 - while: 조건이 참인 동안 반복 (loop while the condition is True)

 - for: 순서열의 처음부터 끝까지 반복 (loop until the end of the sequence)

 - continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True)

 - break: 조건이 참이면 반복문 중단 (stop loop if the condition is True)


에 대해서 알아보겠습니다. 


반복문(Loop statement)을 잘 사용하면 단순 반복 작업을 컴퓨터에게 시킬 수 있으므로 분석가, 프로그래머에게 소중한 시간을 절약할 수 있게 해주어 매우 유용합니다. 



[ 파이썬 프로그램 흐름 제어 : 반복문 (Loop statement) ]





먼저 while 반복문부터 살펴보겠습니다. 


 (1) while: 조건이 참인 동안 반복 (loop while the condition is True)


while 문은 조건(condition)이 참(True) 인 동안 계속 반복하게 해줍니다. 


for 문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 반복하는데 반해, while 문은 조건(condition)이 참(True)인 동안 반복한다는 차이점이 있습니다. 따라서, for 문처럼 처음과 끝을 알 수 없고, 그저 조건(condition) 을 만족하는 동안에는 반복을 시키고 싶으면 while 반복문을 사용하면 되겠습니다. 


[Syntax of while loop in python]

while condition:

    conditional code block 


while 반복문은 위의 Syntax 처럼 while 다음에 조건(condition)을 써주고 끝에 콜론(colon, :)을 꼭 붙여주어야 합니다. 그 다음줄부터는 조건이 참(condition is True)인 경우에 반복 실행시키고자 하는 code block을 써주는데요, 이때 들여쓰기(indentation)을 해주어야 합니다.(spyder 같은 IDE를 사용하면 알아서 들여쓰기 해주어서 편함)




(1-1) while 반복문


처음에 '0'부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 그 값을 출력하고 '1'씩 더해가는 반복작업을 하는 아주 간단한 예제를 들어보겠습니다. 


while 반복문

실행 결과 (result)

count = 0

while count < 5:

    print('count : ', count)

    count = count + 1

    

print('The end')

count : 0

count : 1

count : 2

count : 3

count : 4

The end




(1-2) else 조건문과 함께 사용하는 while 반복문


while 반복문에 else 조건문을 같이 사용할 수 도 있습니다. 

아래에 '0' 부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과 값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 '5보다 작다'를 출력하고 이전 값에 '1'씩 더해가며, '5 미만' 조건을 만족하지 않으면(else) '5보다 작지 않다'를 출력하고 반복을 멈추는 예제를 들어보겠습니다. 


while 반복문 

실행 결과 (result) 

count = 0

while count < 5:

    print(count, ' is less than 5')

    count = count + 1

else:

    print(count, ' is not less 5 so stop here') 

0  is less than 5

1  is less than 5

2  is less than 5

3  is less than 5

4  is less than 5

5  is not less 5 so stop here




(1-3) 무한 반복문 (infinite loop)


while 반복문의 조건을 True 로 해놓으면 컴퓨터의 전원을 끄지 않는 한 계속해서, 무한 반복(infinite loop)하게 됩니다. 무한 반복을 어디에 써먹을 수 있을까 싶을 텐데요, 서버처럼 연중 무중단 운영을 하는 경우 유용하게 사용할 수 있습니다. (while(True): 또는 while True: )


아래 예제에서는 무한반복해서 프린트하는 것을 spyder의 우측 상단의 중단 단추를 눌러서 강제로 종료시켰습니다. (KeyboardInterrupt)


while 반복문 (infinite loop)

실행 결과 (result) 

 # Infinite loop

while(True):

    print('Infinite loop goes on and on ...')

Infinite loop goes on and on ...

Infinite loop goes on and on ...

Infinite loop goes on and on ...


File "zmq/backend/cython/checkrc.pxd", line 12, in zmq.backend.cython.checkrc._check_rc (zmq\backend\cython\socket.c:9621)


KeyboardInterrupt



while 무한 반복문(while True: )에 지난번 포스팅에서 살펴보았던 if, elif, else 분기문과 break 반복문 제어문을 같이 사용할 수도 있겠지요?  아래는 사용자로부터 input()으로 answer 를 받아서, answer 별로 다른 메시지를 출력하는 과정을 무한 반복(while True:  이므로...)하되, elif 조건에 해당하면 무한반복을 중단(break) 하도록 하는 예제입니다. 말로 설명하려니 너무 주저리주저리 인데요, 아래 코드와 실행 결과를 살펴보시면 이해가 금방 갈 겁니다. 


 while 반복문 (with if, elif, else & break)

실행 결과 (result) 

while True:

    print('continue or stop? [continue/stop]:')

    answer = input()

    

    if answer == 'continue':

        print('>> continue again!')

    elif answer == 'stop':

        print('>> stop here!')

        break

    else:

        print('>> wrong answer!')

continue or stop? [continue/stop]:


continue

>> continue again!

continue or stop? [continue/stop]:


repeate

>> wrong answer!

continue or stop? [continue/stop]:


continue

>> continue again!

continue or stop? [continue/stop]:


stop

>> stop here!




 (2) for:  순서열의 처음부터 끝까지 반복 (loop until the end of the sequence)


다음으로 for 반복문입니다. while 반복문이 조건(condition)이 참(True) 인 경우에 반복을 하는 반면에, for 반복문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 순서대로 거쳐가면서 반복을 하게 됩니다. 




[Syntax of for loop statement in python]

for iterating_var in sequence:

    code block 


for 반복문은 'for' 다음에 '반복 변수(iterating_var)'를 지정해주고 'in' 다음에 순서열(sequence), 그리고 마지막에 '콜론(colon, :)을 써줍니다. 그리고 그 다음줄에 반복을 시킬 code block 을 써주면 되는데요, 이때 들여쓰기(indentation)을 해주어야 합니다. (IDE를 사용하면 자동으로 들여쓰기 해줌)



파이썬의 순서열에는 문자열(string), 튜플(tuple), 리스트(list), 사전(dictionary), Range 등이 있습니다. 


저는 특히 업무에서는 데이터 프레임을 만들어서 행(column)이나 열(row)의 개수를 세어서 range() 함수와 함께 for 반복문을 만들어서 자주 쓰곤 합니다. 



(2-1) for 반복문 : with Range


for 반복문과 함께 range(start, end, interval) 함수를 사용해서 'start' 부터 'end' 보다 작은 정수값을 'interval' 정수값 만큼 간격을 두고 증가하는 순서열을 만들어보겠습니다. 


range() 함수의 매개변수 start, end, interval 사용 시, 

 - 매개변수 'end' 의 순서열 항목은 포함이 되지 않으며,

   (아래 예제에서 range(0, 5, 1) 실행결과에서 '5'는 빠져있음. R 사용자가 헷갈리기 쉬우므로 주의 요망) 

 - 매개변수 'interval'로 순서열의 간격을 설정할 수 있으며, 

 - 매개변수 'interval'을 생략하면 순서열의 간격은 '1'이 디폴트이고, 

 - 매개변수 'start'을 생략하면 순서열은 '0'부터 디폴트로 시작하고, 

 - 정수만 인식하고 부동소수형(float)은 TypeError 가 발생합니다. 


 for i in range(start, end, interval)

실행 결과 (result) 

for i in range(0, 5, 1): # (start, end, interval)

    print(i)

0

1

2

3

4

for i in range(3, 10, 2):

    print(i)

3

5

7

9

for i in range(0, 5): # interval default : 1

    print(i)

0

1

2

3

4

for i in range(5): # start default : 0

    print(i)

0

1

2

3

4

for i in range(5, 5):

    print(i)

(no result)

# TypeError

for i in range(4.9, 5):

    print(i)

Traceback (most recent call last):


  File "<ipython-input-11-bb2a792a3440>", line 1, in <module>

    for i in range(4.9, 5):


TypeError: 'float' object cannot be interpreted as an integer



for 문을 복수번 사용하는 것도 가능합니다. 

for 반복문과 range() 함수를 두번 사용해서 1~5 사이의 정수에서 2개씩 뽑은 모든 조합 (즉, 5C2) 의 합을 구해보는 예제입니다. 


for i in range() 복수 반복문

실행 결과 (result) 

for i in range(1, 6):

    for j in range(i+1, 6):

        print(i, '+', j, '=', i+j)

1 + 2 = 3

1 + 3 = 4

1 + 4 = 5

1 + 5 = 6

2 + 3 = 5

2 + 4 = 6

2 + 5 = 7

3 + 4 = 7

3 + 5 = 8

4 + 5 = 9



(2-2) for 반복문 with 튜플(tuple)


파이썬의 순서열 중에서 이번에는 튜플(tuple)을 사용하여 for 반복문을 만들어보겠습니다. 튜플 안의 원소들을 하나씩 순회하면서 프린트를 해주는 코드입니다. 


for i in tuple

실행 결과 (result) 

for i in ('Python', 'is', 'easy'):

    print(i)


print('Really?')

Python

is

easy

Really?



바로 위의 예제와 동일한 결과를 반환하는 for loop 반복문을 range(len(tuple)) 과 tuple[index] 를 함께 사용하여 프로그래밍할 수도 있습니다. 위의 코드에 비하면 길기도 하고, 좀 복잡해 보이기도 하는데요, 만약 튜플의 길이가 길다면 아래의 방법으로 코딩하는 것이 더 깔끔할 수도 있으니 같이 알아 두시면 좋겠습니다. 


for loop with range() & tuple index

실행 결과 (result) 

# iterating by sequence index


mytuple = ('Python', 'is', 'easy')


for index in range(len(mytuple)):

    print(mytuple[index])


print('Really?')

Python

is

easy

Really? 



(2-3) for 반복문 with 리스트(list)


리스트도 순서열의 하나 이므로 위의 튜플 예제와 유사하게 for 반복문을 만들 수 있습니다. 리스트(list) 안에 있는 원소들을 순서대로 순회하면서 프린트하는 예제 코드입니다. 


for i in list

실행 결과 (result) 

for mylist in ['Python', 'is', 'easy']:

    print(mylist)


print('Are you sure?') 

Python

is

easy

Are you sure? 



(2-4) for 반복문 with 문자열(string)


문자의 순서열(sequence of character)인 문자열(string)도 마찬가지로 for 반복문이 가능합니다. 문자열의 개별 문자(character)와 공백(space) 하나 하나 별로 순회하면서 끝의 원소까지 프린트하는 예제 코드입니다. 


for i in string

실행 결과 (result) 

for mystr in ('Python is easy'):

    print(mystr)

print('--The end of string character--')

P

y

t

h

o

n

 

i

s

 

e

a

s

y

--The end of string character--



(2-5) for 반복문 with 사전(dictionary) & 튜플 분해(tuple unpacking)


사전(dictionary) 자료형의 경우는 dic.items()로 먼저 튜플 분해(tuple unpacking, 한글로 번역을 어케해야 할까요...? ^^;)를 해서 for 반복문에 사용하면 됩니다.  고객 ID와 이름의 짝(ID, Name pair)을 이룬 사전 자료형을 순서대로 프린트하도록 하는 for 반복문 예제입니다. 


for i in dictionary

실행 결과 (result) 

mydic = {'cust_01': 'kim'

            'cust_02': 'lee'

            'cust_03': 'choi'}


for key, val in mydic.items(): # tuple unpacking

    print("ID is '{0}' and NAME is '{1}'".format(key, val))

ID is 'cust_01' and NAME is 'kim'

ID is 'cust_02' and NAME is 'lee'

ID is 'cust_03' and NAME is 'choi'




3. continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True)

     break: 조건이 참이면 반복문 중단 (stop loop if the condition is True)


(3-1) continue 반복 제어문


continue 는 조건이 참(True)일 때 continue 아래 부분의 code block 을 실행하지 않고 처음의 반복 부분으로 되돌아가서 반복 loop을 계속하도록 해줍니다. 


아래 예제는 for 반복문과 continue 반복 제어문을 사용해서 '1'부터 '5'까지의 정수로 이루어진 range 순서열에서 짝수(even number)이면 반복 문의 처음으로 되돌아가고, '홀수'(odd number)이면 프린트해주는 코드입니다. 


for 반복문 with continue 제어문

실행 결과 (result) 

# print only odd numbers b/w 1 ~ 5

for i in range(1, 6):

    if i % 2 == 0:

        continue

    

    print(i)

1

3

5



'1'부터 '5'까지의 정수로 이루어진 range 순서열에서 두 개의 정수를 조합(combination) 하여 합이 '5'인 경우만 프린트를 하게 해주는 코드를 for 반복문과 continue 반복 제어문을 사용해서 짜보았습니다. 


for 반복문 with continue 제어문

실행 결과 (result) 

# if i+j == 5 then print i, j combination

for i in range(1, 6):

    for j in range(i+1, 6):

        if i+j != 5:

            continue        


        print(i, '+', j, '=', i+j)

1 + 4 = 5

2 + 3 = 5



(3-2) break 반복 제어문


break 반복 제어문은 조건이 참(True)일 때 반복을 중단(break, stop) 시키는 역할을 합니다. 위의 continue 와는 정반대의 기능을 하는 것이지요. 


아래는 '1'부터 '6까지의 정수로 이루어진 range 수열을 순서대로 프린트를 반복하여 하되, 만약 '4'에 도달하면 중단(break)하라는 간단한 반복문 예제입니다. 


for 반복문 with break 제어문

실행 결과 (result) 

for i in range(1, 6):

    print(i)

    

    if i == 4:

        break

1

2

3

4



위의 (3-1)의 두번째 예제에서 continue 를 사용해서 '1~5' 사이의 두 개의 정수의 합이 '5'인 조합을 프린트했었는데요, 이번에는 break 제어문을 사용해서 똑같은 결과를 출력해보겠습니다. (print(i, '+', j, '=', i+j) 함수의 위치가 위의 continue를 사용했을 때와 break 를 사용했을 때 다릅니다.)


 for 반복문 with break 제어문

실행 결과 (result)

for i in range(1, 6):

    for j in range(i+1, 6):

        if i+j == 5:

            print(i, '+', j, '=', i+j)

            break

1 + 4 = 5

2 + 3 = 5



(3-3) for 반복문에 if, else 조건문과 break 반복 제어문 사용


아래 예제는 break 반복 제어문을 사용해서 '3~20'까지의 정수 중에서 '1'과 자기 자신 외에는 나누어지지 않는 정수인 소수(prime number) 를 찾아내는 프로그램 코드입니다. for 반복문, if, else 조건문, break 반복 제어문이 복합적으로 사용된, 좀 복잡한 코드입니다만, 지난번 포스팅과 이번 포스팅을 찬찬히 살펴보고 여기까지 따라오신 분이라면 충분히 이해하실 수 있을 것이라고 생각합니다. 


for 반복문 with break, if, else

실행 결과 (result) 

for i in range(3, 21):

    for j in range(2, i):

        if i%j == 0:

            k = i/j

            print('%d is %d * %d' %(i, j, k))

            break # to move to the next number

        else:

            print(i, ' is prime')

            break


print('The end')

3  is prime

4 is 2 * 2

5  is prime

6 is 2 * 3

7  is prime

8 is 2 * 4

9  is prime

10 is 2 * 5

11  is prime

12 is 2 * 6

13  is prime

14 is 2 * 7

15  is prime

16 is 2 * 8

17  is prime

18 is 2 * 9

19  is prime

20 is 2 * 10

The end



(3-4) nested while 반복문에 if 조건문과 break 반복 제어문 사용


nested while 반복문에 if 와 break를 사용해서 위의 (3-3)에서 했던 결과와 동일한 '3~20 사이의 소수 찾기' 를 해보겠습니다. 아래 코드는 tutorialspoint 에서 참고한 것인데요, 이해하기가 좀 어렵네요. ^^; 


nested while loops with break, if

실행 결과 (result) 

i = 3

while(i < 21):

    j = 2

    while(j <= (i/j)):

        if not(i%j): 

            print('%d is %d * %d' %(i, j, i/j))

            break

        

        j = j + 1

        

    if (j > i/j):

        print(i, " is prime")

        

    i = i + 1

    

print('The end')


# True or False?

# not(4%2) # True

# not(3%2) # False

3  is prime

4 is 2 * 2

5  is prime

6 is 2 * 3

7  is prime

8 is 2 * 4

9 is 3 * 3

10 is 2 * 5

11  is prime

12 is 2 * 6

13  is prime

14 is 2 * 7

15 is 3 * 5

16 is 2 * 8

17  is prime

18 is 2 * 9

19  is prime

20 is 2 * 10

The end


많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요.



Posted by R Friend R_Friend

지난 포스팅에서는 파이썬 프로그래밍에 들어가기에 앞서 파이썬이 어떻게 참(True), 거짓(False)을 평가, 판단하는지에 대한 기본 문법을 알아보았습니다. 


이번 포스팅부터는 파이썬 프로그램의 흐름을 제어(Python progmram flow control)하는 방법에 대해서 몇 개 포스팅으로 나누어서 소개를 하겠습니다. 


파이썬 프로그램 흐름 제어에서 알아야 할 큰 2가지 뼈대가 있다면 


- (1) 조건이 참(True), 거짓(False)인지에 따라 프로그램 흐름을 나누어 주는 분기문(Branch statements)

       : if statements

       : if, else statements

       : if, elif, else statements

       : nested if statements


- (2) 조건이 참이거나 순서열의 끝까지 반복, 중단하게 해주는 반복문

       : while

       : for

       : continue, break


가 있습니다. 


이번 포스팅에서는 먼저 if, elif, else 분기문(Branch statement)에 대해서 알아보겠습니다. 



[ 파이썬 프로그램 흐름 제어 (Python program flow control) ]






먼저 if, else 분기문에서 사용하는 용어를 간단히 짚어보고 넘어가겠습니다. 


  • if 조건문에는 참(True), 거짓(False)을 평가할 수 있는 조건을 써주고, 마지막에는 콜론(:)을 붙여줍니다.
  • if 조건문이 거짓이면 'else:' 조건문으로 프로그램 흐름이 넘어가게 되며, 역시 마지막 부분에 콜론(:)을 붙여줍니다. 
  • if, else 조건문 아래의 컴퓨터에게 시킬 일을 적어놓은 부분은 '코드 덩어리 (Code Block)'라고 합니다. 
  • Code Block 은 '들여쓰기(indentation)'를 해서 구분을 해줍니다. 보통 space bar로 4칸 사용합니다. 
    (R, Java, C 등은 중괄호 { } 를 사용)


[ 파이썬 if, else 분기문 예시 (example of Python if, else branch statement) ]




이제 파이썬의 if, else 분기문을 가지고 간단한 프로그램을 하나 짜보도록 하겠습니다. 


 (1) 조건이 1개 일 때 if, else 분기문 (if, else branch statement with 1 condition)


파이썬이 해야 하는 일의 흐름은, 

  • (1-1) 파이썬 시험 점수를 입력받아서

  • (1-2) 만약 파이썬 시험 점수가 80점 이상이면 (if 조건문 True)
    "당신의 파이썬 점수는 xx점입니다. 축하합니다. 파이썬 시험을 통과하였습니다. :-)"
    를 출력하고, 종료. 

  • (1-3) 만약 파이썬 시험 점수가 80점 이상이 아니면 (if 조건문 False)
    "당신의 파이썬 점수는 xx점입니다. 파이썬 시험을 낙제했습니다. 공부 더 하세요. T_T"
    를 출력하고 종료. 

        [ Flow Diagram ]



위의 프로그램 흐름을 if, else 분기문을 사용해서 파이썬 프로그래밍을 해보면 아래와 같습니다. 



# (1) if, else statement


print('Put your Python test score : ')


py_score = int(input())


if py_score >= 80:

    

    print('Your Python score is {0}'.format(py_score))

    print('Congratulations! You passed Python test. :-)')

    

else:

    

    print('Your Python score is {0}'.format(py_score))

    print('You failed Python test. Study more! T_T')

 



아래에 파이썬 시험 점수가 90점일 때와 70점일 때 원하는 메시지대로 출력을 제대로 해주는지 시험해 보겠습니다. 



Put your Python test score :

90


Your Python score is 90

Congratulations! You passed Python test. :-)

 



Put your Python test score :

70


Your Python score is 70

You failed Python test. Study more! T_T

 



if 와 else 분기절의 마지막에 콜론(colon, :)을 실수로 빼먹으면 'SyntaxError: invalid syntax' 에러가 발생합니다. 



# If you miss colon(:) at the end, then 'SyntaxError: invalid syntax'

In [3]: print('Put your Python test score : ')

    ...:

    ...: py_score = int(input())

    ...:

    ...: if py_score >= 80 # Oops! Syntax Error due to no colon(:)

    ...:

    ...: print('Your Python score is {0}'.format(py_score))

    ...: print('Congratulations! You passed Python test. :-)')

    ...:

    ...:

    ...: else:

    ...:

    ...: print('Your Python score is {0}'.format(py_score))

    ...: print('You failed Python test. Study more! T_T')

    ...:

File "<ipython-input-18-b2c00ee4ee98>", line 5

if py_score >= 80 # Oops! Syntax Error due to no colon(:)

^

SyntaxError: invalid syntax

 




다음으로, 조건이 2개 이상일 때 if, elif, else 분기문 사용하는 법을 알아보겠습니다. elif 는 else if 의 줄임말로 보면 되겠습니다. 


 (2) 조건이 2개 일 때 if, elif, else 분기문 

      (if, elif, else branch statement with multiple condition expressions)


파이썬 시험 점수는 0점 ~ 100점 사이의 정수만 가능하고, 0점~100점 사이의 정수를 벗어나면 (예: -50점, 150점) '점수를 잘못입력했습니다'라는 안내 메시지를 출력하는 것으로 프로그램 코드를 좀더 똑똑하게 짜보겠습니다. 

  • (2-1) 파이썬 시험 점수를 입력받아서

  • (2-2) 만약 파이썬 시험 점수가 '80점 이상 ~ 100점 이하' 이면 
    "당신의 파이썬 점수는 xx점입니다. 축하합니다. 파이썬 시험을 통과하였습니다. :-)"를 출력하고, 종료. 

  • (2-3) 만약 파이썬 시험 점수가 '80점 이상 ~ 100점 이하'가 아니면서, '0점 이상 ~ 80점 미만'이면 
    "당신의 파이썬 점수는 xx점입니다. 파이썬 시험을 낙제했습니다. 공부 더 하세요. T_T"를 출력하고 종료. 

  • (2-4) 만약 파이썬 시험 점수가 '80점 이상 ~ 100점 이하'도 아니고, '0점 이상 ~ 80점 미만'도 아니면 
    "파이썬 시험 점수를 잘못 입력하였습니다" 를 출력하고 종료. 


       [ Flow Diagram ]




위의 (2-2) 프로그램 흐름을 파이썬 코드로 짜보면 아래와 같습니다.  if 조건문 안에 if 조건문을 중첩해서 쓸 수도 있구요, and, or 논리 연산자를 같이 쓸 수도 있습니다. 


# (2) if, elif, else statement


print('Put your Python test score : ')


py_score = int(input())


if py_score >= 80 and py_score <= 100:

    

    print('Your Python score is {0}'.format(py_score))

    print('Congratulations! You passed Python test')

    

elif py_score >= 0 and py_score < 80:

    

    print('Your Python score is {0}'.format(py_score))

    print('You failed Python test. Study more!')

    

else:

    

    print('You put the wrong score.')

 



파이썬 점수로 150점 (<- 잘못 입력), 90점(<- 시험 통과), 60점(<- 시험 낙제), -50점(<- 잘못 입력) 을 각 각 입력해보겠습니다. 



Put your Python test score : 

150


You put the wrong score.

 



Put your Python test score : 

90


Your Python score is 90

Congratulations! You passed Python test

 



Put your Python test score : 

60


Your Python score is 60

You failed Python test. Study more!

 



Put your Python test score : 

-50


You put the wrong score.

 




 (3) if 조건문 안에 if 조건문을 중첩해서 프로그래밍 하기 (nested if statements)


위의 (2)번 프로그램 흐름을 nested if statements를 사용해서 아래에 구현해 보았습니다. 위의 (2)번 if, elif, else 보다 더 복잡하고 코드도 길군요. 특히, nested if statements 를 사용할 때는 들여쓰기(indentation) 할 때 유의해야 합니다.  Spyder나 Pycharm 같은 IDE 의 Editor 창을 사용하면 자동으로 들여쓰기를 해줘서 실수를 방지하는데 도움이 됩니다. 



# (3) nested if statements

print('Put your Python test score : ')


py_score = int(input())


if py_score <= 100:

    if py_score >= 80:       

        print('Your Python score is {0}'.format(py_score))

        print('Congratulations! You passed Python test. :-)')

    

    else:       

        if py_score < 80:

            if py_score > 0:

                print('Your Python score is {0}'.format(py_score))

                print('You failed Python test. Study more! T_T')

                

            else:                

                print('You put the wrong score.')

        

else:    

    print('You put the wrong score.')

 



프로그램 흐름 제어 코드를 잘 짠건지 한번 시험을 해볼까요?  150점 (<- 잘못 입력), 90점 (<- 시험 통과), 60점 (<- 시험 낙제), -50점 (<- 잘못 입력)을 각 각 입력해보겠습니다.  아래 결과를 보니 파이썬 프로그램 코드를 제대로 짰네요. ^^



Put your Python test score : 

150


You put the wrong score.

 



Put your Python test score : 

90


Your Python score is 90

Congratulations! You passed Python test. :-)

 



Put your Python test score : 

60


Your Python score is 60

You failed Python test. Study more! T_T

 



Put your Python test score : 

-50


You put the wrong score.

 



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. 


다음 포스팅에서는 반복문(Loop statement)에 대해서 알아보겠습니다. 



Posted by R Friend R_Friend

Python 으로 if 를 활용한 분기문이나 for, while 을 활용한 반복문 프로그래밍에 들어가기에 앞서서, if, for, while 프로그래밍의 기초 지식이 되는 블리언 형식에 대해서 알아보겠습니다. 


이번 포스팅은 어려운건 없구요, 그냥 편안하게 몸풀기 (머리 풀기?) 정도로 읽어보면 좋겠습니다. 

(not 논리 연산자가 살짝 헷갈리기는 합니다만, 전반적으로 매우 쉬움)


블리언 형식(Boolean type)참(True), 거짓(False) 의 두 개 값을 가지는 자료형을 말합니다. 



# (1) Boolean Type

In [1]: a = 2 > 1


In [2]: a

Out[2]: True


In [3]: b = 2 < 1


In [4]: b

Out[4]: False


In [5]: type(a)

Out[5]: bool

 


불리언 값이 (1) 조건문, (2) 논리 연산자, (3) 비교 연산자에서 어떤 경우에 참(True)이고, 어떤 경우에 거짓(False) 인지에 대해서 짚고 넘어가 보겠습니다. 



[ 파이썬 참/거짓 불리언 형식 (Python Boolean Type ]





 (1) 조건문에서의 참, 거짓 (True, False in Conditional statements)


프로그래밍의 조건문에서 참, 거짓을 판단할 때 블리언 False, None, 숫자 0, 비어있는 리스트, 비어 있는 튜플, 비어있는 사전 자료형의 경우에 False 로 판단을 합니다. 


반대로 블리언 True, not None, 0이 아닌 숫자, 값이 있는 리스트, 값이 있는 튜플, 값이 있는 사전 자료형의 경우 True 로 판단을 하구요. 


자료형마다 값이 없이 비어있으면 거짓, 값을 가지고 있으면 참이라고 파이썬은 판단한다는게 재미있습니다. ^^


각 경우 마다 bool() 함수를 사용해서 파이썬이 참(True)과 거짓(False) 중에 어떻게 판단을 하는지 예를 들어서 살펴보겠습니다. 



# (1-1) Boolean False, True

In [6]: bool(False) # False

Out[6]: False


In [7]: bool(True) # True

Out[7]: True

 



# (1-2) None is False

In [8]: bool(None) # False

Out[8]: False

 



# (1-3) Number 0, 0.00 is False

In [9]: bool(0) # False

Out[9]: False


In [10]: bool(0.00) # False

Out[10]: False


In [11]: bool(5) # True

Out[11]: True

 



# (1-4) blank List [] is False

In [12]: bool([]) # False

Out[12]: False


In [13]: bool(['a', 'b']) # True

Out[13]: True

 



# (1-5) blank Tuple () is False

In [14]: bool(()) # False

Out[14]: False

In [15]: bool(('a', 'b')) # True

Out[15]: True

 



# (1-6) blank Dictionary {} is False

In [16]: bool({}) # False

Out[16]: False

In [17]: bool({'a': 'b'}) # True

Out[17]: True

 




  (2) 논리 연산자에서 참, 거짓 (True, False in Logical operators) : not, and, or


파이썬의 논리 연산자(Logical operators)에는 피연산자를 부정하는 not, 두 피연산자 간의 논리곱을 수행하는 and, 두 연산자 간의 논리합을 수행하는 or 의 3가지가 있습니다. 



(2-1) 피연산자를 부정하는 'not' 논리 연산자 


위에서 소개한 조건문에서의 참, 거짓에 not 연산자를 붙이면 참이 거짓으로 바뀌고, 거짓은 참으로 바뀌게 됩니다. 



# (2-1) 피연산자 부정 'not' logical operator


In [18]: not True # False

Out[18]: False


In [19]: not False # True

Out[19]: True

 



숫자 '0'은 거짓(False)라고 했으므로 앞에 부정 연산자 not 이 붙으면 참(True)이 됩니다. 반면, '0'이 아닌 숫자는 참(True)이라고 했으므로 앞에 not 이 붙으면 거짓(False)으로 바뀝니다. 



In [20]: not 0 # True

Out[20]: True


In [21]: not 5 # False

Out[21]: False

 



None 은 거짓(False)라고 했으므로 not None은 참(True)로 평가합니다. 



In [22]: not None # True

Out[22]: True

 



비어있는 문자열, 리스트, 튜플, 사전은 거짓(False)으로 평가한다고 했으므로, 피연산자를 부정하는 not 이 붙으면 참(True)으로 바뀌게 됩니다. 



In [23]: not '' # denial of blank String -> True

Out[23]: True


In [24]: not [] # denial of blank List -> True

Out[24]: True


In [25]: not () # denial of blank Tuple -> True

Out[25]: True


In [26]: not {} # denial of blank Dictionary -> True

Out[26]: True

 



반대로, 문자열, 리스트, 튜플, 사전에 값이 들어있는 경우 참(True)으로 평가한다고 했으므로, 피연산자를 부정하는 not이 붙으면 거짓(False)이 됩니다.  위와 아래의 비어있는 자료형에 not 붙인 경우와 값이 있는 자료형에 not 붙인 경우의 참, 거짓이 처음엔 좀 직관적으로 와닿지가 안던데요, 자꾸 보니깐 그러려니 하게 되네요. ^^'



In [27]: not 'ab' # False

Out[27]: False


In [28]: not ['a', 'b'] # False

Out[28]: False


In [29]: not ('a', 'b') # False

Out[29]: False


In [30]: not {'a' : 'b'} # False

Out[30]: False

 




(2-2) 두 피연산자 간의 논리곱을 수행하는 and 논리 연산자


두 개의 피연산자가 모두 참(True and True)이면 True 이며, 두 피연산자 값 중에서 하나라도 거짓(False)이 있으면 거짓(False) 으로 판단합니다. 



# (2-2) 논리곱 'and' logical operator

In [31]: True and True # True

Out[31]: True


In [32]: True and False # False

Out[32]: False


In [33]: False and True # False

Out[33]: False

 

In [34]: False and False # False

Out[34]: False





(2-3) 두 피연산자 간의 논리합을 수행하는 or 논리 연산자


두 피연산자 중에서 한 개(True or False, False or True)나 혹은 두개 모두(True or True) 이라도 참(True)이면 참으로 평가합니다. 



# (2-3) 논리합 'or' logical operator

In [35]: True or True # True

Out[35]: True


In [36]: True or False # True

Out[36]: True


In [37]: False or False # False

Out[37]: False

 




  (3) 비교 연산자에서의 참, 거짓 (True, False in Comparison operators) : ==, !=, >, >=, <, <=


(3-1) == 비교 연산자


두 피연산자의 값이 같으면 참(True), 서로 다르면 거짓(False)으로 평가



# (3) Comparison(Relational) operators


In [39]: a = 1; b = 2; c = 2 # input data



# (3-1) == : If the values of two operands are equal, then the condition becomes true


In [40]: a == b # False

Out[40]: False


In [41]: b == c # True

Out[41]: True

 



(3-2) != 비교 연산자


두 피연산자의 값이 같지 않으면 참(True), 같으면 거짓(False)으로 평가 (음... 좀 헷갈리지요. ^^;)



In [39]: a = 1; b = 2; c = 2 # input data

# (3-2) != : If values of two operands are not equal, then condition becomes true

In [42]: a != b # True

Out[42]: True


In [43]: b != c # False

Out[43]: False

 



(3-3) > 비교 연산자


: 왼쪽의 피연산자 값이 오른쪽의 피연산자 값보다 크면 참(True), 아니면 거짓(False)



In [39]: a = 1; b = 2; c = 2 # input data


# (3-3) > : If the value of left operand is greater than the value of right operand, 

# then condition becomes true


In [44]: a > b # False

Out[44]: False


In [45]: b > a # True

Out[45]: True


In [46]: b > c # False

Out[46]: False

 



(3-4) >= 비교 연산자


왼쪽의 피연산자 값이 오른쪽의 피연산자 값보다 크거나 같으면 참(True), 아니면 거짓(False)



In [39]: a = 1; b = 2; c = 2 # input data


# (3-4) >= : If the value of left operand is greater than or equal to the value of right operand, 

# then condition becomes true


In [47]: a >= b # False

Out[47]: False


In [48]: b >= a # True

Out[48]: True


In [49]: b >= c # True

Out[49]: True

 



(3-5) < 비교 연산자


왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작으면 참(True), 아니면 거짓(False)



In [39]: a = 1; b = 2; c = 2 # input data

# (3-5) < : If the value of left operand is less than the value of right operand, 

# then condition becomes true


In [50]: a < b # True

Out[50]: True


In [51]: b < a # False

Out[51]: False


In [52]: b < c # False

Out[52]: False

 



(3-6) <= 비교 연산자


왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같으면 참(True), 아니면 거짓(False)



In [39]: a = 1; b = 2; c = 2 # input data


# (3-6) <= : If the value of left operand is less than or equal to the value of right operand,
# then condition becomes true


In [53]: a <= b # True

Out[53]: True


In [54]: b <= a # False

Out[54]: False


In [55]: b <= c # True

Out[55]: True

 



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^


다음번 포스팅에서는 if ~ else 분기문(Branch statement)에 대해서 알아보겠습니다. 



Posted by R Friend R_Friend

파이썬(Python)에는 다양한 형태의 다수의 데이터를 다룰 수 있는 자료형으로 리스트(Lists), 튜플(Tuples), 사전(Dictionary) 등이 있습니다. 


지난번 포스팅에서는 사전(Python Dictionary) 자료형의 생성, 삭제, 기본 연산자에 대해서 소개하였습니다.  이번 포스팅에서는 지난번에 이어서, 사전 자료형의 내장 함수 및 메소드(Dictionary built-in functions and methods)에 대해서 알아보겠습니다. 


사전 자료형은 키와 값의 쌍(pair of Key and Value)으로 이루어져 있는 형태에 맞게 이에 특화된 메소드들이 있습니다. 



[ 파이썬 사전 자료형의 내장 함수 및 메소드 (Python Dictionary built-in functions and methods) ]






1. 파이썬 사전 자료형의 내장 함수 (Python Dictionary built-in functions)


 1-1. len(dict): 사전의 총 길이 (total length of Dictionary)



# 1-1. len(dict) : Gives the total length of the dictionary

>>> dict_1 = {'name' : 'Python Friend', 

...           'region' : 'Busan, Korea', 

...           'phone' : '010-123-9876', 

...           'age' : 30,

...           'name' : 'R Friend'}

>>> dict_1

{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}

>>> len(dict_1)

4

 




 1-2. str(dict): 사전을 문자열로 반환 (string representation of a Dictionary)



# 1-2. str(dict) : Produces a printable string representation of a dictionary

>>> str(dict_1)

"{'name': 'R Friend', 'region': 'Busan, Korea', 'phone': '010-123-9876', 'age': 30}"





 1-3. type(variable): 입력 변수의 유형 반환 (returns the type of the passed variable)



# 1-3. type() : Returns the type of the passed variable

>>> type(dict_1)

<class 'dict'>

 





2. 파이썬 사전 자료형의 메소드 (Python Dictionary methods)


 2-1. dict.keys(): 사전의 키 목록



# 2-1. dict.keys(): Returns a list of all the available keys in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.keys()

dict_keys(['key1', 'key2', 'key3'])

 




 2-2. dict.values(): 사전의 값 목록



# 2-2. dict.values(): Returns a list of all the values available in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.values()

dict_values([123, 'abc', (1, 2, 3)])

 




 2-3. dict.items(): 사전의 (키, 값) 튜플 목록 



# 2-3. dict.items(): Returns a list of dict's (key, value) tuple pairs

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.items()

dict_items([('key1', 123), ('key2', 'abc'), ('key3', (1, 2, 3))])

 




 2-4. dict.clear(): 사전의 모든 {키, 값} 셋 제거



# 2-4. dict.clear() : Removes all items from the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.clear()

>>> dict_2

{}

 




 2-5. dict.copy(): 사전의 {키 : 값} 셋 복사



# 2-5. dict.copy(): Returns a copy of the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

dict_2

>>> {'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_3 = dict_2.copy()

>>> dict_3

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

 




 2-6. dict.fromkeys(seq, value): seq, value 셋으로 신규 사전 생성



# 2-6. dict.fromkeys(): Creates a new dictionary with keys from seq and values set to value

>>> seq = ('key1', 'key2', 'key3')

>>> 

>>> dict_4 = dict.fromkeys(seq)

>>> dict_4

{'key1': None, 'key2': None, 'key3': None}

>>> 

>>> dict_4 = dict.fromkeys(seq, 123)

>>> dict_4

{'key1': 123, 'key2': 123, 'key3': 123}

 




2-7. dict.get(key, default=None): 키에 할당된 값 반환



# 2-7. dict.get(key, default=None): Returns a value for the given key

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

          'key3' : (1, 2, 3)}

... >>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

>>> dict_2.get('key1', 'No_Key')

123

>>> dict_2.get('key5', 'No_Key') # If key is not available then returns 'No_Key'

'No_Key'

>>> dict_2.get('key5') # If key is not available then returns default value None

 




2-8. dict.setdefault(key, default=None) : 키에 할당된 값 반환


dict.get()과 유사합니다. 



# 2-8. dict.setdefault(key, default=None): Returns the key value available in the dictionary

>>> dict_2 = {'key1' : 123, 

...           'key2' : 'abc', 

...           'key3' : (1, 2, 3)}

>>> 

>>> dict_2

{'key1': 123, 'key2': 'abc', 'key3': (1, 2, 3)}

>>> 

dict_2.setdefault('key1', 'No-Key')

>>> 123

>>> dict_2.setdefault('key5', 'No_Key') 

'No_Key'

>>> dict_2.setdefault('key6', None)

 




2.9. dict.update(dict2): 기존 사전에 새로운 사전 dict2 추가



# 2-9. dict.update(dict2): Adds dictionary dict2's key-values pairs into dict

>>> dict_5 = {'key1' : 12, 

...           'key2' : 34}

>>> dict_5

{'key1': 12, 'key2': 34}

>>> 

>>> dict_6 = {'key3' : 56}

>>> 

>>> dict_5.update(dict_6)

>>> dict_5

{'key1': 12, 'key2': 34, 'key3': 56}

 



드디어 파이썬의 5가지 자료형인 숫자(Number), 문자열(String), 리스트(List), 튜플(Tuple), 그리고 사전(Dictionary)에 대한 생성, 기본 사용법, 내장함수 및 메소드에 대한 소개를 마쳤습니다. 


가장 기본이 되는 것이고 매우 매우 중요한 것이다 보니 블로그에 한번 정리를 해야지, 해야지... 하다가도 numpy 랑 pandas 먼저 포스팅하고.... 한참이 지나서야 기본이 되는 자료구조에 대해서는 이제서야 포스팅을 하게 되었네요.  밀린 숙제 끝낸 기분이라 홀가분하고 좋네요. ^^


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^


Posted by R Friend R_Friend