파이썬에서 함수의 형태를 우선 알아보자.
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
댓글