파이썬 자료구조/알고리즘 06 : 기본 자료구조, 배열3

728x90

최댓값 구하는 프로그램 만들기

배열, 함수를 사용하여 복수의 모듈로 최댓값을 구하는 프로그램을 구현한다.

파일 이름을 max.py라고 가정한다.

from typing import Any, Sequence

def max_of(a: Sequence) -> Any:
    maximum = a[0]
    for i in range(1, len(a)):
        if a[i] > maximum:
            maximum = a[i]
    return maximum

if __name__ == '__main__':
    print('배열의 최댓값 구하기')
    num = int(input('원소 수 입력 : '))
    x = [None] * num
    
    for i in range(num):
        x[i] = int(input(f'x[{i}]값을 입력하세요. : '))
        
    print(f'최댓값은 {max_of(x)}입니다.')

 

from typing import Any, Sequence

Any는 제약이 없는 임의의 자료형.

Sequence는 리스트, 배열, 문자열, 튜플 등의 자료형이다.

 

def max_of(a: Sequence) -> Any:

max_of 함수가 건네받는 매개변수 a의 자료형은 시퀀스형으로 받고, 임의의 자료형인 Any로 반환한다.

print(f'최댓값은 {max_of(x)}입니다.')

따라서 여기서 리스트x의 원소들이 함수 max_of에게 건내주는 인자값이 되는데 int값과 float값이 섞여 있어도 문제가 되지 않는다. 

max_of함수에서 최댓값을 반환할 때, 최댓값이 int형이면 int를, float형이면 float형을 반환하게 된다.

 

 

if __name__ == '__main__':

파이썬에서 하나의 스크립트 프로그램을 모듈(module)이라고 한다. 사용할 때는 확장자(.py)를 포함하지 않고 파일 이름 자체를 모듈 이름으로 사용한다.

왼쪽 피연산자 __name__은 모듈 이름을 나타내는 변수이다.

스크립트 프로그램을 직접 실행하면 변수 __name__은 '__main__'이 된다. 

스크립트 프로그램이 다른 모듈로부터 import될 때 변수 __name__은 원래의 모듈 이름을 가진다.

 

여기서는 max.py 모듈을 직접 실행하므로 __name__ = '__main__'이 되므로 

if __name__ == '__main__':
    print('배열의 최댓값 구하기')
    num = int(input('원소 수 입력 : '))
    x = [None] * num
    
    for i in range(num):
        x[i] = int(input(f'x[{i}]값을 입력하세요. : '))
        
    print(f'최댓값은 {max_of(x)}입니다.')

의 명령문을 실행할 수 있게 된다.

 

 

다른 모듈에서 이 max.py 모듈의 max_of 함수만 이용할 수 있도록 import를 할 수 있다.

from max import max_of

print('배열의 최소값 구하기')
print('End 입력시 종료됨')

num = 0
x = []

while True:
    s = input(f'x[{num}]값을 입력 : ')
    if s == 'End':
        break
    x.append(int(s))
    num += 1

print(f'{num}개를 입력함.')
print(f'최댓값은 {max_of(x)}')
배열의 최소값 구하기
End 입력시 종료됨
x[0]값을 입력 : 2
x[1]값을 입력 : 4
x[2]값을 입력 : 5
값을 입력 : End
3개를 입력함. 최댓값은 5

 

from max import max_of

모듈 max에서 정의했었던 max_of 함수를 새로운 모듈에서 사용할 수 있도록 import 했다.

스크립트 프로그램이 다른 모듈로부터 import될 때 변수 __name__은 원래의 모듈 이름을 가진다.

따라서 max 모듈의

if __name__ == '__main__':
    print('배열의 최댓값 구하기')
    num = int(input('원소 수 입력 : '))
    x = [None] * num
    
    for i in range(num):
        x[i] = int(input(f'x[{i}]값을 입력하세요. : '))
        
    print(f'최댓값은 {max_of(x)}입니다.')

부분은 새로운 모듈에서는 실행되지 않게 된다. __name__ != '__main__'이 되기 때문이다.

 


 

리스트의 동일성 판단

lst1 = [1,2,3,4,5]
lst2 = [1,2,3,4,5]
print(lst1 is lst2)
False

is 연산자는 lst1, lst2의 동일성을 판단하여 식별번호와 값이 모두 같으면 True를 반환한다.

같은 리스트로 보이지만 리스트는 고정된 값, 리터럴(literal)이 아니기 때문에 False가 반환된다.

 

*리터럴(literal)
변수에 직접 고정된 값을 부여하는 것.
int a = 7
int num = null 에서 a, num은 변수이고 7, null은 리터럴이다.
=의 오른쪽의 값들은 프로그램이 끝날때까지 변하지 않는다.
변수의 초기화에 사용된다.

상수와 리터럴은 다른 개념이다.
const a = 100 과 같이 아얘 변수의 값까지도 변경할 수 없도록 한 것은 상수라고 한다.

 

 

n = 17

17이라는 int형 객체를 n이라는 이름으로 참조하고 있다.

파이썬에서의 변수는 값을 저장하고 있는 것이 아니라 단순히 이름으로 객체를 참조하고 있는 것에 불과하다.

만약 n의 값이 다른값으로 갱신되면 새로운 값을 갖는 객체가 생성되고, 그 값을 n이 참조하게 되는 것이다.(변수는 이름에 불과하다.)

 

따라서 =은 값을 복사하는 것이 아니라 참조하는 곳을 복사하는 것과 같다.

 

lst1 = [1, 2, 3, 4, 5]
lst2 = lst1
print(lst1 is lst2)
lst2[2] = 9
print(lst1)
print(lst2)
True
[1, 2, 9, 4, 5]
[1, 2, 9, 4, 5]

 

lst1과 lst2이 같은 곳을 참조하게 된다.

따라서 print(lst1 is lst2)가 True가 될 수 있고, lst2의 원소값을 바꿔도 lst1의 값까지 바뀌게 된다.

728x90