|
6246 | 6246 | "lambda 매개변수1, ..., 매개변수n : 표현식\n", |
6247 | 6247 | "```\n", |
6248 | 6248 | "\n", |
6249 | | - "lambda(람다)는 그리스어 알파벳 λ(lambda)를 가리키며,\n", |
| 6249 | + "lambda(람다)는 그리스어 알파벳 λ를 가리키며,\n", |
6250 | 6250 | "람다를 이용한다는 이유로 \n", |
6251 | 6251 | "**람다 함수**<font size='2'>lambda function</font>라 부른다." |
6252 | 6252 | ] |
|
6343 | 6343 | "\n", |
6344 | 6344 | "함수 또한 값이기에 변수 할당에 활용될 수 있다.\n", |
6345 | 6345 | "아래 코드는 앞서 정의한 람다 함수를 변수에 할당하여\n", |
6346 | | - "정의된 변수를 함수 이름을 활용하여 일반적인 함수처럼 호출한다." |
| 6346 | + "람다 함수 정의대신 변수를 일반적인 함수 호출처럼 사용한다." |
6347 | 6347 | ] |
6348 | 6348 | }, |
6349 | 6349 | { |
|
6370 | 6370 | "source": [ |
6371 | 6371 | ":::{note} 일급 객체\n", |
6372 | 6372 | "\n", |
6373 | | - "변수에 저장할 수 있고 함수의 인자로 활용될 수 이는 대상을 값이며,\n", |
6374 | | - "파이썬에서 다루는 모든 대싱이 값이다.\n", |
| 6373 | + "변수에 저장할 수 있고, 따라서 함수의 인자로 사용할 수 있는 대상이 값이며, 파이썬에서 다루는 모든 대상이 값이다.\n", |
6375 | 6374 | "반면에 C 언어의 경우엔 함수를 변수에 할당하거나 다른 함수의 인자로 사용할 수 없고,\n", |
6376 | | - "대신 포인터 변수라는 특별한 장치를 활용해서 함수를 할당하거나 다른 함수의 인자로 활용할 수 있다.\n", |
| 6375 | + "대신 포인터 변수라는 특별한 장치를 활용해서 함수를 변수에 할당하거나 다른 함수의 인자로 활용한다.\n", |
6377 | 6376 | "\n", |
6378 | 6377 | "이처럼 프로그래밍언어마다 값의 종류가 다른데,\n", |
6379 | 6378 | "변수 할당과 함수의 인자로 특별한 장치 없이 바로 사용할 수 있다는 점에서\n", |
6380 | | - "값을 일급 객체, 영어로 first-class citizen이라 부르기도 한다.\n", |
| 6379 | + "값을 **일급 객체**, 영어로 first-class citizen이라 부른다.\n", |
6381 | 6380 | "\n", |
6382 | 6381 | "정리하면, 함수를 포함해서 파이썬에서는 모든 대상이 일급 객체다.\n", |
6383 | | - "하지만 여기서는 함수를 다른 함수의 인자로 사용하는 사례는 다루지 않는다.\n", |
6384 | 6382 | ":::" |
6385 | 6383 | ] |
6386 | 6384 | }, |
| 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 | + }, |
6387 | 6501 | { |
6388 | 6502 | "cell_type": "markdown", |
6389 | 6503 | "metadata": {}, |
|
6395 | 6509 | "cell_type": "markdown", |
6396 | 6510 | "metadata": {}, |
6397 | 6511 | "source": [ |
6398 | | - "(1) 섭씨(celsius)를 화씨(fahrenheit)로 편환하는 수식은 다음과 같다.\n", |
| 6512 | + "(1) 섭씨(celsius)를 화씨(fahrenheit)로 변환하는 수식은 다음과 같다.\n", |
6399 | 6513 | "\n", |
6400 | 6514 | "```python\n", |
6401 | 6515 | "섭씨 * 9 / 5 + 32\n", |
|
6545 | 6659 | "print(\"섭씨:\", round(celsius, 2), '도')\n" |
6546 | 6660 | ] |
6547 | 6661 | }, |
| 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 | + }, |
6548 | 6717 | { |
6549 | 6718 | "cell_type": "markdown", |
6550 | 6719 | "metadata": {}, |
|
6701 | 6870 | "print(\"제곱미터:\", sq, \"제곱미터\")\n", |
6702 | 6871 | "print(\"평수:\", round(pyeong, 2), \"평\")" |
6703 | 6872 | ] |
| 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 | + ] |
6704 | 6961 | } |
6705 | 6962 | ], |
6706 | 6963 | "metadata": { |
6707 | 6964 | "kernelspec": { |
6708 | | - "display_name": "Python 3 (ipykernel)", |
| 6965 | + "display_name": "base", |
6709 | 6966 | "language": "python", |
6710 | 6967 | "name": "python3" |
6711 | 6968 | }, |
|
6719 | 6976 | "name": "python", |
6720 | 6977 | "nbconvert_exporter": "python", |
6721 | 6978 | "pygments_lexer": "ipython3", |
6722 | | - "version": "3.12.12" |
| 6979 | + "version": "3.13.12" |
6723 | 6980 | } |
6724 | 6981 | }, |
6725 | 6982 | "nbformat": 4, |
|
0 commit comments