07 08
This commit is contained in:
parent
15ac4124f2
commit
a2108132c7
571
07.scope.ipynb
Normal file
571
07.scope.ipynb
Normal file
File diff suppressed because one or more lines are too long
697
08.decorators.ipynb
Normal file
697
08.decorators.ipynb
Normal file
@ -0,0 +1,697 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "3e9aa8bc-bdc1-4f86-a44b-c68b8072c4ef",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Decorators\n",
|
||||||
|
"\n",
|
||||||
|
"A common pattern in functional programs, are functions that are built to \"wrap\" other functions.\n",
|
||||||
|
"\n",
|
||||||
|
"Functions are in fact mutable."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"id": "d8cecafd-c460-446b-8f8f-7a35a9f8c6e2",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def print_before_and_after(func):\n",
|
||||||
|
" def newfunc(*args, **kwargs):\n",
|
||||||
|
" print(\"BEFORE\", func)\n",
|
||||||
|
" func(*args, **kwargs)\n",
|
||||||
|
" print(\"AFTER\", func)\n",
|
||||||
|
" return newfunc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "b3dd55e9-33cb-41c9-840a-7fd2f137f2f0",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"id": "f327b88e-d034-4bd3-9e63-9196ccbb3d84",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def inner():\n",
|
||||||
|
" print(\"inner function\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"id": "359d03fc-1d69-4574-a06c-45b55905cecb",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"BEFORE <function inner at 0x1038697e0>\n",
|
||||||
|
"inner function\n",
|
||||||
|
"AFTER <function inner at 0x1038697e0>\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"wrapped_inner = print_before_and_after(inner)\n",
|
||||||
|
"\n",
|
||||||
|
"wrapped_inner()\n",
|
||||||
|
"#print(x)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 4,
|
||||||
|
"id": "916c438d-f0f3-4b78-9846-f9bf2aab7dcc",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"BEFORE <function inner at 0x1038697e0>\n",
|
||||||
|
"inner function\n",
|
||||||
|
"AFTER <function inner at 0x1038697e0>\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# often we want to just replace the function altogether\n",
|
||||||
|
"# with the modified version\n",
|
||||||
|
"inner = print_before_and_after(inner)\n",
|
||||||
|
"inner()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"id": "508bbf73-1f9f-41dd-9665-549472056211",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# another way of writing this is to use decorator syntax\n",
|
||||||
|
"@print_before_and_after\n",
|
||||||
|
"@print_before_and_after\n",
|
||||||
|
"def add_nums(a, b, c):\n",
|
||||||
|
" print(f\"{a} + {b} + {c} =\", a + b + c)\n",
|
||||||
|
"#add_nums = print_before_and_after(print_before_and_after(add_nums))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 6,
|
||||||
|
"id": "86ee63a9-ac5d-44f5-a06a-a89527358141",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"BEFORE <function print_before_and_after.<locals>.newfunc at 0x10386a0e0>\n",
|
||||||
|
"BEFORE <function add_nums at 0x10386a050>\n",
|
||||||
|
"1 + 2 + 3 = 6\n",
|
||||||
|
"AFTER <function add_nums at 0x10386a050>\n",
|
||||||
|
"AFTER <function print_before_and_after.<locals>.newfunc at 0x10386a0e0>\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"add_nums(1, 2, 3)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 7,
|
||||||
|
"id": "1e9d6428-8f80-4707-b508-c15878459d1f",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def cache(func):\n",
|
||||||
|
" inner_cache = {}\n",
|
||||||
|
" \n",
|
||||||
|
" def newfunc(*args, **kwargs):\n",
|
||||||
|
" if args not in inner_cache:\n",
|
||||||
|
" # will not work correctly if there are kwargs\n",
|
||||||
|
" inner_cache[args] = func(*args, **kwargs)\n",
|
||||||
|
" return inner_cache[args]\n",
|
||||||
|
" \n",
|
||||||
|
" return newfunc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"id": "c50faf15-f5dc-4a1b-a114-c606a0edd0be",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"@cache\n",
|
||||||
|
"def expensive_calculation(a, b):\n",
|
||||||
|
" print(f\"doing expensive calculation on {a} {b}...\")\n",
|
||||||
|
" return a ** b\n",
|
||||||
|
"\n",
|
||||||
|
"@cache\n",
|
||||||
|
"def cheap_calculation(a, b):\n",
|
||||||
|
" print(f\"doing cheap calculation on {a} {b}...\")\n",
|
||||||
|
" return a + b"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"id": "dadaf583-82fd-4273-870e-7d68ec67c537",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"doing expensive calculation on 4 10...\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"1048576"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 9,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"expensive_calculation(4, 10)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"id": "6caa9b63-bc83-44c7-b416-1b5f9c708469",
|
||||||
|
"metadata": {
|
||||||
|
"tags": []
|
||||||
|
},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"1048576"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"expensive_calculation(4, 10)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "c6e9a399-9c52-4b38-8fe0-427e0843804a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"doing cheap calculation on 4 10...\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"14"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"cheap_calculation(4, 10)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 12,
|
||||||
|
"id": "8ed9065a-4fb1-4486-ab02-b858d031eb93",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"doing expensive calculation on 5 6...\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"15625"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 12,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"expensive_calculation(5, 6)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 13,
|
||||||
|
"id": "975f7f9e-74c4-4dcf-b396-ad85556e930a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"14"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 13,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"cheap_calculation(4, 10)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 14,
|
||||||
|
"id": "d3d8c310-4fa6-4b5e-b6e7-e0512adfe8c0",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"15625"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 14,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"expensive_calculation(5, 6)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 15,
|
||||||
|
"id": "b6da10be-562c-4968-86ed-c473db63eccf",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def repeat5(func): # the decorator \n",
|
||||||
|
" def newfunc(a, b, c): # the inner function\n",
|
||||||
|
" for i in range(5):\n",
|
||||||
|
" print(a, b, c)\n",
|
||||||
|
" return newfunc\n",
|
||||||
|
"\n",
|
||||||
|
"@repeat5 # the wrapped function\n",
|
||||||
|
"def print_sum(*args):\n",
|
||||||
|
" print(sum(args))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 16,
|
||||||
|
"id": "7f43e771-92d9-48d3-96ed-b95b1c94e942",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"1 2 3\n",
|
||||||
|
"1 2 3\n",
|
||||||
|
"1 2 3\n",
|
||||||
|
"1 2 3\n",
|
||||||
|
"1 2 3\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_sum(1, 2, 3)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 17,
|
||||||
|
"id": "4327b95d-b9ab-49e3-a530-b34e0688cff6",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n",
|
||||||
|
"backwards\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# to make a decorator that takes additional arguments\n",
|
||||||
|
"# you need to write a decorator factory function that returns decorators\n",
|
||||||
|
"\n",
|
||||||
|
"def repeat(n): # factory: takes integer, returns decorator\n",
|
||||||
|
" def repeat_decorator(func): # decorator: takes function, returns function\n",
|
||||||
|
" def newfunc(*args, **kwargs): # inner function: takes ?, returns ?\n",
|
||||||
|
" for i in range(n):\n",
|
||||||
|
" func(*args, **kwargs)\n",
|
||||||
|
" return newfunc\n",
|
||||||
|
" return repeat_decorator\n",
|
||||||
|
"\n",
|
||||||
|
"@repeat(10)\n",
|
||||||
|
"def print_backwards(s):\n",
|
||||||
|
" print(\"backwards\")\n",
|
||||||
|
"\n",
|
||||||
|
"print_backwards(\"backwards\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 18,
|
||||||
|
"id": "8b4219ac-7326-47e1-b3ad-68941349db1d",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"<function repeat.<locals>.repeat_decorator at 0x1038a95a0>\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"repeat_10 = repeat(10)\n",
|
||||||
|
"print(repeat_10)\n",
|
||||||
|
"print_backwards = repeat_10(print_backwards)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 19,
|
||||||
|
"id": "a1d27a5c-ce00-4023-8efd-1900b6f876e5",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# Example: writing our own `partial`\n",
|
||||||
|
"# https://docs.python.org/3/library/functools.html#functools.partial"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 20,
|
||||||
|
"id": "fb9e74b4-a0a2-4463-add7-45b04430edcd",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import functools\n",
|
||||||
|
"print_hello_names = functools.partial(print, \"Hello\", sep=\", \")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 21,
|
||||||
|
"id": "e64ec996-4085-4c03-a771-6c1073b04990",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Hello, Scott, Paul, Lauren\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names(\"Scott\", \"Paul\", \"Lauren\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 22,
|
||||||
|
"id": "eb0d1ad3-e636-4430-9139-265740adc8a1",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"('Hello',)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 22,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names.args"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 23,
|
||||||
|
"id": "9e67124b-9014-49d9-af86-54b8a617521f",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"{'sep': ', '}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 23,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names.keywords"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 24,
|
||||||
|
"id": "f4939684-6c92-4c07-8d88-f7c4349d0f02",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"<function print>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 24,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names.func"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 25,
|
||||||
|
"id": "1ed27205-7691-46ee-bdc6-f75dae7d53da",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# since functions are objects, we can attach arbitrary values to them\n",
|
||||||
|
"def wrapper(func):\n",
|
||||||
|
" def newfunc(*args, **kwargs):\n",
|
||||||
|
" return func(*args, **kwargs)\n",
|
||||||
|
" # we can do whatever we like after defining newfunc, but before returning it\n",
|
||||||
|
" newfunc.is_wrapped = True\n",
|
||||||
|
" return newfunc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 26,
|
||||||
|
"id": "8e02bb23-7278-4799-85d6-9004af65565b",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"True"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 26,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# property is assigned to all wrapped functions\n",
|
||||||
|
"@wrapper\n",
|
||||||
|
"def our_function():\n",
|
||||||
|
" print(\"inside our function\")\n",
|
||||||
|
"\n",
|
||||||
|
"our_function.is_wrapped"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 27,
|
||||||
|
"id": "93b1ad42-b4a2-4947-a4bb-19c818968e2c",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def our_partial(func, /, *args, **keywords):\n",
|
||||||
|
" def newfunc(*fargs, **fkeywords):\n",
|
||||||
|
" newkeywords = {**keywords, **fkeywords}\n",
|
||||||
|
" return func(*args, *fargs, **newkeywords)\n",
|
||||||
|
" # assign these properties from within the closure\n",
|
||||||
|
" newfunc.func = func\n",
|
||||||
|
" newfunc.args = args\n",
|
||||||
|
" newfunc.keywords = keywords\n",
|
||||||
|
" return newfunc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 28,
|
||||||
|
"id": "092b1a1d-4300-4895-aa06-4d874bc61159",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Hello, Scott, Paul, Lauren\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names2 = our_partial(print, \"Hello\", sep=\", \")\n",
|
||||||
|
"print_hello_names2(\"Scott\", \"Paul\", \"Lauren\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 29,
|
||||||
|
"id": "c48a5dfb-0444-4f5e-a4bc-39f0770ff5a3",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"('Hello',)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 29,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names2.args"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 30,
|
||||||
|
"id": "f5d68812-918b-42dd-b23f-925a692668aa",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"{'sep': ', '}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 30,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names2.keywords"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 31,
|
||||||
|
"id": "6b41b480-43e1-49b2-ade7-44d8aa484a09",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"<function print>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 31,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print_hello_names2.func"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "ca9e90da-65e6-4e92-91ae-a97340527b38",
|
||||||
|
"metadata": {
|
||||||
|
"tags": []
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3 (ipykernel)",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.10.15"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user