2014년 10월 7일 화요일

파이썬 기초 강좌 - 함수에 대해 살펴봅니다.

함수는 우리가 직접 만들 수 있고, 이미 파이썬에 내장되어 있는 것도 있습니다.
함수 선언은 def로 시작해서 콜론(:)으로 끝내고, 함수의 시작과 끝은 코드의 들여쓰기로 구분합니다.
시작과 끝을 명시하지 않습니다.
함수 선언을 헤더 파일에 미리 선언하거나, 인터페이스와 구현으로 나누지 않고 필요할 때 바로 선언하고 사용할 수 있습니다.

함수의 정의: 함수도 객체처럼 메모리상에 생성됩니다.
def <함수명>(인자1, 인자2, …인자N):
    <구문>
    return <반환값>

간단한 예제 입니다.
>>> def Times(a, b):
 return a*b
>>> Times
<function Times at 0x0210AB30>
>>> Times(10, 10)
100

return - 함수에서 return은 함수를 종료하고 해당 함수를 호출한 곳으로 되돌아가게 합니다.
>>> def setValue(newValue):
 x = newValue
>>> retval = setValue(10)
>>> print(retval)
None
>>> def swap(x, y):
 return y, x
>>> swap(1,2)
(2, 1)
>>> a, b = swap(1,2) ==> 튜플로 리턴된다.
>>> a
2
>>> b
1

좀 더 복잡한 데모입니다.
>>> def intersect(prelist, postlist):
 retList = []
 for x in prelist:
  if x in postlist and x not in retList:
   retList.append(x)
 return retList
>>> list1 = "SPAM"
>>> list2 = "EGG"
>>> intersect(list1, list2)
[]
>>> intersect(list1, ['H', 'A', 'M'])
['A', 'M']
>>> tup1 = ('B', 'E', 'E', 'F')
>>> intersect(list2, tup1)
['E']

인자 전달
파이썬에서 인자는 레퍼런스를 이용해 전달합니다.
하지만 C/C++의 Call By Reference와는 다릅니다.
변경 가능한 변수 와 변경 불가능한 변수 일 때 처리 방식이 다릅니다.

>>> a = 10
>>> b = 20
>>> def sum1(x, y):
 return x+y
>>> sum1(a, b)
30
>>> x= 10
>>> def sum2(x, y):
 x = 1
 return x + y
>>> sum2(x, b)
21
>>> x
10

정수형 변수는 변경 불가능한 변수이지만, 변경 가능한 변수는
내부 동작 방식이 약간 다릅니다.
>>> def change(x):
 x[0] = 'H'
>>> wordlist = ['J', 'A', 'M']
>>> change(wordlist)
>>> wordlist
['H', 'A', 'M'] è 변경 된다.!
>>>
>>> def change(x):
 x = x[:]
 x[0] = 'H'
 return None
>>> wordlist = ['J', 'A', 'M']
>>> change(wordlist)
>>> wordlist
['J', 'A', 'M'] è 복사해서 사용하면 변경 안됨!


스코핑 룰: 이름공간은 프로그램에서 쓰이는 이름이 저장되는
공간. 이름을 검색하는 규칙은 LGB(지역-Local, 전역-Global,
내장-Built-in)이라고 합니다. 찾는 순서도 LGB입니다.
>>> a = [1, 2, 3]
>>> def scoping():
 a = [4, 5, 6]
위와 같은 경우 [1,2,3]이라는 값을 가지는 리스트 타입의 객체가 메모리 공간에 생기고 이를 a라는 이름을 가지는 레퍼런스가 생깁니다. 함수는 별도의 이름공간을 가집니다. 함수 내부에서 사용되는 변수는 일단 함수 내부의 이름공간을 참조합니다.
>>> x = 1
>>> def func(a):
 return a + x
>>> func(1) ==> 이 경우는 함수 내부에 없기 때문에 외부에 있는 x를 사용
2
>>> def func2(a):
 x = 2
 return a + x
>>> func2(1)
3

지역 영역에서 전역 영역의 변수를 사용하고 싶을 때는
아래와 같이 합니다.
>>> g = 1
>>> def testScope(a):
 global g
 g = 2
 return g + a
>>> testScope(1)
3
>>> g
2

아래와 같이 g를 지우면 어떤 일이 벌어질까? 바로 에러 발생합니다. 하지만 다시 g를 선언하면 됩니다.
>>> del g
>>> def testGlobal(a):
 global g
 return g + a
>>> testGlobal(1)
Traceback (most recent call last):
  File "<pyshell#249>", line 1, in <module>
    testGlobal(1)
  File "<pyshell#248>", line 3, in testGlobal
    return g + a
NameError: global name 'g' is not defined
>>> g = 2
>>> testGlobal(1)
3

함수의 인자: 기본값을 전달하는 경우입니다.
>>> 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 union2(*ar):
 res = []
 for item in ar:
  for x in item:
   if not x in res:
    res.append(x)
 return res
>>> union2("HAM", "EGG", "SPAM")
['H', 'A', 'M', 'E', 'G', 'S', 'P']
>>> union2("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&'

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

Xcode 26의 새로운 기능들

 애플의 AI준비에 대한 골든타임이 지나가고 있다는 말이 많이 들립니다. ㅎㅎ  애플의 그동안의 패쇄적인 환경을 생각하면 온디바이스AI나 LLM환경에서 다소 아쉬운 부분이 많이 있습니다. 다른 빅테크들과 전혀 다른 방향의 목소리를 내고 있어서 좀 우려...