본문 바로가기
Python

function

by oncerun 2023. 5. 5.
반응형

 

파이썬에서 함수의 형태를 우선 알아보자.

 

def functionName(arg, arg2):
	명령 블록

 

define의 약자인 def의 키워드와 함수이름, 함수 매개변수와 세미콜론으로 정의한다.

 

그 밑에 탭을 통한 구분밑에 명령블록을 작성하면 된다. 

 

원뿔의 부피를 계산하는 함수를 작성해 보자.

 

매개 변수에 대한 검증하는 부분은 제외하고 작성하자.

 

def coneVol(radius, height):
   vol = 1/3 * 3.14 * r ** 2 * h
   print("부피", vol)

 

만약 반환값이 있는 경우 혹시 반환타입을 적어주는 문법이 있을까?

 

내장 함수의 format함수를 사용해 보자.

 

format은 정렬방향, 필드 폭, 소수점 이하 자릿수, 데이터타입을 넣어주면 된다.

 

def coneVol(radius, height):
  if radius > 0 and height > 0 :
    vol = 1/3 * 3.14 * radius ** 2 * height
    return vol
  else :
    print('not allow negative')
  
vol = coneVol(203,32);

print(format(vol, "<20.5f"))


====
1380226.77333

 

타입에 대한 큰 제약이 없는 언어 같고 언어의 탄생과 의도에 충실한 언어인 것 같다 매우 간편하고 추상적이고 제약이 적다.

 

파이썬 중에 독창적인 기능이 있는데 동시 할당이라는 개념이다.

 

시퀀스의 개념을 통해 하나의 할당연사자만으로 여러 값들을 한 번에 전달할 수 있다.

 

a, b, c = 1 ,"2", 3.03

print(a, b, c)


===
1 2 3.03

 

이는 swap에서도 쉽게 활용이 가능하다. 

rad = 10
hei = 20

print(rad, hei)

rad, hei = hei, rad;

print(rad, hei)


====

10 20
20 10
def coneVol(radius, height):
  if radius > 0 and height > 0 :
    vol = 1/3 * 3.14 * radius ** 2 * height
    suf = 3.14 * radius ** 2 + 3.14 * radius * height
    return vol, suf
  else :
    print('not allow negative')

result = coneVol(32, 23);
print(result)

 

리턴도 콤마를 통해 반환하고 이를 하나의 변수로 받을 수 있다..

각 각 따로 받으려면 다음과 같이 한다.

 

def coneVol(radius, height):
  if radius > 0 and height > 0 :
    vol = 1/3 * 3.14 * radius ** 2 * height
    suf = 3.14 * radius ** 2 + 3.14 * radius * height
    return vol, suf
  else :
    print('not allow negative')

vol, suf = coneVol(32, 23);

print(vol)
print(suf)

 

이거 너무 편한 거 아닌가?

 

매개변수의 기본값도 지정할 수 있다. 자바스크립트랑 매우 구조도 비슷한 것 같다.

 

def coneVol(radius = 20, height = 20):
  if radius > 0 and height > 0 :
    vol = 1/3 * 3.14 * radius ** 2 * height
    return vol
  else :
    print('not allow negative')
  
vol = coneVol();

 

다만 일반 매개변수 앞에 위치할 수 없다.

 

 

 

파이썬은 기본적으로 값의 전달인 것 같다. 함수 내부에서 매개변수의 값을 변경해도 원본 변수의 값은 변경되지 않는다.

 

기본적으로 주소를 전달하지는 않는 것 같다. 

 

강의에서 설명은 프로그램 공간과 함수의 공간으로 메모리 공간이 나누어진다고 설명하고 함수 실행 시 원본 주소의 변수의 값을 복사하여 전달한다고 한다. 

 

찾아보자.

파이썬 프로그램은 일반적으로 메모리 내에 스택(stack)과 힙(heap) 두 가지 구조를 사용합니다. 

스택은 함수 호출과 같은 작업을 수행할 때 사용되며, 힙은 동적으로 할당된 메모리 객체에 사용됩니다. 

 

스택은 후입선출(LIFO, Last-In-First-Out) 구조를 가지며, 새로운 함수 호출이 발생할 때마다 새로운 프레임(frame)이 스택의 맨 위에 추가됩니다.

 함수가 실행을 마치면 해당 프레임은 스택에서 제거됩니다.

프레임에는 함수 호출 시 함수 인수, 지역 변수 및 반환 주소 등의 정보가 저장됩니다. 각각의 프레임은 이전 프레임을 참조하는 포인터를 가지며, 이를 통해 스택 내부의 호출 순서를 추적할 수 있습니다.

힙은 객체와 변수와 같은 동적으로 할당된 메모리를 저장합니다. 힙은 할당된 객체의 크기에 따라 조절되며, 일반적으로 힙에는 다양한 데이터 타입의 객체가 저장됩니다.

파이썬은 가비지 컬렉션(garbage collection) 기능을 갖추고 있어서, 더 이상 사용하지 않는 객체는 자동으로 힙에서 제거됩니다. 이는 개발자가 메모리 관리를 직접 처리할 필요가 없도록 만들어줍니다.

 

 

 

이어서 가변 매개변수도 알아보자.

 

애스트로피 *를 통해 단 1개만 사용할 수 있다. 또한 일반 매개변수 앞에 위치할 수 없다.

 

실제 전달될 때는 배열로 전달된다. 

 

def coneVol(radius = 20, *heights):
    for h in heights:
      vol = 1/3 * 3.14 * radius ** 2 * h
      print(vol)

coneVol(12, 32, 43, 23, 122);


====
4823.04
6480.96
3466.56
18387.84

 

반응형

'Python' 카테고리의 다른 글

Module  (0) 2023.05.05
class  (0) 2023.05.05
Python  (0) 2023.04.24

댓글