11
Chapter 3 h \lt| 8 h(function)@ D X0 \ |(X 8¥tD @ t. h| XL tü 8¥ t| \. l Lh| \ t<\ 8(call)” . 3.1 h 8 tl h 8(function call)X | X: >>> type(42) <class 'int'> hXt@ typet. 8 HX \@ hX x(argument)| . t hX ü \ xX X| L$. T h x| D(take)” ü| 4(return)”\ \. l hX ü| 4 (return value)t| x. Python@ ·/ D \ X x X\ XX hD ı\. int h ·/ t D \ X <t XX l »X D \. >>> int('32') 32 >>> int('Hello') ValueError: invalid literal for int(): Hello int h +| \ X ,D X J. D | 0 \. >>> int(3.99999) 3 >>> int(-2.3) -2 float h @ 8D +\ X\. >>> float(32) 32.0 >>> float('3.14159') 3.14159

Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

Chapter 3

함수

프로그래밍이라는 문맥에서 함수(function)은 연산을 수행하기 위한 일련의 문장들에 이름을붙여 놓은 것이다. 함수를 정의할 때는 이름과 문장들 지정해야 한다. 그 다음에 함수를 지정한이름으로 “호출(call)”할수있다 .

3.1 함수호출

우리는이미함수호출(function call)의예를보았다:>>> type(42)<class 'int'>

함수의이름은 type이다.괄호안의표현은함수의인자(argument)라고불린다.이함수의결과로인자의분류를알려준다.

흔히함수가인자를 “받아서(take)”결과를 “리턴(return)”한다고말한다.그리고함수의결과를리턴값(return value)이라고부른다.

Python은 어떤 값을 한 분류에서 다른 분류로 변환하는 함수들을 제공한다. int 함수는 어떤값이든받아서정수로변환할수있으면변환하고그렇지못하는경우는불평을한다.>>> int('32')32>>> int('Hello')ValueError: invalid literal for int(): Hello

int 함수는 부동 소수점 숫자를 정수로 변환할 수 있지만 반올림을 하지 않는다. 소수점 부분을잘라버리기만한다.>>> int(3.99999)3>>> int(-2.3)-2

float함수는정수와문자열을부동소수점숫자로변환한다.>>> float(32)32.0>>> float('3.14159')3.14159

Page 2: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

18 Chapter 3. 함수

마지막으로 str함수는인자를문자열로변환한다.

>>> str(32)'32'>>> str(3.14159)'3.14159'

3.2 수학함수

Python은 대부분의 익숙한 수학 함수들을 포함하는 수학 모듈을 갖고 있다. 모듈(module)은관련된함수들을모아놓은파일이다.

모듈에포함된함수를사용하기전에 import문으로읽어들여야한다.

>>> import math

이 문장은 math라고 불리는 모듈 객체(module object)를 생성한다. 모듈 객체를 표시하도록하면객체에관한정볼르얻을수있다.

>>> math<module 'math' (built-in)>

모듈객체는모듈에정의된함수들과변수들을포함하고있다.모듈에포함된함수를사용하고싶으면모듈과사용하기원하는함수의이름을구두점(닷, dot)으로구분하여지정해야한다.이와같은형식을닷표기법(dot notation)이라고부른다.

>>> ratio = signal_power / noise_power>>> decibels = 10 * math.log10(ratio)

>>> radians = 0.7>>> height = math.sin(radians)

첫예제에서는 math.log10을사용하여 signal_power와 noise_power의변수가정의되어있다고 가정했을 때의 신호대잡음비를 데시벨로 변환한다. 수학 모듈은 밑 수를 e로 하는 log도제공한다.

두 번째 예제에서는 radians 변수에 대한 사인 값을 계산한다. sin, cos 그리고 tan와 같은삼각함수와 관련된 함수들의 인자 값은 이 예제에서 사용한 변수 명처럼 라디안을 쓴다. 도를라디안으로변환하려면 180으로나누고 π로곱하면된다.

>>> degrees = 45>>> radians = degrees / 180.0 * math.pi>>> math.sin(radians)0.707106781187

math.pi라고쓰면 pi변수를수학모듈에서가져온다.이값은소수점 15자리까지정확한근사값이다.

삼각함수식에따라 45도의사인값은 2분의루트 2이기때문에예제의결과가맞는지비교해볼수있다.

>>> math.sqrt(2) / 2.00.707106781187

Page 3: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

3.3. 구성 19

3.3 구성

지금까지 변수와 수식 그리고 문장이라는 프로그램의 요소들을 독립적으로만 다루었기 때문에

구성요소들을화합하여쓰는것에대해서는다루지않았다.

프로그래밍언어의가장유익한기능중하나는작은단위의필요한부분들을모아서구성(com-pose)할수있다는것이다.예를들면,함수의인자로산술연산자들을포함하는어떤수식이라도다받을수있다.

x = math.sin(degrees / 360.0 * 2 * math.pi)

함수호출도할수있다.

x = math.exp(math.log(x+1))

거의모든곳에값을넣을수있으며임의의수식을쓸수있다.단,한가지예외가있다.할당문의왼쪽에는변수의이름이있어야한다.왼쪽에다른어떤수식이라도오면문법오류가발생한다(이것에대한예외상황을이후에살펴보자).

>>> minutes = hours * 60 # 맞음>>> hours * 60 = minutes # 틀림!SyntaxError: can't assign to operator

3.4 새로운함수의추가

지금까지는 Python이제공하는함수들만사용했었는데,새로운함수도추가할수있다.함수정의(function definition)로새로운함수에이름을부여하고그함수를호출했을때실행될일련의문장들을지정할수있다.

여기그예가있다.

def print_lyrics():print("I'm a lumberjack, and I'm okay.")print("I sleep all night and I work all day.")

def라는 키워드가 함수 정의를 표시한다. 이 함수의 이름은 print_lyrics이다. 함수 이름에대한규칙은변수명에대한규칙과똑같다.글자와숫자그리고밑줄표시는사용가능하지만숫자가첫글자로오면안된다.키워드로예약되어있는단어들은함수명으로쓸수없으며변수와함수를동일한이름으로짓는것은피해야한다.

함수명다음에빈괄호를사용한것은이함수가아무런인자도사용하지않는다는것을뜻한다.

함수정의의첫줄을헤더(header)라고부르고그나머지부분을내용(바디, body)라고부른다.헤더의끝은콜론이고내용은들여쓰기를해야한다.관례적으로항상 4개의공백으로들여쓰기를한다.내용에는몇개의문장이든포함될수있다.

print문에문자열은큰따옴표로싸여있다.작은따옴표나큰따옴표나동일하다.대부분의사람들은작은따옴표를사용하지만,예외적으로작은따옴표(아포스트로피또는생략기호)가문자열중에포함된경우에만큰따옴표를사용한다.

모든인용부호(작은따옴표와큰따옴표)는대체적으로키보드의엔터키옆에있는 “반듯한인용부호”를사용해야한다.이문장에서쓰고있는 “휘어진인용부호”는 Python에서쓸수없다.

대화식 모드에서 함수 정의를 입력하면 인터프리터는 함수의 내용 부분에 점(...)을 표시하여정의가끝나지않았다는것을표시한다.

Page 4: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

20 Chapter 3. 함수

>>> def print_lyrics():... print("I'm a lumberjack, and I'm okay.")... print("I sleep all night and I work all day.")...

함수의정의를끝내려면빈줄을입력하면된다.이렇게정의된함수객체는 function으로분류된다.

>>> print(print_lyrics)<function print_lyrics at 0xb7e99e9c>>>> type(print_lyrics)<class 'function'>

새로운함수를호출하는문법은내장된함수들을호출하는방식과똑같다.

>>> print_lyrics()I'm a lumberjack, and I'm okay.I sleep all night and I work all day.

이렇게정의된함수는다른함수내에서사용될수있다.예를들어방금출력한후렴구를반복적으로호출하도록 repeat_lyrics라는함수를작성해보자

def repeat_lyrics():print_lyrics()print_lyrics()

그리고 repeat_lyrics을호출해보자.

>>> repeat_lyrics()I'm a lumberjack, and I'm okay.I sleep all night and I work all day.I'm a lumberjack, and I'm okay.I sleep all night and I work all day.

실제노래가이렇게흘러가지는않는다.

3.5 정의와활용

이전절에서사용한코드를다시가져와보자.전체코드는다음과같다.

def print_lyrics():print("I'm a lumberjack, and I'm okay.")print("I sleep all night and I work all day.")

def repeat_lyrics():print_lyrics()print_lyrics()

repeat_lyrics()

이프로그램은 print_lyrics와 repeat_lyrics라는두개의함수를정의하고있다.함수정의는다른문장처럼실행되지만,실행의결과로함수객체만생성이된다.실제함수정의의내용은그함수가호출되기전까지는실행되지않으며함수정의자체는어떠한결과도출력하지않는다.

예상한 것처럼, 함수를 생성한 후에야 함수를 실행할 수 있다. 다시 말하면, 함수가 호출되기 이전에함수가정의되어야한다.

Page 5: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

3.6. 실행의흐름 21

연습을해보자.두번쨰함수의마지막줄을이프로그램의가장처음으로옮겨보자.프로그램을실행해서함수정의보다먼저함수호출문장이나타나면어떤오류메시지를출력하는지보자.

함수호출문장을원상복귀한후,이번에는 repeat_lyrics다음에 print_lyrics를배치해보자.이상태로프로그램을실행시키면어떻게되나?

3.6 실행의흐름

함수를정의한후에사용되도록만들려면어떤순서로문장들이실행되는지를알아야한다.이를실행의흐름(flow of execution)이라고부른다.

실행의순서는언제프로그램의첫문장부터시작된다.가장위에서부터밑까지문장은한번에하나씩실행된다.

함수정의는프로그램의실행의흐름을변경시키지않지만함수정의내의문장들은해당함수가

호출되기이전에는실행되지않는다는것을기억해야한다.

함수호출은실행흐름의우회로와같다.다음문장을실행시키는대신함수의내용으로이동하여그안의문장들을실행시킨후이전에멈췄던부분부터실행한다.

매우 간단하게 들리겠지만, 함수가 또 다른 함수를 호출 할 수 있다는 것을 되새겨 보면 그렇지않다는것을깨달을것이다.함수의중간에서다른함수의문장들을호출할수있다.그러는중에또다른함수를호출할수도있다!

다행스러운 것은, Python은 현재 실행 중이던 위치를 파악하는 것에 능숙하다. 함수의 실행이완료되면호출했던함수에서마지막실행중이던위치를찾아계속진행할수있다.마침내프로그램의끝에도달하면종료한다.

정리하면,프로그램을읽을때에는프로그램의처음부터한줄씩읽으려할필요가없다.오히려실행의흐름을따르는것이이해하기더쉬울수있다.

3.7 매개변수와인자값

어떤 함수들은 인자를 사용한다는 것을 보았다. 예를 들어 math.sin을 쓸 때 숫자를 인자로 입력했었다. 어떤 함수는 하나 이상의 인자를 받기도 한다. math.pow는 밑수와 지수라는 두 개의인자를받는다.

함수내에서는전달받은인자를매개변수(파라미터, parameter)라는변수로할당된다.인자를받는어떤함수의정의를살펴보자.

def print_twice(bruce):print(bruce)print(bruce)

이함수는전달받은인자를 bruce라는매개변수로할당한다.함수가호출되면그매개변수가무엇이든간에두번출력하고있다.

다음의함수는출력가능한모든값에쓸수있다.

>>> print_twice('Spam')SpamSpam>>> print_twice(42)

Page 6: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

22 Chapter 3. 함수

4242>>> print_twice(math.pi)3.141592653593.14159265359

내장된함수들에적용되었던구성에관한규칙들은프로그래머가정의한함수들에도똑같이적

용된다.그러므로, print_twice의인자값으로어떤수식이라도쓸수있다.

>>> print_twice('Spam '*4)Spam Spam Spam SpamSpam Spam Spam Spam>>> print_twice(math.cos(math.pi))-1.0-1.0

함수가 호출되기 전에 인자 값을 계산한다. 예에서 사용한 'Spam'*4와 math.cos(math.pi)라는수식은한번씩계산된다.

변수역시도인자로사용할수있다.

>>> michael = 'Eric, the half a bee.'>>> print_twice(michael)Eric, the half a bee.Eric, the half a bee.

인자로전달한 (michael)이라는병수명은함수를정의할때사용한매개변수(bruce)와는아무런 관계가 없다. 호출되기 전 코드(호출자, caller) 어떤 값이었든 상관없다. print_twice 함수내에서는 bruce라부른다.

3.8 변수와매개변수의지역성

함수 내에서 변수를 생성하면 지역 또는 로컬(local) 변수라고 부른다. 함수 내에서만 존재하기때문이다.예를들어보자.

def cat_twice(part1, part2):cat = part1 + part2print_twice(cat)

이함수는두개의인자를받아서연결하고,그결과를두번출력한다.이함수정의를쓰는예를살펴보자.

>>> line1 = 'Bing tiddle '>>> line2 = 'tiddle bang.'>>> cat_twice(line1, line2)Bing tiddle tiddle bang.Bing tiddle tiddle bang.

cat_twice가종료하면함수내에서사용되었던변수 cat은없어진다.출력해보려고하면예외처리된다.

>>> print(cat)NameError: name 'cat' is not defined

매개변수도지역에서만정의된다.예를들어 print_twice밖에서는 bruce라는것은존재하지않는다.

Page 7: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

3.9. 스택상태도 23

line1

line2 ’tiddle bang.’

part1

part2

cat

bruce

’Bing tiddle ’

’Bing tiddle ’

’tiddle bang.’

’Bing tiddle tiddle bang.’

’Bing tiddle tiddle bang.’

cat_twice

print_twice

__main__

Figure 3.1:스택상태도.

3.9 스택상태도

각변수의사용범위파악에스택상태도(stack diagram)을그려보는것이도움이된다.상태도와유사하게스택상태도는각변수의값을나타낸다.추가적으로각변수가어떤함수에포함되는지도나타낸다.

각 함수는 프레임(frame)이라는 단위로 구분된다. 여기서 프레임은 하나의 상자로 함수의 이름이 곁에 적혀 있고 상자 내부에는 변수와 매개 변수가 적혀 있다. 앞서 본 예제의 스택 상태도는그림 3.1에나타나있다.

어떤 함수가 어떤 함수를 호출 했는지를 알아 볼 수 있도록 프레임들이 스택에 정리되어 있다.이 예제에서는 print_twice 함수는 cat_twice 함수에 의해 호출되었으며 cat_twice 함수는__main__에의해호출이되었다. __main__라는함수는최상위프레임에게부여하는특별한이름이다.함수밖에서생성된변수는 __main__함수에속해있다.

각매개변수는해당인자가갖고있는값과똑같은값을갖고있다.그렇기때문에 part1가같고있는값은 line1이갖고있는값고똑같으며, part2가같고있는값은 line2와동일하다.그리고,bruce는 cat과똑같다.

함수호출중에오류가발생하면 Python은함수의이름과호출을시도한함수명을출력한다.그리고 다시 그 함수를 호출한 상위 프레임의 함수명을 출력한다. 이 과정을 __main__에 도달 할때까지반복한다.

예를들어, print_twice내에서 cat를접근하려고시도한다면 NameError이라는오류메시지를받을것이다.

Traceback (innermost last):File "test.py", line 13, in __main__

cat_twice(line1, line2)File "test.py", line 5, in cat_twice

print_twice(cat)File "test.py", line 9, in print_twice

print(cat)NameError: name 'cat' is not defined

이런 식으로 함수의 리스트를 보여주는 것을 추적(트레이스백, traceback)이라고 부른다. 오류가 발생했을 때 어떤 프로그램 파일에서 오류가 발생했는지 그리고 실행 중이던 함수와 오류를

일으킨줄번호에대한정보를보여준다.그리고오류를일으킨코드도보여준다.

트레이스백의함수의순서는스택상태도에서나타난프레임의순서와똑같다.현재실행중이던함수가가장아래에표시된다.

Page 8: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

24 Chapter 3. 함수

3.10 열매가있는함수들과비어있는함수

수학 함수들과 같은 우리가 사용해본 함수들은 결과를 리턴한다. 이런 종류의 함수를 구분하는좋은 이름이 따로 없어서 열매가 있는 함수(fruitful function)이라고 부른다. print_twice와같은류의다른함수들은어떤동작을하지만결과값을리턴하지는않는다.이런류는비어있는함수(void function)라고부른다.

열매가있는함수를호출하면거의모든경우에리턴받은결과를활용하기를원한다.예를들어,그결과에변수를할당하거나수식의일부로사용하기도한다.x = math.cos(radians)golden = (math.sqrt(5) + 1) / 2대화식모드에서함수를호출할때 Python은결과를표시한다.>>> math.sqrt(5)2.2360679774997898스크립트로 실행했을 때, 열매가 있는 함수를 그 자체로만 호출하면 리턴 받은 결과는 영원히잃어버리고만다!math.sqrt(5)이 스크립트는 루트 5를 계산하지만 결과를 저장하지도 표시하지도 않기 때문에 그렇게 유용하지는않다.

비어 있는 함수는 화면에 무언가를 표시하거나 다른 어떤 영향이 있는 것처럼 보이지만 리턴할

결과 값이 없다. 만약 결과 값을 변수에 할당하려고 시도한다면 None이라는 특수한 값을 돌려받는다.>>> result = print_twice('Bing')BingBing>>> print(result)NoneNone이라는값은 'None'이라는문자열과같은것이아니다.그자체가특수한값을같은또다른분류이다.>>> type(None)<class 'NoneType'>지금까지우리가작성한모든함수들은모두비어있는함수들이었다.이제앞으로다룰장들에서열매가있는함수들을작성하기시작할것이다.

3.11 왜함수인가?프로그램의내용을왜함수들로나눠야하는지에대한이유가아직은명확하지않을것이다.그럴만한이유는많이있다.

• 새로운함수를생성하면문장들의묶음에이름을지어줄수있다.그러면프로그램을읽거나디버깅하기가쉬워진다.

• 함수들을 활용하면 반복적인 코드들을 제거할 수 있기 때문에 프로그램의 길이가 짧아진다.나중에반복되는코드를수정을할일이생긴다면한곳에서만수정을하면된다.

• 긴프로그램을함수들로나누어놓으면한번에한부분씩디버깅을할수있으며,디버깅이완료되면제대로동작하는전체로다시모을수있다.

• 잘 설계된 함수들은 여러 프로그램들에 유용하게 사용될 수 있다. 하나를 잘 작성해 놓고디버깅을해놓으면다른곳에서도그부분을재활용할수있다.

Page 9: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

3.12. 디버깅 25

3.12 디버깅

가장중요한기술중에하나인디버깅기술을가져야한다.좌절스럽게만들때도있지만디버깅은지적으로풍부하고도전적고또한프로그래밍을흥미롭게만드는것이기도하다.

디버깅은 어떤 면에서 탐정이 수사를 펼치는 것과 같다. 현재 발생한 결과를 이끌어 낸 과정과사건들을유추할있는여러단서들과만나게된다.

디버깅은실험에기반한과학과도같다.무엇인잘못된것같단아이디어가떠오르면프로그램을 수정해보고 다시 시도 해 보면 된다. 가정이 옳다면 수정에 대한 결과를 예측해 볼 수 있게되고동작하는프로그램으로한걸음더가까이다가갈수있게된다.만약가정이틀렸다면다른방법을시도해봐야한다.셜록홈즈가말하듯이 “불가능한것들을하나씩제거한뒤에남은것이아무리불가능해보일지라도그게사실일것이다.”(A.코난도일, 4개의서명)

어떤이들에게는프로그래밍과디버깅은똑같은것이다.그들에게프로그래밍이라는것은원하는동작을할때까지프로그램을조금씩디버깅해나가는것이다.동작가능한프로그램을먼저작성한후에조금씩변형을만들어내고디버깅하는것이기본접근방식이다.

예를 들어, 리눅스라는 운영체제는 지금은 수 백만 줄의 코드로 이루어져있지만, 최초에는 리누스 토발즈가 인텔 80386 CPU를 사용하는 간단한 프로그램으로 시작되었다. 래리 그린필드에의하면 “리누스의 초기 프로젝트 중에 하나는 AAAA를 BBBB로 변환하는 프로그램을 만드는것이었다. 이게 나중에는 발전하여 리눅스가 되었다.” (The Linux Users’ Guide(리눅스 사용자가이드)베타 1판).

3.13 용어해설

(function): 이름이있는일련의문장들로유용한작업을수행한다.함수는인자를받을수도안받을수도있으며실행하였을때결과돌려줄수도있고그렇지않을수도있음

함수정의(function definition): 새로운함수를생성하는문장으로함수의이름과매개변수들을지정하고그리고문장들을포함함

함수객체(function object): 함수정의에의해생성되는값.함수의이름이함수객체를가리키는변수임

헤더(header): 함수정의의첫줄

내용(바디, body): 함수정의내의일련의문장들

매개변수(parameter): 함수내에서인자로전달된값을가리키는이름

함수호출(function call): 함수를 실행시키는 문장. 함수의 이름과 괄호로 싸여있는 인자들의목록으로구성되어있음

인자(argument): 함수가 호출되었을 때 함수에 제공되는 값. 이 값은 해당 함수에 매개 변수에할당됨

지역변수(local variable): 함수내에서정의된변수.지역변수는정의된함수내에서만사용될수있음

리턴값(return value): 함수의결과.함수호출이수식의일부로사용되었다면리턴값은수식이사용하는값이됨

열매가있는함수(fruitful function): 결과를리턴하는함수

Page 10: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

26 Chapter 3. 함수

비어있는함수(void function): None을리턴하는함수

None: 비어있는함수가리턴하는특수한값

모듈(module): A file that contains a collection of related functions and other definitions.

읽어들이기문장(import statement): 모듈파일을읽어서모듈객체를생성하는문장

모듈객체(module object): import문으로생성되는값으로모듈에서정의한값들을사용할수있도록함

닷표기법(dot notation): 다른모듈의함수를호출하는문법으로모듈의이름과함수의이름을점(닷,구두점)으로연결하는표기법

구성(composition): 더 큰 수식의 일부로 수식을 쓰거나 더 큰 문장의 일부로 문장을 작성하는것

실행의흐름(flow of execution): 문장들의실행순서

스택상태도(stack diagram): 함수가 사용하고 있는 스택의 상태를 그림으로 표기하는 방법으로변수와각변수가가리키는값을나타나냄

프레임(frame): 스택상태도의상자로함수호출을나타냄.상자는지역변수와함수의매개변수를포함함.

트레이스백(추적, traceback): 실행중인함수들의목록으로예외가발생할때출력이됨

3.14 연습문제

문제 3.1. right_justify(오른쪽정렬이라는의미)라는이름과문자열 s를매개변수로사용하는함수를작성하여라.문자열앞에충분한공백을두어서문자열의마지막글자가 70번째열에보이도록하라.

>>> right_justify('monty')monty

힌트: 문자열 연결과 반복을 사용하라. Python은 len이라는 내장 함수를 갖고 있다. 이 함수는문자열의길이를리턴한다. len('monty')의값은 5이다.문제 3.2. 함수 객체는 값이기 때문에 변수에 할당할 수도 있고 인자로 전달할 수도 있다. 예를들어, do_twice는함수객체를인자로전달받아두번호출하는함수이다.

def do_twice(f):f()f()

다음예제는 do_twice를사용하여 print_spam라는함수를두번호출한다.

def print_spam():print('spam')

do_twice(print_spam)

1. 이예제를스크립트로작성하여제대로동작하는지확인해보라

2. do_twice를 두 개의 인자를 받도록 수정하여라. 함수 객체와 값을 전달받아 해당 함수는두번호출하고값은인자로전달하도록만들라.

Page 11: Chapter 3open.gnu.ac.kr › lecslides › 2017-2-introProg › book › TP2_Ch03.pdf · 2017-08-28 · 22 Chapter 3. h˘ 42 42 >>> print_twice(math.pi) 3.14159265359 3.14159265359

3.14. 연습문제 27

3. 이장의처음에다뤘던 print_twice함수의정의를복사하여스크립트에포함시켜라

4. 수정한 do_twice함수를사용하여 print_twice를두번호출하여라.이때, print_twice함수의인자는 'spam'을사용하여라.

5. 함수객체와값을전달받아해당함수를 4번호출하고값은매개변수로사용하는 do_four라는새로운함수를정의하여라.이함수의내용에는네개가아니라두개의문장만있어야한다.

해답: http: // thinkpython2. com/ code/ do_ four. py .문제 3.3. 메모: 이 연습 문제는 지금까지 우리가 배운 문장들과 기능들만을 사용하여 해결해야한다.

1. 아래와같은격자무늬를만드는함수를작성하라:

+ - - - - + - - - - +| | || | || | || | |+ - - - - + - - - - +| | || | || | || | |+ - - - - + - - - - +

힌트:한줄에하나이상의값을출력하려면값을쉼표로구분지으면된다.

print('+', '-')

기본적으로 print는출력이끝나면다음줄로넘어간다.이같은동작을수정하려면다음과같은방법으로동작을변경할수있다.

print('+', end=' ')print('-')

이문장들의결과는 '+ -'이다.

print문에인자가없다면현재출력중이던줄을종료하고다음줄로넘어간다.

2. 네개의행과열이있는격자무늬를그리는함수를작성하여라.

해답: http: // thinkpython2. com/ code/ grid. py .

출처: 이 예제는 스티브 오우알린의 (Practical C Programming, 3판, 오라일리 출판사, 1997),연습문제를기초로하였다.