이번 포스팅에서는 함수의 호출자(caller)에게 코드를 실행시킨 후의 값(result)을 반환해주는 return 문에 대해서 3가지 유형으로 나누어서 소개하겠습니다. 


(1) return + result => 호출자에게 result 반환

(2) no return & no result => code_block 실행 후 종료 (None 반환)

(3) return (no result) => 함수 즉시 종료




첫번째의 return + result 문은 함수를 사용할 때의 일반적인 형태로서 이미 친숙할 것이라고 예상합니다. 두번째와 세번째는 좀 낯설 수도 있는데요, 이번 포스팅에서 예를 들어가면서 자세히 설명해보겠습니다. 



  (1) return + result => 호출자에게 result 값 반환


아래에 my_sum(3, 5) 함수를 호출하여 sum_all = 3 + 5 = 8 의 result 값을 sum_result 에 반환(return)한 예시입니다. 



In [1]: def my_sum(num1, num2):

   ...:     sum_all = num1 + num2

   ...:     return sum_all;


In [2]: sum_result = my_sum(3, 5)


In [3]: sum_result

Out[3]: 8

 




  (2) no return & no result => code_block 실행 후 종료 (None 반환)


다음으로 함수의 마지막 부분에 return 문을 사용하지 않을 경우, 함수 안의 code_block 만 실행할 뿐 호출자에게는 None을 반환합니다 (즉, 아무값도 반환하지 않음). 


이때 함수를 실행한 후의 결과값을 저장한 객체는 "None Type"이 됩니다. 



In [4]: def my_sum2(num1, num2):

   ...:     sum_all = num1 + num2;


In [5]: sum_result2 = my_sum2(3, 5)


In [6]: sum_result2


In [7]: type(sum_result2) # None

Out[7]: NoneType

 



아래의 예제와 같이 하나의 함수 안에 2개의 return 문을 사용할 수도 있습니다. 하지만 이럴 경우 의도치 않게 실수로 버그를 만들 수도 있으므로 가급적 하나의 return 문을 사용하는 것이 좋습니다. 아래의 예제에서는 argument 로 '0' 값을 받을 경우 return 문이 실행되지 않기 때문에 (의도치않게) None 을 반환하고 있습니다. 



In [8]: def my_abs(num):

   ...:     if num > 0:

   ...:         return num

   ...:     elif num < 0:

   ...:         return (-1)*num;


In [9]: abs_result = my_abs(-1)


In [10]: abs_result

Out[10]: 1


In [11]: abs_result = my_abs(0)


In [12]: abs_result   # no result


In [13]: type(abs_result)   # None

Out[13]: NoneType

 




  (3) return only (no result) => 함수 즉시 종료


마지막으로 return 문만 있고 뒤에 result 가 없는 경우입니다. 이럴 경우에 return 문은 함수 호출자에게 값을 반환(return)하는 의미로 쓰인 것이 아니고 함수를 종료(close)시키는 의미로 쓰였다고 보면 됩니다.  


아래의 예에서는 code block에 i를 loop 돌면서 프린트하는 실행문이 들어있으며, 만약 i 가 1부터 하나씩 증가하다가 3이 되면 return 문을 맞닥드려서 함수를 종료시켜버리는 함수입니다.  따라서 my_print(10) 을 실행시켰을 때 1, 2, 3 까지만 프린트가 실행이 되고 거기서 중단이 되었기 때문에 나머지 4 ~ 10까지는 프린트가 안되었습니다. 



In [14]: def my_print(num):

    ...:     for i in range(1, num+1):

    ...:         print(i)

    ...:         if i == 3:

    ...:             return;


In [15]: my_print(3)

1

2

3


In [16]: my_print(10)

1

2

3

 


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


728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 함수의 매개변수 중에서 매개변수의 수가 함수 정의 시에 정한 개수로 고정되어 있는 위치 매개변수, 키워드 매개변수, 기본값 매개변수에 대해서 소개하였습니다. 


이번 포스팅에서는 매개변수의 수가 상황에 따라서 변화하는 가변 매개변수 (Arbitrary Arguments, Variable Length Arguments)에 대해서 알아보겠습니다. 


가변 매개변수는 

  - (1) *args_tuple : Positional 매개변수 (Tuple)

  - (2) **args_dict : 키워드 매개변수 (Dictionary)

의 두가지가 있습니다. 




함수 중에 보면 매개변수로 * (Asterisk), ** (Two Asterisks) 가 들어있는 경우 처음보는 분이라면 이게 무슨 뜻인가하고 궁금하였을 것입니다. 이번 포스팅을 보고 나면 이해가 될 것이예요. 



먼저 지난번 포스팅에서 소개했던 위치 매개변수를 복습해보겠습니다. line 2 에서 'print_list' 함수를 정의할 때 매개변수 'text_list' 1개만을 정의했으며, line 3에서 print_list() 함수를 호출할 때 mylist 1개를 매개변수 위치에 입력해주었더니 정상적으로 잘 출력을 해주었습니다. 



In [1]: mylist = ['Korea', 'Sweden', 'Mexico', 'Germany']


In [2]: def print_list(text_list):

    ...: for text in text_list:

    ...: print text


In [3]: print_list(mylist)

Korea

Sweden

Mexico

Germany

 



하지만, 아래의 line 4 에서 처럼 print_list() 함수의 매개변수에 ('Korea', 'Sweden', 'Mexico', 'Germany') 의 4개의 값을 입력하자 'TypeError: print_list() takes exactly 1 arguments(4 given)' 이라는 에러 메시지가 떴습니다. 이처럼 매개변수 값으로 여러개의 값을 이용하고자 할 때 쓰는 것이 가변 매개변수(arbitrary arguments, variable length arguments) 입니다. 



# TypeError: print_list() takes exactly 1 argument (4 given)

In [4]: print_list('Korea', 'Sweden', 'Mexico', 'Germany')

Traceback (most recent call last):


File "<ipython-input-4-5358764707f0>", line 1, in <module>

print_list('Korea', 'Sweden', 'Mexico', 'Germany')


TypeError: print_list() takes exactly 1 argument (4 given)

 


위의 line 4 처럼 했을 때 TypeError 가 났던 것을 Positional 가변 매개변수를 사용하여 정상적으로 작동하도록 고쳐보면 아래와 같습니다. 



  (1) *args_tuple : Positional 매개변수 (Tuple 형태)


괄호 안의 매개변수 입력란에 '* (Asterisk)' 로 시작하는 매개변수 이름을 넣어줍니다. 이 가변 매개변수는 Tuple 형태입니다. 



In [5]: def print_list_2(*text_list):

    ...: for text in text_list:

    ...: print text


In [6]: print_list_2('Korea', 'Sweden', 'Mexico', 'Germany') # more arguments

Korea

Sweden

Mexico

Germany

 



==============================================================


다음으로 사전형(Dictionary Type)을 매개변수 값으로 받아서 프린트를 해주는 함수를 정의해보겠습니다. 



In [7]: worldcup2018 = dict({'A': 'Russia, Saudi, Egypt, Uruguay',

   ...: 'F': 'Korea, Sweden, Mexico, Germany'})


In [8]: def print_group(group):

   ...: for i in group.keys():

   ...: print ("{0} : {1}".format(i, group[i]))


In [9]: print_group(worldcup2018)

A : Russia, Saudi, Egypt, Uruguay

F : Korea, Sweden, Mexico, Germany

 



위의 line 8 에서 정의한 함수에 아래의 line 10 처럼 여러 개의 사전형 값을 매개변수 값으로 입력하면 'TypeError: print_group() got an unexpected keyword argument 'A'' 라는 에러 메시지가 뜹니다. 



# TypeError: print_group() got an unexpected keyword argument 'A'

In [10]: print_group(A='Russia, Saudi, Egypt, Uruguay',

    ...: F='Korea, Sweden, Mexico, Germany')

Traceback (most recent call last):


File "<ipython-input-10-bae24f97b031>", line 2, in <module>

F='Korea, Sweden, Mexico, Germany')


TypeError: print_group() got an unexpected keyword argument 'A'

 



위의 line 10 처럼 매개변수 값으로 다수 개의 사전형 값을 사용하고 싶을 때 **agrs_dict 의 가변형 매개변수를 사용하면 됩니다. 


  (2) **agrs_dict : 키워드 매개변수 (Dictionary 형태)


사전형(Dictionary) 의 Key 값이 키워드 매개변수의 키워드(Keyword) 가 됩니다. 파이썬 라이브러리의 함수들을 보다 보면 **kwagrs 라고 표현된 경우가 있는데요, 이때 kw 가 KeyWord 의 K(ey)W(ord) 의 kw 를 따온 거예요. 



In [11]: def print_group_2(**group):

    ...: for i in group.keys():

    ...: print ("{0} : {1}".format(i, group[i]))


In [12]: print_group_2(A='Russia, Saudi, Egypt, Uruguay',

    ...: F='Korea, Sweden, Mexico, Germany')

A : Russia, Saudi, Egypt, Uruguay

F : Korea, Sweden, Mexico, Germany

 




  (3) 순서 : *args_tuple 먼저, **args_dict 나중에


*args_tuple 과 **args_dict 두 가지 유형의 가변 매개변수를 모두 사용하여 함수를 정의할 수 있습니다. 단, 이때 순서가 중요합니다. *args_tuple 을 먼저 정의하고, **args_dict 를 나중에 이어서 정의해야 합니다. 



#%% arguments sequence matters

In [13]: def print_all(*tup, **dic):

    ...: print(tup)

    ...: print(dic)


In [14]: print_all(1, 2, 3,

    ...: A='Russia, Saudi',

    ...: F='Korea, Sweden')

(1, 2, 3)

{'A': 'Russia, Saudi', 'F': 'Korea, Sweden'}

 



만약 아래의 line 15 처럼 **args_dict 먼저 정의하고, *args_tuple 을 그 뒤에 이어서 정의하게 되면 'SyntaxError: invalid syntax' 라는 에러 메시지가 뜹니다. 



# SyntaxError: invalid syntax

In [15]: def print_all(**dic, *tup):

    ...: print(tup)

    ...: print(dic)

    ...:

    ...:

File "<ipython-input-15-3e33a9bb0436>", line 1

def print_all(**dic, *tup):

^

SyntaxError: invalid syntax

 



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


728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 파이썬의 사용자 정의 함수를 사용하면 좋은 점, 함수를 정의하고 호출하는 기본 문법과 예제를 다루었습니다. 


이번 포스팅에서는 파이썬 함수의 입력(input) 값을 받아서 함수가 정의된 작업을 할 수 있도록 해주는 매개변수(Arguments)에 대해서 알아보겠습니다. 


함수를 호출하는데 사용하는 파이썬의 매개변수에는 아래의 4가지 유형이 있습니다. 

  • 위치 매개변수 (Positional Arguments)
  • 키워드 매개변수 (Keyword Arguments)
  • 기본값 매개변수 (Default Arguments)
  • 가변 매개변수 (Arbitrary Arguments)




이중에서 위치, 키워드, 기본값 매개변수까지만 이번 포스팅에서 소개하고, 가변 매개변수는 다음번 포스팅에서 소개하겠습니다. 



  위치 매개변수 (Positional Arguments)


위치 매개변수(Positional Arguments)는 함수 내 매개변수의 위치별 순서와 데이터 타입에 맞게 정확하게 입력을 해주어야만 하는 매개변수를 말합니다.  아래에 '2개'의 숫자를 매개변수로 받아서 평균을 계산해주는 my_avg() 라는 함수가 있다고 했을 때, 입력 매개변수로 '1개'의 숫자만을 입력받게 되었을 때 'TypeError: my_avg() takes exactly 2 arguments (1 given)' 이라는 에러 메시시가 떴습니다. 



In [1]: def my_avg(x1, x2):

   ...: avg_val = (x1 + x2)/ 2

   ...: return avg_val


In [2]: my_avg(2, 4)

Out[2]: 3


In [3]: my_avg(2) # TypeError

Traceback (most recent call last):


File "<ipython-input-3-69b7a0a22718>", line 1, in <module>

my_avg(2)


TypeError: my_avg() takes exactly 2 arguments (1 given)

 




  키워드 매개변수 (Keyword Arguments)


키워드 매개변수는 함수 호출과 관련이 있는데요, 키워드 매개변수를 이용하여 프로그래머는 함수를 호출할 때 매개변수의 이름(parameter name)으로 매개변수를 지정합니다. 


키워드 매개변수를 이용하면 함수를 정의할 때 썼던 매개변수의 입력 순서를 바꾸어서 함수를 호출할 수도 있으며, 코드 가독성도 높아지는 좋은 점이 있습니다. 


아래에 회사명(company)과 임직원 이름(name)을 출력하는 함수로 예를 들어보았습니다. 두번째 호출 예시에서 매개변수 순서를 바꾸어서 입력했음에도 불구하고 출력은 함수에서 정의했던 순서대로 출력되었음을 알 수 있습니다. 



# Keyword Arguments : The caller identifies the arguments by the parameter name

In [4]: def print_me(company, name):

   ...: print("Company : ", company)

   ...: print("Name : ", name)


In [5]: print_me(company="ABCD Co.", name="Mr.Jack")

('Company : ', 'ABCD Co.')

('Name : ', 'Mr.Jack')


# The order of parameters does not matter

In [6]: print_me(name="Mr.Jack", company="ABC Co.")

('Company : ', 'ABC Co.')

('Name : ', 'Mr.Jack')

 



만약 키워드 매개변수를 이용하지 않는 다면 입력 순서와 데이터 타입을 꼭 함수에서 정의한 순서와 맞추어 주어야 합니다. 아래의 2번째 예에서 보면 함수를 호출할 때 매개변수의 입력 순서가 바뀌면 함수를 정의할 때와의 의도와는 다르게 엉뚱한 순서로 값이 출력되었습니다. 



In [7]: print_me("ABCD Co.", "Mr.Jack")

('Company : ', 'ABCD Co.')

('Name : ', 'Mr.Jack')


# Without parameter name, the order matters

In [8]: print_me("Mr.Jack", "ABCD Co.")

('Company : ', 'Mr.Jack')

('Name : ', 'ABCD Co.')

 




  기본값 매개변수 (Default Arguments)


기본값 매개변수는 함수를 호출할 때 매개변수 입력이 없을 경우에 함수를 정의할 때 입력한 기본값(default value)을 사용할 수 있게 해줍니다.  함수를 정의할 때 기본값 설정이 안되어 있는 상태에서 함수 호출 시 매개변수 값 입력을 빼먹으면 TypeError가 나는데요, 기본값 매개변수를 사용하면 TypeError 없이 사용할 수 있게 됩니다. 대신, 기본값 설정을 잘 지정해주어야 겠지요. 


아래의 예에서는 name 매개변수에 "Who?"라는 기본값(default value)을 지정해서 함수를 print_me2 라는 함수를 정의를 했구요, 함수 호출 시 name 매개변수 값을 입력하지 않았더니 => 기본값이 "Who?"가 출력되었네요. 



# Default Argument Value

In [9]: def print_me2(company, name="Who?"):

   ...: print("Company : ", company)

   ...: print("Name : ", name)


In [10]: print_me2(company="ABC Co.") # No TypeError

('Company : ', 'ABC Co.')

('Name : ', 'Who?')

 



단, 기본값 매개변수는 매개변수의 첫번째에는 사용할 수 없습니다. 만약 첫번째 매개변수에 기본값을 지정하려고 하면 아래처럼 'SyntaxError: non-default argument follows default argument)' 라는 에러가 발생합니다. 



# SyntaxError: non-default argument follows default argument

In [11]: def print_me2(company="ABCD Co.", name):

    ...: print("Company : ", company)

    ...: print("Name : ", name)

    ...:

    ...:

File "<ipython-input-11-c9e7590bf632>", line 1

def print_me2(company="ABCD Co.", name):

SyntaxError: non-default argument follows default argument

 



마지막으로, 매개변수는 숫자로 시작할 수 없습니다. 아래처럼 '3_company' 처럼 숫자 '3'으로 매개변수 이름을 시작했더니 'SyntaxError: invalid syntax'라는 에러가 떴습니다. 



In [12]: def print_me3(3_company, name):

    ...: print("Company : ", company)

    ...: print("Name : ", name)

    ...:

    ...:

File "<ipython-input-12-46388f3578d8>", line 1

def print_me3(3_company, name):

^

SyntaxError: invalid syntax

 



다음번 포스팅에서는 가변 매개변수(arbitrary arguments)에 알아보겠습니다. 


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


728x90
반응형
Posted by Rfriend
,

함수(function)는 input을 받아서 특정 과업(들)을 수행하여 output을 반환하도록 짜여진, 잘 조직되고 재사용이 가능한 코드 블록을 말합니다.

 

그동안 파이썬의 내장형 함수(Built-in function), 여러 라이브러리의 함수에 대해서 소개를 했었는데요, 이번 포스팅부터는 사용자가 직접 함수를 정의해서 사용할 수 있는 '사용자 정의 함수 (User-Defined Function, UDF)' 에 대해서 소개하겠습니다.

 

[ 사용자 정의 함수의 유용성 ]

* 사용자 정의 함수를 재사용(reusable)할 수 있습니다.
* 코드를 구조화, 모듈화(modularization) 함으로써 관리하기 쉽습니다.
* 사용자 정의 함수를 사용하여 코드를 간결하게 하고 가독성을 높일 수 있습니다.
* 사용자 정의 함수를 분산해서 개별적으로 작성할 수 있으므로 애플리케이션 개발 속도를 높일 수 있습니다.


사용자 정의 함수는 (1) 사용자 정의 함수의 정의 (Definition), (2) 호출 (Call), (3) 반환 (Return) 의 절차를 따라서 이용할 수 있습니다.

 

 

사용자 정의함수를 정의(define) 할 때는

  • 첫 줄에는 def 로 시작하며
  • 사용자 정의 함수 이름을 쓰고,
  • 괄호 안에는 매개변수 목록을 쓰며,
  • 콜론(:)을 써줍니다.
  • 다음줄 부터는 들여쓰기(indentation)을 꼭 해주어야 하며,
  • 따옴표 세개("""함수 설명""")로 함수에 대한 부가 설명(Docstring)을 넣어주고 (optional)
  • 실행하고자 함는 작업에 대해서 코드블록을 작성합니다.
  • 마지막에 return 뒤에 반환하고자 하는 결과값을 써주면 됩니다.
  • 반환할 값이 없으면 return 은 생략 가능합니다.

 

(1) 숫자를 input으로 받아서 평균을 반환하는 간단한 사용자 정의 함수를 정의(define)해보겠습니다.

 

 

def my_avg(x1, x2):

    avg_val = (float(x1) + float(x2))/2

   

    return avg_val

 

 

 

(2) 위에서 만든 my_avg() 라는 사용자 정의 함수를 호출(call)하여 (2, 3), (2, 4) 의 두 쌍의 숫자들의 평균을 반환(return) 해보겠습니다.

 

 

In [2]: avg_val = my_avg(2, 3)


In [3]: avg_val

Out[3]: 2.5

 

In [4]: my_avg(2, 4)

Out[4]: 3.0

 

 

 

큰 따옴표 세개(""" Docstring """)로 사용자 정의 함수를 설명하는 Docstring을 추가하고, ?함수이름으로 Docstring을 불러와서 참고해보겠습니다.

 

 

def my_avg(x1, x2):

    """

    This function calculates average value of two numbers

    x1: first input number

    x2: second input number

    """

    avg_val = (float(x1) + float(x2))/2

 

    return avg_val


 

In [6]: ?my_avg()

Signature: my_avg(x1, x2)

Docstring:

This function calculates average value of two numbers

x1: first input number

x2: second input number

File: c:\users\admin\<ipython-input-5-d14cc1c6028b>

Type: function

 

 

 

사용자 정의 함수의 코드 블록에 if ~ else 조건문을 추가하여 좀더 복잡한 작업을 할 수도 있습니다. 위의 두 숫자를 input으로 받아서 평균을 반환하는 사용자 정의 함수에다가 '정수(integer) 혹은 부동소수형(float)'이 아니면 "This is not a number" 라는 메시지를 반환하도록 하는 조건문 코드를 추가해보겠습니다.

 

사용자정의함수와 조건문을 같이 쓰므로 콜론(:)으로 코드블록이 시작됨을 알려주고 들여쓰기(indentation)에 주의를 기울여야 합니다.

 

 

def my_avg(x1, x2):

    """

    This function calculates average value of two numbers

    x1: first input number

    x2: second input number

    """

    

    if isinstance(x1, (int, float)) and isinstance(x2, (int, float)):

        avg_val = (float(x1) + float(x2))/2

        return avg_val

    else:

        print("This is not a number")

      


In [8]: my_avg(2, 5)

Out[8]: 3.5


In [9]: my_avg('2', 5)

This is not a number

 

 

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

 

728x90
반응형
Posted by Rfriend
,

이번 포스팅에서는 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

 

 

 

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

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

 

 

728x90
반응형
Posted by Rfriend
,

외국의 블로그에 소프트엔지니어 채용 과정 중에 코딩 인터뷰에서 있을 법한 문제로 회자되는 "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 의 반응을 유심히 보면서... 인터뷰 과정을 한번 보시는 것도 재미있을 것 같습니다. ㅋㅋ


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

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



728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 파이썬 프로그램 흐름 제어의 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-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

        else:

            if j != i - 1:

                continue

            else:

                print(i, "is prime number.")

                break

print("The End")

3 is prime number.

4 is 2 * 2

5 is prime number.

6 is 2 * 3

7 is prime number.

8 is 2 * 4

9 is 3 * 3

10 is 2 * 5

11 is prime number.

12 is 2 * 6

13 is prime number.

14 is 2 * 7

15 is 3 * 5

16 is 2 * 8

17 is prime number.

18 is 2 * 9

19 is prime number.

20 is 2 * 10

The End



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


nested while 반복문에 if 와 break를 사용해서 위의 (3-3)에서 했던 결과와 동일한 '3~20 사이의 소수 찾기' 를 해보겠습니다. 


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


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


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



728x90
반응형
Posted by Rfriend
,

지난 포스팅에서는 파이썬 프로그래밍에 들어가기에 앞서 파이썬이 어떻게 참(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)에 대해서 알아보겠습니다. 



728x90
반응형
Posted by Rfriend
,

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)에 대해서 알아보겠습니다. 



728x90
반응형
Posted by Rfriend
,