본문 바로가기

컴퓨터프로그래밍

nested, scope

nested

-중첩, 일반적으로 2중 loop등을 지칭할 때 사용되는 용어.

-function 내부에서 function을 정의하는 것.

-lambda와 비슷하나(함수 내부에서 정의 가능함), lambda보다 복잡한 구현이 필요할 때 사용한다.

 

lambda

-anonymous(익명함수-이름이 없음)를 만드는데 사용됨.

:함수는 만들어야 하지만 def문으로 정의해서 사용하기에는 너무 간단한 경우 사용한다. 일반 함수와 달리 이름이 없음.

하나의 expression 사용(한 줄로 표현 가능)

return문을 따로 만들어 주지 않음.

IIFE(Immediately Invokded Function Expression)-reference를 사용하지 않고 일회성으로 사용, 다시 사용 불가, 해당 line에서만 사용할 간단한 처리를 구현하는 경우 사용되는 방식.

 

구문

lambda parameters: expression 

ex)

add=lambda x,y:print(x+y)
add(3,4)

 

map-iterator 반환
:list로 바꾸어주는 처리(list(reference이름))을 해야 제대로 item들을 출력해줌.

:각 요소에 동일한 연산을 적용하고자 할 때 수행함.(ex. list의 모든 값을 제곱하여 출력)

 

구문

map(function, iterable) 

 

iterable-반복가능한 객체. ex)list, tuple, dictionary 등.

ex)

num=[1,2,3,4]

k=list(map(lambda x: x**2, num))
print(k)

 

namespace

:variables와 object의 이름을 매핑하는데 사용. 변수와 함수, 클래스 등이 정의되고 사용될 수 있는 범위를 지칭. 같은 이름으로 발생하는 name collision을 방지함. 동일한 name(identifier)이라도 namespace가 다르면 충돌없이 사용가능.

:global, function, class, instance, method, module등이 있다.

 

ex)

x=10 #global variable

def foo():
    x=20 #local variable
    print(x)
   
foo() #출력값:20
print(x) #출력값:10

 

SCOPE(범위)

  • lexical scope(static scope)
    :variable이나 function등이 source code내에서 선언(혹은 정의)된 위치에 따라 scope(or namespace)가 결정되는 방식. 
  • dynamic scope
    :call(호출) 및 실행 등에 따라 scope이 만들어지며, perl과 bash등에서 사용됨.
  • global: 바탕-최상위 레벨에서 정의된 변수들의 범위. 이 변수들은 어느 곳에서든 접근할 수 있다. 함수 내부에서 사용할 시 variable shadowing이 일어나지 않게 'global'이라는 키워드 사용. 많이 사용되지 않도록 권함. 
  • local: 함수 내부에서 선언된 변수들의 범위
  • nonlocal: 중첩된 함수에서 사용됨. closure등에서 사용됨. 내부 함수에서 외부 함수의 변수에 접근해야할 때 사용.

*variable shadowing: global scope과 local scope에서 변수명이 겹치는 것.

ex)

g_x = 'global' #global scope

def g_func():
    # Local Scope, g_func의 function namespace로 g_func 의 관점에선 local이라고 불림.
    l_x = 'local of g_func'

    # Non-local Scope, nested_func의 관점에서는 nonlocal 키워드가 적용되는 Non-local scope임 (global과는 구분이 된다.).
    non_local_x = 'non-local'

    print('global_variable : ',g_x)
    print('local_variables of g_func :', l_x, non_local_x)
   
    def nested_func():
        # nested_func 의 관점에선 local임.
        l_x = 'local of nested func' #g_func의 l_x와는 다른 scope이므로 동일한 name을 사용해도 namecollision이 없다.
        l_y = 'y : local of nested func'
        print('global_variable : ',g_x)
        print('nonlocal of nested_func :', non_local_x)
        print('local_variables of nested_func :', l_x)
 
    nested_func()  
    print(l_y) #nameerror발생.l_y는 이 곳에서는 정의가 되지 않음. scope이 다름.
# 2개 다 호출만 하면 되므로 따로 main()함수를 만들어줄 필요가 없다.
g_func()
print(non_local_x)#nameerror발생. non_local_x는 이곳에서는 정의되지 않음. scope이 다름.

closure

-nested function으로, 자신의 enclosing scope(=python에서 nonlocal scope)의 상태값을 기억하고 유지, 변경, 사용할 수 있는 경우.

-외부 범위의 변수를 기억한다.

-lexical scope(static scope)을 기반으로 변수를 가져오기 때문에 함수가 정의된 후에도 함수 내부에서 사용되는 변수의 값을 변경하거나 참조할 수 있다.

  • closure가 되는 조건
    1.  nested function
    2. 해당 nested function내에서 nonlocal scope의 변수를 참조하여 사용.
    3. 해당 nested function에 대한 reference가 반환되어 이 후로 사용 가능해야 함.

-전역변수의 기능을 활용하면서도 아무나의 접근을 제한하면서, 각 closure 별로 고유의 상태를 유지할 수 있다.

closure를 한마디로 정리하자면, 외부 변수를 기억하고 함수 내에서 사용할 수 있게 하는 method.

 

stack frame(function context): function의 call과 return을 추적하는데 사용됨.

 

context: 보통 실행 context를 의미함. 코드 실행중에 변수, 함수 클래스 등을 평가 및 실행하는데 필요한 정보를 유지하고 관리하는 코드실행환경으로서 일종의 데이터 구조(흔히 stack)으로 구현됨.

 

namespace와 context의 차이

:namespace-변수와 객체의 이름을 매핑하는데 사용되는 시스템.

:context-코드가 실행되는 동안의 상태와 정보를 나타냄.

'컴퓨터프로그래밍' 카테고리의 다른 글

class  (0) 2024.05.20
paradigm  (0) 2024.05.20
예외 처리  (2) 2024.05.20
control structure  (0) 2024.05.20
expression, statement  (0) 2024.05.20