[Python기초] 10. 가변인자와 정의되지 않은 인자처리
변수의 이름을 어떻게 해석하나요?
스코핑 룰
- 파이썬에서 함수는 별도의 이름공간(namespace)을 가짐
- 이때 이름을 찾는 방법을 스코핑 룰이라고 함
- 변수를 사용하기 위해서는 반드시 알아야 할 규칙
Local(지역): 함수 내부 공간 -> Global(전역): 함수 외부 공간 -> Built-in(내장): 파이썬 자체에 정의된 공간
순으로 찾음- 첫 글자를 하나씩 따서 LGB라고도 하며, LGB순서로 이름을 검색
>>> x = 1 >>> def func(a): return a + x # 함수 내부에 x가 없기 때문에 전역 영역에서 찾아서 사용 >>> func(1) 2 >>> def func2(a): x = 2 # 함수 내부에 x라는 이름이 등록됨 return a + x >>> func2(1) 3 # x = 2 라고 지역변수로 값이 저장되어 있어서 내부의 값을 읽어 1을 입력받으면 1 + 2를 연산해서 3을 리턴
>>> g = 1 >>> def testScope(a): global g # 변수에 global 키워드를 지정해 전역 영역에 존재하는 변수의 값을 함수 내부에서 참조해서 사용 g = 2 # testScope() 함수 안에 global g라는 표기를 통해 전역변수 g를 내부에서 참조한다는 선언을 하면 불변형식이지만 읽기와 쓰기가 가능 return g + a >>> testScope(1) 3 >>> g 2 # testScope() 함수에 1을 넘기고 아래에서 g를 출력해 보면 1이 아닌 변경된 값 2가 출력되며, 전역 변수에 값을 쓰기를 했음을 알 수 있음
- 첫 글자를 하나씩 따서 LGB라고도 하며, LGB순서로 이름을 검색
기본인자
- 함수를 호출할 때, 인자를 지정해주지 않아도 기본값이 할당되는 방법
>>> def Times(a=10, b=20): return a*b >>> Times() # 전부 기본값을 사용 200 >>> Times(5) # a에 5를 전달하고, b는 기본값을 사용 100
키워드 인자
- 인자 이름으로 값을 전달하는 경우에는 순서를 맞추지 않아도 인다이름을 지정해서 전달 가능한 방법
>>> def connectURI(server, port): str = "http://" + server + ":" + port return str >>> connectURI("test.com", "8080") 'http://test.com:8080' >>> connectURI(port="8080", server="test.com") 'http://test.com:8080'
가변인자
- *를 함수 인자 앞에 붙이면 정해지지 않은 수의 인자를 받겠다는 의미
>>> def test(*args): print(type(args)) >>> test(1, 2) <type 'tuple'> >>> def union(*ar) res=[] for item in ar: for x in item: if not x in res: res.append(x) return res >>> union("HAM", "EGG", "SPAM") ['H', 'A', 'M', 'E', 'G', 'S', 'P'] >>> union('gir', 'generation', 'gee') ['g', 'i', 'r', 'e', 'n', 'a', 't', 'o']
정의되지 않은 인자 처리
- **를 붙이면 정의되지 않은 인자를 사전형식으로 받을 수 있음
>>> def userURIBuilder(server, port, **user): str = "http://" + server + ":" + port + "/?" for key in user.keys(): str += key + "=" + user[key] + "&" return str >>> userURIBuilder("test.com", "8080", id='userid', passwd='1234') 'http://test.com:8080/?passwd=1234&id=userid&' >>> userURIBuilder("test.com", "8080", id='userid', passwd='1234', name='mike', age='20') 'http://test.com:8080/?passwd=1234&age=20&id=userid&name=mike&'