'Python 일정 간격의 수 생성 함수'에 해당되는 글 1건

  1. 2018.04.07 [Python] for loop 반복문에 사용하는 range(), enumerate(), linspace(), linrange() 함수

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