Skip to content

Commit 382a768

Browse files
committed
Update functions.ipynb
1 parent ebf51e9 commit 382a768

File tree

1 file changed

+267
-10
lines changed

1 file changed

+267
-10
lines changed

functions.ipynb

Lines changed: 267 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6246,7 +6246,7 @@
62466246
"lambda 매개변수1, ..., 매개변수n : 표현식\n",
62476247
"```\n",
62486248
"\n",
6249-
"lambda(람다)는 그리스어 알파벳 λ(lambda)를 가리키며,\n",
6249+
"lambda(람다)는 그리스어 알파벳 λ를 가리키며,\n",
62506250
"람다를 이용한다는 이유로 \n",
62516251
"**람다 함수**<font size='2'>lambda function</font>라 부른다."
62526252
]
@@ -6343,7 +6343,7 @@
63436343
"\n",
63446344
"함수 또한 값이기에 변수 할당에 활용될 수 있다.\n",
63456345
"아래 코드는 앞서 정의한 람다 함수를 변수에 할당하여\n",
6346-
"정의된 변수를 함수 이름을 활용하여 일반적인 함수처럼 호출한다."
6346+
"람다 함수 정의대신 변수를 일반적인 함수 호출처럼 사용한다."
63476347
]
63486348
},
63496349
{
@@ -6370,20 +6370,134 @@
63706370
"source": [
63716371
":::{note} 일급 객체\n",
63726372
"\n",
6373-
"변수에 저장할 수 있고 함수의 인자로 활용될 수 이는 대상을 값이며,\n",
6374-
"파이썬에서 다루는 모든 대싱이 값이다.\n",
6373+
"변수에 저장할 수 있고, 따라서 함수의 인자로 사용할 수 있는 대상이 값이며, 파이썬에서 다루는 모든 대상이 값이다.\n",
63756374
"반면에 C 언어의 경우엔 함수를 변수에 할당하거나 다른 함수의 인자로 사용할 수 없고,\n",
6376-
"대신 포인터 변수라는 특별한 장치를 활용해서 함수를 할당하거나 다른 함수의 인자로 활용할 수 있다.\n",
6375+
"대신 포인터 변수라는 특별한 장치를 활용해서 함수를 변수에 할당하거나 다른 함수의 인자로 활용한다.\n",
63776376
"\n",
63786377
"이처럼 프로그래밍언어마다 값의 종류가 다른데,\n",
63796378
"변수 할당과 함수의 인자로 특별한 장치 없이 바로 사용할 수 있다는 점에서\n",
6380-
"값을 일급 객체, 영어로 first-class citizen이라 부르기도 한다.\n",
6379+
"값을 **일급 객체**, 영어로 first-class citizen이라 부른다.\n",
63816380
"\n",
63826381
"정리하면, 함수를 포함해서 파이썬에서는 모든 대상이 일급 객체다.\n",
6383-
"하지만 여기서는 함수를 다른 함수의 인자로 사용하는 사례는 다루지 않는다.\n",
63846382
":::"
63856383
]
63866384
},
6385+
{
6386+
"cell_type": "markdown",
6387+
"metadata": {},
6388+
"source": [
6389+
"**인자로서의 함수**"
6390+
]
6391+
},
6392+
{
6393+
"cell_type": "markdown",
6394+
"metadata": {},
6395+
"source": [
6396+
"함수 또한 일종의 값이기 때문에 다른 함수의 인자로 사용될 수 있다.\n",
6397+
"예를 들어, 아래 `apply_func()` 함수는 첫째 매개변수는 함수를 인자로 받고,\n",
6398+
"둘째 매개변수는 첫째 인자로 지정된 함수가 다룰 수 있는 값을 인자로 받는다.\n",
6399+
"반환값은 첫째 인자로 들어온 함수를 둘째 인자로 지정된 값과 함께 함수 호출한 결과로 지정된다."
6400+
]
6401+
},
6402+
{
6403+
"cell_type": "code",
6404+
"execution_count": 4,
6405+
"metadata": {},
6406+
"outputs": [],
6407+
"source": [
6408+
"def apply_func(func, value):\n",
6409+
" return func(value)"
6410+
]
6411+
},
6412+
{
6413+
"cell_type": "markdown",
6414+
"metadata": {},
6415+
"source": [
6416+
"`apply_func()` 함수를 호출하는 방식은 다른 게 없다. \n",
6417+
"첫째 인자로 어떤 함수를, 둘째 인자로 첫째 인자로 지정된 함수의 인자로 사용될 수 있는 값을 지정하면 된다.\n",
6418+
"\n",
6419+
"예를 들어 아래 코드에서 `double` 변수는 지정된 인자를 두 배한 값을 반환하는 람다 함수를 가리킨다.\n",
6420+
"따라서 `apply_func(double, 3)`의 반환값은 `double(3)`, 즉 6을 반환한다."
6421+
]
6422+
},
6423+
{
6424+
"cell_type": "code",
6425+
"execution_count": 5,
6426+
"metadata": {},
6427+
"outputs": [
6428+
{
6429+
"name": "stdout",
6430+
"output_type": "stream",
6431+
"text": [
6432+
"3을 2배한 값: 6\n"
6433+
]
6434+
}
6435+
],
6436+
"source": [
6437+
"double = lambda x: x * 2\n",
6438+
"\n",
6439+
"result = apply_func(double, 3)\n",
6440+
"print(\"3을 2배한 값:\", result) # 3 -> 6"
6441+
]
6442+
},
6443+
{
6444+
"cell_type": "markdown",
6445+
"metadata": {},
6446+
"source": [
6447+
"위 코드에서 `double` 변수가 람다 함수를 가리키기에 `double` 변수 대신 해당 람다 함수를 직접\n",
6448+
"`apply_func()` 함수의 인자로 지정해도 된다.\n",
6449+
"다만, 코드가 조금 복잡해질 뿐이다."
6450+
]
6451+
},
6452+
{
6453+
"cell_type": "code",
6454+
"execution_count": 6,
6455+
"metadata": {},
6456+
"outputs": [
6457+
{
6458+
"data": {
6459+
"text/plain": [
6460+
"6"
6461+
]
6462+
},
6463+
"execution_count": 6,
6464+
"metadata": {},
6465+
"output_type": "execute_result"
6466+
}
6467+
],
6468+
"source": [
6469+
"apply_func(lambda x: x * 2, 3)"
6470+
]
6471+
},
6472+
{
6473+
"cell_type": "markdown",
6474+
"metadata": {},
6475+
"source": [
6476+
"`apply_func()` 함수 첫째 인자로 다른 함수를 지정하면 당연히 다른 결과가 나온다.\n",
6477+
"아래 코드에서 `add_ten()` 함수는 인자에 10을 더한 값을 반환한다."
6478+
]
6479+
},
6480+
{
6481+
"cell_type": "code",
6482+
"execution_count": 8,
6483+
"metadata": {},
6484+
"outputs": [
6485+
{
6486+
"name": "stdout",
6487+
"output_type": "stream",
6488+
"text": [
6489+
"5에 10을 더하기: 15\n"
6490+
]
6491+
}
6492+
],
6493+
"source": [
6494+
"def add_ten(x):\n",
6495+
" return x + 10\n",
6496+
"\n",
6497+
"result2 = apply_func(add_ten, 5)\n",
6498+
"print(\"5에 10을 더하기:\", result2) # 5 -> 15"
6499+
]
6500+
},
63876501
{
63886502
"cell_type": "markdown",
63896503
"metadata": {},
@@ -6395,7 +6509,7 @@
63956509
"cell_type": "markdown",
63966510
"metadata": {},
63976511
"source": [
6398-
"(1) 섭씨(celsius)를 화씨(fahrenheit)로 편환하는 수식은 다음과 같다.\n",
6512+
"(1) 섭씨(celsius)를 화씨(fahrenheit)로 변환하는 수식은 다음과 같다.\n",
63996513
"\n",
64006514
"```python\n",
64016515
"섭씨 * 9 / 5 + 32\n",
@@ -6545,6 +6659,61 @@
65456659
"print(\"섭씨:\", round(celsius, 2), '도')\n"
65466660
]
65476661
},
6662+
{
6663+
"cell_type": "markdown",
6664+
"metadata": {},
6665+
"source": [
6666+
"(3)\n",
6667+
"아래 `apply_twice()` 함수는 함수를 인자로 받아서\n",
6668+
"그 함수를 두 번 연속으로 실행한다.\n",
6669+
"아래 코드의 실행 결과를 설명하라."
6670+
]
6671+
},
6672+
{
6673+
"cell_type": "code",
6674+
"execution_count": 13,
6675+
"metadata": {},
6676+
"outputs": [
6677+
{
6678+
"name": "stdout",
6679+
"output_type": "stream",
6680+
"text": [
6681+
"3을 2배하기를 두 번 적용한 값: 12\n"
6682+
]
6683+
}
6684+
],
6685+
"source": [
6686+
"def apply_twice(func, value):\n",
6687+
" return func(func(value))\n",
6688+
"\n",
6689+
"double = lambda x: x * 2\n",
6690+
"\n",
6691+
"result = apply_twice(double, 3)\n",
6692+
"print(\"3을 2배하기를 두 번 적용한 값:\", result)"
6693+
]
6694+
},
6695+
{
6696+
"cell_type": "markdown",
6697+
"metadata": {},
6698+
"source": [
6699+
"답:"
6700+
]
6701+
},
6702+
{
6703+
"cell_type": "markdown",
6704+
"metadata": {},
6705+
"source": [
6706+
"코드가 실행되는 과정은 다음과 같다.\n",
6707+
"\n",
6708+
"- `double` 변수는 입력값을 2배로 만드는 함수를 가리킨다.\n",
6709+
"- `apply_twice(double, 3)` 는 `double`이 가리키는 함수를 값 `3`에 두 번 연속 적용한다.\n",
6710+
" - 첫 번째 적용: `double(3) = 6`\n",
6711+
" - 두 번째 적용: `double(6) = 12`\n",
6712+
"- `result`에는 `12`가 할당되고, 출력 결과는 다음과 같다.\n",
6713+
"\n",
6714+
" 3을 2배하기를 두 번 적용한 값: 12"
6715+
]
6716+
},
65486717
{
65496718
"cell_type": "markdown",
65506719
"metadata": {},
@@ -6701,11 +6870,99 @@
67016870
"print(\"제곱미터:\", sq, \"제곱미터\")\n",
67026871
"print(\"평수:\", round(pyeong, 2), \"\")"
67036872
]
6873+
},
6874+
{
6875+
"cell_type": "markdown",
6876+
"metadata": {},
6877+
"source": [
6878+
"(3) 함수를 인자로 사용하는 함수에 대한 문제다.\n",
6879+
"\n",
6880+
"가. 아래 `apply_chain()` 함수의 시그니처와 기능을 설명하라."
6881+
]
6882+
},
6883+
{
6884+
"cell_type": "code",
6885+
"execution_count": null,
6886+
"metadata": {},
6887+
"outputs": [],
6888+
"source": [
6889+
"def apply_chain(func1, func2, value):\n",
6890+
" return func2(func1(value))"
6891+
]
6892+
},
6893+
{
6894+
"cell_type": "markdown",
6895+
"metadata": {},
6896+
"source": [
6897+
"답:"
6898+
]
6899+
},
6900+
{
6901+
"cell_type": "markdown",
6902+
"metadata": {},
6903+
"source": [
6904+
"함수 정의에 사용된 매개변수와 반환값은 다음과 같다.\n",
6905+
"\n",
6906+
"- `func1`: 하나의 인자를 받는 함수를 인자로 받음\n",
6907+
"- `func2`: 하나의 인자를 받는 함수를 인자로 받음\n",
6908+
"- `value`: `func1`의 인자로 지정된 함수의 인자로 사용될 수 있는 값을 인자로 받음\n",
6909+
"- 반환값: `value`에 `func1`을 먼저 적용한 뒤, 그 결과에 `func2`를 적용한 값"
6910+
]
6911+
},
6912+
{
6913+
"cell_type": "markdown",
6914+
"metadata": {},
6915+
"source": [
6916+
"나. 아래 코드의 실행 결과를 설명하라."
6917+
]
6918+
},
6919+
{
6920+
"cell_type": "code",
6921+
"execution_count": 22,
6922+
"metadata": {},
6923+
"outputs": [
6924+
{
6925+
"name": "stdout",
6926+
"output_type": "stream",
6927+
"text": [
6928+
"79.3\n"
6929+
]
6930+
}
6931+
],
6932+
"source": [
6933+
"print(apply_chain(lambda c: c * 9 / 5 + 32, lambda f: round(f, 1), 26.3))"
6934+
]
6935+
},
6936+
{
6937+
"cell_type": "markdown",
6938+
"metadata": {},
6939+
"source": [
6940+
"답:"
6941+
]
6942+
},
6943+
{
6944+
"cell_type": "markdown",
6945+
"metadata": {},
6946+
"source": [
6947+
"`apply_chain()` 함수의 세 인자는 다음과 같다.\n",
6948+
"참고로 `func1`는 섭씨를 화씨로 변환하는 함수를,\n",
6949+
"`func2`는 소수점 둘째자리에서 반올림하는 함수를 가리킨다.\n",
6950+
"\n",
6951+
"- `func1 = lambda c: c * 9 / 5 + 32`\n",
6952+
"- `func2 = lambda f: round(f, 1)`\n",
6953+
"- `value=26`\n",
6954+
"\n",
6955+
"함수 본문의 실행 순서는 다음과 같다.\n",
6956+
"\n",
6957+
"- `func1(26)` 호출: `26.3 * 9 / 5 + 32 = 79.34` \n",
6958+
"- `func2(79.34)` 호출: `round(79.34, 1) = 79.3`\n",
6959+
"- 출력: `79.3`"
6960+
]
67046961
}
67056962
],
67066963
"metadata": {
67076964
"kernelspec": {
6708-
"display_name": "Python 3 (ipykernel)",
6965+
"display_name": "base",
67096966
"language": "python",
67106967
"name": "python3"
67116968
},
@@ -6719,7 +6976,7 @@
67196976
"name": "python",
67206977
"nbconvert_exporter": "python",
67216978
"pygments_lexer": "ipython3",
6722-
"version": "3.12.12"
6979+
"version": "3.13.12"
67236980
}
67246981
},
67256982
"nbformat": 4,

0 commit comments

Comments
 (0)