2018-05-21 TIL(Python 함수)

함수;블록 생성

파이썬 언어 특성상 for문 내의 변수, 예를 들면

for i in range(10):
	print(i)

위 코드의 변수 i는 for문 내에만 한정되는 변수가 아닌 글로벌 변수로 적용된다. 바깥쪽에서 print(i)를 쳐보면 i=9임을 알 수 있다. 따라서 for문은 특정 블록을 생성하지 않는다는 뜻이다.

특정 블록을 생성하려면 함수를 이용한다.

함수는 반복적인 작업을 하는 코드를 재사용이 가능하게 정의하여 놓은 것이다.

함수;기본 매개변수

인자가 제공되지 않을 때 기본 매개변수로 사용할 값 지정 가능

def student(name, age, gender, cls='WPS'):
	return {'name':name, 'age':age, 'gender':gender, 'class':cls}

cls를 인자로 넣지 않게 되면 ‘WPS’라는 기본값이 할당된다.

기본 매개변수 정의되는 시점

기본 매개변수 값은 함수가 실행 될 때마다 계산되는 것이 아니라 정의되는 시점에 계산된다.

예를 들어, 기본 매개변수에 리스트가 주어졌다고 했을 때 함수가 정의되는 순간 리스트가 생성된다. 함수가 실행될 때마다 새롭게 생성되지 않는다. 매 실행때마다 기본 매개변수로 주어진 리스트의 id값을 보면 같은 것을 알 수 있다.

만약에 그것을 방지하고자 하면 기본 매개변수인 리스트에 None값을 주면 된다.

객체 비교

A == B 와 A is B 차이

var1 = 234523452345
var2 = 234523452345

print(id(var1))
print(id(var2))

var1 is var2 # 메모리 주소 비교

var1 == var2 # __eq__()

내부함수의 클로져

클로져는 함수가 정의된 환경.

level = 0
def outer():
	level = 50
	def inner():
		nonlocal level
		level += 3
		print(level)
	return inner

f = outer()

이 떄 inner 함수가 사용하는 level변수는 nonlocal 키워드로 인해 outer에 있는 지역변수를 사용한다. 반복적으로 f를 실행한다면 inner외부의 level변수 값을 증가시킨다.

다시 풀어서 설명하면 애초에 outer를 실행하면 inner함수를 반환한다. inner 함수는 바깥에 있는 변수를 사용하여 숫자를 증가시키는 역할만 할 뿐이다. 그리고 아무것도 반환하지 않는다. 그렇기 때문에 outer에서 정의한 level = 50은 메모리상에 계속 남아있게 되고 그 것을 사용하고 있는 inner함수가 실행될 때마다 값이 추가되는 것이다.

f2를 만든다면? outer함수가 실행될 때 변수 level은 다른 메모리 주소에 쓰여져 다시 처음의 값 50을 가리킬 것이다.

Comments