Skip to content

Commit 07f0730

Browse files
committed
updated
1 parent 8416b83 commit 07f0730

File tree

1 file changed

+226
-28
lines changed

1 file changed

+226
-28
lines changed

python_pd/04_functions/01_args.ipynb

Lines changed: 226 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -695,69 +695,168 @@
695695
"source": [
696696
"Для более детального изучения этого вопроса приведен ряд ссылок в разделе \"[Полезные ссылки](#Полезные-ссылки)\".\n",
697697
"\n",
698-
"## Произвольное количество аргументов (упаковка и распаковка аргументов)"
698+
"## Произвольное количество аргументов (упаковка и распаковка аргументов)\n",
699+
"\n",
700+
"На этом возможности функций и их аргументов не заканчиваются. Передача произвольного количества аргументов -- это еще одна возможность, которую предоставляет Python. Передавать произвольное количество аргументов можно с помощью ```*args```. Имя ```args``` не является стандартизованным, оно негласно принято. Выражение ```*args``` размещается после всех позиционных аргументов, после ```*args``` могут идти только именованные аргументы. В ```args``` попадаются все значения, которые не предназначены для обязательных позиционных аргументов. В теле функции можно использовать переменную ```args```, она будет иметь тип ```tuple```. В случае, если нет аргументов для ```args``` - кортеж будет пуст. \n",
701+
"\n",
702+
"В объявлении функции можно использовать только один аргумент со звездочкой, т.к. она работает жадно и соберет в себе все значения, которые не поместятся в остальные аргументы."
699703
],
700704
"cell_type": "markdown",
701705
"metadata": {}
702706
},
703707
{
704708
"cell_type": "code",
705-
"execution_count": 21,
709+
"execution_count": 1,
706710
"metadata": {},
707-
"outputs": [],
711+
"outputs": [
712+
{
713+
"output_type": "stream",
714+
"name": "stdout",
715+
"text": [
716+
"args = ()\nargs = (1,)\nargs = (1, 2, 3)\nargs = (1, 2, 3, 4, 5, 6, 7, 8)\n"
717+
]
718+
}
719+
],
708720
"source": [
721+
"# функция принимает любое количество позиционных параметров\n",
709722
"def foo(*args):\n",
710-
" print(f'{args = }')"
723+
" print(f'{args = }')\n",
724+
"\n",
725+
"foo()\n",
726+
"foo(1)\n",
727+
"foo(1, 2, 3)\n",
728+
"foo(1, 2, 3, 4, 5, 6, 7, 8)"
711729
]
712730
},
713731
{
714732
"cell_type": "code",
715-
"execution_count": 22,
733+
"execution_count": 4,
716734
"metadata": {},
717-
"outputs": [],
735+
"outputs": [
736+
{
737+
"output_type": "stream",
738+
"name": "stdout",
739+
"text": [
740+
"a = 1, args = ()\na = 2, args = (2, 3)\na = 3, args = (2, 3, 4, 5, 6, 7)\n"
741+
]
742+
}
743+
],
718744
"source": [
745+
"# функция принимает минимум 1 аргумент\n",
719746
"def bar(a, *args):\n",
720-
" print(f'{args = }')"
747+
" print(f'{a = }, {args = }')\n",
748+
"\n",
749+
"bar(1)\n",
750+
"bar(2, 2, 3)\n",
751+
"bar(3, 2, 3, 4, 5, 6, 7)"
721752
]
722753
},
723754
{
724755
"cell_type": "code",
725-
"execution_count": 8,
756+
"execution_count": 6,
726757
"metadata": {},
727-
"outputs": [],
758+
"outputs": [
759+
{
760+
"output_type": "stream",
761+
"name": "stdout",
762+
"text": [
763+
"a = 1, args = (), c = 2, d = 3\na = 1, args = (2, 3, 4), c = 2, d = 3\n"
764+
]
765+
}
766+
],
728767
"source": [
768+
"# a - обязательный позиционный аргумент\n",
769+
"# args - прочие позиционный аргумент\n",
770+
"# c, d - обязательные ключевые аргументы\n",
729771
"def baz(a, *args, c, d):\n",
730-
" print(f'{args = }')"
772+
" print(f'{a = }, {args = }, {c = }, {d = }')\n",
773+
"\n",
774+
"baz(1, c=2, d=3)\n",
775+
"baz(2, 2, 3, 4, c=2, d=3)"
731776
]
732777
},
733778
{
734779
"cell_type": "code",
735-
"execution_count": 23,
780+
"execution_count": 8,
736781
"metadata": {},
737-
"outputs": [],
782+
"outputs": [
783+
{
784+
"output_type": "stream",
785+
"name": "stdout",
786+
"text": [
787+
"a = 1, args = (), c = 2, d = 1\na = 2, args = (2, 3, 4), c = 2, d = 1\na = 3, args = (2, 3, 4), c = 2, d = 5\n"
788+
]
789+
}
790+
],
738791
"source": [
792+
"# a - обязательный позиционный аргумент\n",
793+
"# args - прочие позиционный аргумент\n",
794+
"# c - обязательные ключевые аргументы\n",
795+
"# d - необязательные ключевые аргументы\n",
739796
"def quz(a, *args, c, d=1):\n",
740-
" print(f'{args = }')"
797+
" print(f'{a = }, {args = }, {c = }, {d = }')\n",
798+
"\n",
799+
"quz(1, c=2)\n",
800+
"quz(2, 2, 3, 4, c=2)\n",
801+
"quz(3, 2, 3, 4, c=2, d=5)"
741802
]
742803
},
804+
{
805+
"source": [
806+
"Для передачи произвольного количества позиционных аргументов в объявление функции нужно добавить ```**kwargs```. Имя ```kwargs``` также не является стандартизованным. В теле функции переменная ```kwargs``` будет представлена словарем, где ключами будут строковые представления имен переданных аргументов, а значениями - значения этих аргументов. ```**kwargs``` должно располагаться после всех прочих аргументов. "
807+
],
808+
"cell_type": "markdown",
809+
"metadata": {}
810+
},
743811
{
744812
"cell_type": "code",
745-
"execution_count": 24,
813+
"execution_count": 10,
746814
"metadata": {},
747-
"outputs": [],
815+
"outputs": [
816+
{
817+
"output_type": "stream",
818+
"name": "stdout",
819+
"text": [
820+
"kwargs = {}\nkwargs = {'a': 1}\nkwargs = {'a': 1, 'b': 2}\n"
821+
]
822+
}
823+
],
748824
"source": [
825+
"# функция с произвольным количеством именованных параметров\n",
749826
"def foo(**kwargs):\n",
750-
" print(f'{kwargs = }')"
827+
" print(f'{kwargs = }')\n",
828+
"\n",
829+
"foo()\n",
830+
"foo(a=1)\n",
831+
"foo(a=1, b=2)"
751832
]
752833
},
753834
{
754835
"cell_type": "code",
755-
"execution_count": 12,
836+
"execution_count": 11,
756837
"metadata": {},
757-
"outputs": [],
838+
"outputs": [
839+
{
840+
"output_type": "stream",
841+
"name": "stdout",
842+
"text": [
843+
"a = 1, b = 2, c = 1, d = 2, kwargs = {}\na = 2, b = 3, c = 4, d = 2, kwargs = {}\na = 3, b = 4, c = 1, d = 5, kwargs = {}\na = 4, b = 5, c = 6, d = 7, kwargs = {}\na = 5, b = 6, c = 1, d = 2, kwargs = {'k': 7}\na = 6, b = 7, c = 8, d = 9, kwargs = {'k': 10}\n"
844+
]
845+
}
846+
],
758847
"source": [
848+
"# a, b - позиционные аргументы\n",
849+
"# c, d - ключевые аргументы\n",
850+
"# kwargs - прочие ключевые аргументы\n",
759851
"def bar(a, b, c=1, d=2, **kwargs):\n",
760-
" print(f'{kwargs = }')"
852+
" print(f'{a = }, {b = }, {c = }, {d = }, {kwargs = }')\n",
853+
"\n",
854+
"bar(1, 2)\n",
855+
"bar(2, 3, c=4)\n",
856+
"bar(3, 4, d=5)\n",
857+
"bar(4, 5, c=6, d=7)\n",
858+
"bar(5, 6, k=7)\n",
859+
"bar(6, 7, c=8, d=9, k=10)"
761860
]
762861
},
763862
{
@@ -775,36 +874,135 @@
775874
}
776875
],
777876
"source": [
877+
"# SyntaxError\n",
778878
"def baz(**kwargs, a=0):\n",
779879
" print(f'{kwargs = }')"
780880
]
781881
},
882+
{
883+
"source": [
884+
"Функция может принимать произвольное количество любых аргументов, т.е. содержать ```*args``` и ```**kwargs``` одновременно."
885+
],
886+
"cell_type": "markdown",
887+
"metadata": {}
888+
},
782889
{
783890
"cell_type": "code",
784-
"execution_count": 25,
891+
"execution_count": 13,
785892
"metadata": {},
786-
"outputs": [],
893+
"outputs": [
894+
{
895+
"output_type": "stream",
896+
"name": "stdout",
897+
"text": [
898+
"args = ()\nkwargs = {}\n-------------------------\nargs = (1, 2, 3)\nkwargs = {}\n-------------------------\nargs = ()\nkwargs = {'a': 3}\n-------------------------\nargs = (1, 2, 3)\nkwargs = {'a': 4, 'b': 5}\n-------------------------\n"
899+
]
900+
}
901+
],
787902
"source": [
788903
"def quz(*args, **kwargs):\n",
789-
" print(f'{args = }\\n{kwargs = }')"
904+
" print(f'{args = }\\n{kwargs = }')\n",
905+
" print('-' * 25)\n",
906+
"\n",
907+
"quz()\n",
908+
"quz(1, 2, 3)\n",
909+
"quz(a=3)\n",
910+
"quz(1, 2, 3, a=4, b=5)"
790911
]
791912
},
792913
{
793914
"cell_type": "code",
794-
"execution_count": 26,
915+
"execution_count": 15,
795916
"metadata": {},
796-
"outputs": [],
917+
"outputs": [
918+
{
919+
"output_type": "stream",
920+
"name": "stdout",
921+
"text": [
922+
"a = 1, b = 2, c = 3, d = 0\nargs = ()\nkwargs = {}\n--------------------------\na = 1, b = 2, c = 3, d = 0\nargs = (3, 4)\nkwargs = {}\n--------------------------\na = 1, b = 2, c = 3, d = 1\nargs = (3,)\nkwargs = {}\n--------------------------\na = 1, b = 2, c = 3, d = 0\nargs = (3,)\nkwargs = {'k': 8, 'h': 9}\n--------------------------\na = 1, b = 2, c = 3, d = 5\nargs = (3,)\nkwargs = {'q': 9}\n--------------------------\n"
923+
]
924+
}
925+
],
797926
"source": [
927+
"# a, b - позиционные аргументы\n",
928+
"# args - прочие позиционные аргументы\n",
929+
"# c - обязательный ключевой аргумент\n",
930+
"# d - необязательный ключевой аргумент\n",
931+
"# kwargs - прочие ключевые аргументы\n",
798932
"def quuz(a, b, *args, c, d=0, **kwargs):\n",
799-
" print(f'{a = }, {b = }, {c = }, {d = }\\n{args = }\\n{kwargs = }')"
933+
" print(f'{a = }, {b = }, {c = }, {d = }\\n{args = }\\n{kwargs = }')\n",
934+
" print('-' * 26)\n",
935+
"\n",
936+
"quuz(1, 2, c=3)\n",
937+
"quuz(1, 2, 3, 4, c=3)\n",
938+
"quuz(1, 2, 3, c=3, d=1)\n",
939+
"quuz(1, 2, 3, c=3, k=8, h=9)\n",
940+
"quuz(1, 2, 3, c=3, d=5, q=9)"
800941
]
801942
},
943+
{
944+
"source": [
945+
"Механизм распаковки коллекций позволяет легко передавать их значения в разные функции."
946+
],
947+
"cell_type": "markdown",
948+
"metadata": {}
949+
},
802950
{
803951
"cell_type": "code",
804-
"execution_count": null,
952+
"execution_count": 16,
805953
"metadata": {},
806-
"outputs": [],
807-
"source": []
954+
"outputs": [
955+
{
956+
"output_type": "stream",
957+
"name": "stdout",
958+
"text": [
959+
"a = 1, b = 2, c = 3\na = 1, b = 2, c = 3\na = 1, b = 2, c = 3\n"
960+
]
961+
}
962+
],
963+
"source": [
964+
"def foo(a, b, c):\n",
965+
" print(f'{a = }, {b = }, {c = }')\n",
966+
"\n",
967+
"xs = [1, 2, 3]\n",
968+
"d = {'a': 1, 'b': 2, 'c': 3}\n",
969+
"\n",
970+
"# распаковка списка\n",
971+
"# количество элементов в списке должно совпадать с количеством аргументов\n",
972+
"foo(*xs)\n",
973+
"\n",
974+
"# частичная распаковка списка\n",
975+
"foo(1, *xs[1:])\n",
976+
"\n",
977+
"# распаковка словаря\n",
978+
"# имена аргументов должны совпадать с ключами словаря\n",
979+
"foo(**d)"
980+
]
981+
},
982+
{
983+
"cell_type": "code",
984+
"execution_count": 17,
985+
"metadata": {},
986+
"outputs": [
987+
{
988+
"output_type": "stream",
989+
"name": "stdout",
990+
"text": [
991+
"args = (1, 2, 3, 4), kwargs = {}\nargs = (), kwargs = {'q': 1, 'w': 2, 'e': 3}\nargs = (1, 2, 3, 4), kwargs = {'q': 1, 'w': 2, 'e': 3}\n"
992+
]
993+
}
994+
],
995+
"source": [
996+
"def bar(*args, **kwargs):\n",
997+
" print(f'{args = }, {kwargs = }')\n",
998+
"\n",
999+
"xs = [1, 2, 3, 4]\n",
1000+
"d = {'q': 1, 'w': 2, 'e': 3}\n",
1001+
"\n",
1002+
"bar(*xs)\n",
1003+
"bar(**d)\n",
1004+
"bar(*xs, **d)"
1005+
]
8081006
},
8091007
{
8101008
"source": [

0 commit comments

Comments
 (0)