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&'

댓글 없음:

댓글 쓰기

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

'일론 머스크' '젠슨 황' AI 리더들, 그들의 성공 비결은 바로 이것 - 누가 부자가 되는가 영상입니다. ㅎㅎ

  책을 통해서만 접했던 내용들을 영상으로 보니 더 실감이 납니다. KBS에서 방송된 내용인데 주말에 보시면 좋은 영상입니다. 엔비디아의 주가가 이해가 됩니다. ㅋㅋ 생각보다 미국시장이 강한 것이 AI는 거의 미국과 중국이 주도하는 시장이 되고 있습...