본문 바로가기
  • 10.0
파이썬

[파이썬 기초] LEGB 규칙, 함수 호출과정, 인수언패킹

by 10.0 2024. 2. 26.
반응형

[파이썬 기초] LEGB 규칙, 함수 호출과정, 인수언패킹

 

 이전 [파이썬 기초] 상식▼

더보기
목차

[파이썬 기초]
1. LEGB 규칙 및 기타주제들
2. 아규먼트와 파라미터
3. 인수 언패킹

 


LEGB 규칙

LEGB 규칙

파이썬에서 변수에 값을 바인딩하거나 변수의 값을 참조할때 LEGB규칙을 따른다.

Scope 설명
Local Local의 약자로 함수 안을 의미한다
Enclosing Enclosend function locals의 약자로 내부함수에서 자신의 외부 함수의 범위를 의미한다.
Global Global의 약자로 함수 바깥쪽을 의미한다.
Built-in Built-in의 약자로 open, range와 같은 파이썬 내장 함수를 의미한다.

 

변수를 참조하는 경우

 L => E => G => B 순으로 참조할 변수를 탐색한다.

a = 1	#Global

def test():
	a = 2	#Local
    print(a)

test()

 

위의 코드의 경우 함수안의 로컬이 제일 우선시 되기 때문에 a는 2로 출력이 된다.\

더 자세한 이유를 설명하자면 변수바인딩에 대해 알아야 한다.

 

 

변수바인딩

함수 내에서 생성된 변수는 함수가 종료되면 소멸된다.

함수 내에서 생성된 변수를 local variable이라고 부른다.

a = 1	#Global

def test():
	a = 2	#Local
    print(a)

test()

함수 내에서 global 영역의 변수 값을 수정하려면  global이라는 키워드를 사용해야 한다.

 

함수와 리스트

함수의 인자로 리스트가 전달되는 경우를 설명해보겠다.

data = [1,2,3]

def plus10(data_list):
	data_list[0] = data_list[0] + 10
    
plus10(data)
print(data)

 

1. data라는 리스트가 메모리에 저장된다. 

그 리스트 안에는 1, 2, 3 숫자가 저장되어 있으며 순서대로 0번, 1번, 2번이라는 인덱싱 값을 가지고있다.

 

2. 정의된 함수 plus10은 말그대로 data_list라는 변수에 들어오게될 값에 10을 더해주는 함수다.

입력되는 인자값인 data_list의 0번째값에 10을 더하고 그것을 새로 메모리에 덮어씌운다.

 

3. plus10함수를 기존 메모리에 있던 data리스트를 인자값으로 받았을 경우

0번 인덱싱되어있는 숫자 값 1에 10이 더해지게된다.

 

결과적으로 data값의 0번째 있던 숫자 1은 11로 변경되고 그 data리스트를 출력하게 되면

 

[11, 2, 3]이라는 값이 나오게 된다.

 


아규먼트 (Argument)와 파라미터 (Parameter)

 

아규먼트 (Argument) _인자

함수를 호출할 때 전달하는 값을 말한다.

 

파라미터 (Parameter) _ 매개변수

함수를 정의할 때 사용한 변수의 이름을 말한다.

def 함수이름(매개변수):
	코드
    
    
함수이름(인자)

 

Tip. 아규먼트의 키워드

  • 아규먼트를 입력할 때 파라미터 이름을 명시적으로 지정할 수 있다.
  •  파라미터 이름을 지정하면 가독성이 높아진다.

 

참고하면 좋은 글

[파이썬 기초] 함수(function) / 함수 만들기(함수 정의)

 

[파이썬 기초] 함수(function) / 함수 만들기(함수 정의)

▼ 이전 [파이썬 기초] 상식▼ 더보기 [파이썬 기초] 이것부터 알고가자, 데이터 타입과 타입의 변환 / 화면 출력 함수 print/ 변수(Variable)와 변수 이름 규칙 [파이썬 기초] 문자열 인덱싱과 슬라이

10dot0.tistory.com

 

함수 기본값

함수 호출 시 값을 전달하지 않으면 함수가 실행되기 전에 그 인수에 기본 값이 할당된다.

def mysum(a=1,b=4):    # 매개 변수
	return a+b
    
    
# 인자를 입력했을때
print(mysum(1,2))    #3

# 인자를 입력하지 않았을 때
print(mysum())    #5

 

 

함수호출

아규먼트(인자)를 명시적으로 기술하게 되면 좋은점.

1. 여러 인자들이 있을 때 유용합니다.

2. 가독성이 좋습니다.

3. 순서에 상관없이 작동할 수 있습니다.

 

  • 기본 함수 호출
def mysum(a,b):   
	return a+b
    
    
print(mysum("por","favor"))

=> por favor
  • 아규먼트를 명시적으로 기술
def mysum(a,b):   
	return a+b
    
    
print(mysum(a = "por", b = "favor"))
mysum(a = "por", b = "favor")

 

함수 가변 인자 튜플로 만들기

함수를 정의할 때 어떤 개수의 인수라도 받아들일 수 있도록 설계할 때 사용한다.

함수를 정의할 때 *변수명(파라미터)을 사용하면 튜플 형태로 가변 인자 처리가 가능

def PR(*word)    # *변수명 사용하여 튜플형태로 가변인자처리
	print(word)
    
PR("la","le","hoal","gracias")    # 인자로 입력된 값이 튜플 형태로 만들어진다.

 

 

함수 가변 인자 딕셔너리로 만들기

함수를 정의할 때 어떤 개수의 인수라도 받아들일 수 있도록 설계할 때 사용한다.

함수를 정의할 때 **변수명을 사용하면 키워드 가변 인자 형태로 만든다. ( =  딕셔너리 형태)

def PR(**word)    # **변수명 사용하여 키워드 가변인자 형태로 처리 = 딕셔너리
	print(word)
    
PR(a="la", b = "le", c = "hoal", d = "gracias")    # 인자로 입력된 값이키워드 가변인자 형태로 처리됨.

{'a':"la" ,  'b' :"le", 'c' : "hoal", 'd' : "gracias" }

 


 

인수 언패킹 (Unpacking)

 

인수 언패킹 (Unpacking)

*튜플 언패킹

함수 호출 시 *를 붙이면 튜플을 개별 변수로 변환하게 됩니다.

포장했던 상자를 다시 풀어버린다는의미로 언패킹이라고 합니다.

 

아래와 같이 함수foo를 정의했다고 했을때 a,b,c,d라는 개별 인자 값이 아닌 튜플을 함수에 바로 입력하게되면

TypeError가 발생하게 됩니다.

def foo(a,b,c,d):
	pirnt(a,b,c,d)

data =  (1,2,3,4)
foo(data)    #TypeError

 

이러한 에러를 해결하기 위해서는 튜플언패킹을 통해 인자값을 하나하나 입력하지 않고 실행할 수 있습니다.

def foo(a,b,c,d):
	pirnt(a,b,c,d)

data =  (1,2,3,4)
foo(*data)

 

**딕셔너리 언패킹

함수 호출 시 **를 붙이면 딕셔너리를 개별 변수로 변환하게 됩니다.

튜플과 마찬가지로 함수 인자값으로 딕셔너리 그자체를 사용할 수 없을 때 TypeError가 발생하게 됩니다.

def foo(**kwargs):
	pirnt(kwargs)

data =  ('a':1, 'b':2,'c':3,'d':4)
foo(data)    #TypeError

딕셔너리 언패킹을 통해 개별인자를  하나하나 입력하지 않고 간단히 해결할 수 있습니다.

def foo(**kwargs):
	pirnt(kwargs)

data =  ('a':1, 'b':2,'c':3,'d':4)
foo(**data)

 

참고하면 좋은 글

[파이썬 기초] 자료구조 : 튜플과 딕셔너리 그리고 이차원데이터 /딕셔너리 중첩

 

[파이썬 기초] 자료구조 : 튜플과 딕셔너리 그리고 이차원데이터 /딕셔너리 중첩

▼ 이전 [파이썬 기초] 상식▼ 더보기 [파이썬 기초] 이것부터 알고가자, 데이터 타입과 타입의 변환 / 화면 출력 함수 print/ 변수(Variable)와 변수 이름 규칙 [파이썬 기초] 이것부터 알고가자, 데이

10dot0.tistory.com

 

반응형