|
695 | 695 | "source": [
|
696 | 696 | "Для более детального изучения этого вопроса приведен ряд ссылок в разделе \"[Полезные ссылки](#Полезные-ссылки)\".\n",
|
697 | 697 | "\n",
|
698 |
| - "## Произвольное количество аргументов (упаковка и распаковка аргументов)" |
| 698 | + "## Произвольное количество аргументов (упаковка и распаковка аргументов)\n", |
| 699 | + "\n", |
| 700 | + "На этом возможности функций и их аргументов не заканчиваются. Передача произвольного количества аргументов -- это еще одна возможность, которую предоставляет Python. Передавать произвольное количество аргументов можно с помощью ```*args```. Имя ```args``` не является стандартизованным, оно негласно принято. Выражение ```*args``` размещается после всех позиционных аргументов, после ```*args``` могут идти только именованные аргументы. В ```args``` попадаются все значения, которые не предназначены для обязательных позиционных аргументов. В теле функции можно использовать переменную ```args```, она будет иметь тип ```tuple```. В случае, если нет аргументов для ```args``` - кортеж будет пуст. \n", |
| 701 | + "\n", |
| 702 | + "В объявлении функции можно использовать только один аргумент со звездочкой, т.к. она работает жадно и соберет в себе все значения, которые не поместятся в остальные аргументы." |
699 | 703 | ],
|
700 | 704 | "cell_type": "markdown",
|
701 | 705 | "metadata": {}
|
702 | 706 | },
|
703 | 707 | {
|
704 | 708 | "cell_type": "code",
|
705 |
| - "execution_count": 21, |
| 709 | + "execution_count": 1, |
706 | 710 | "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 | + ], |
708 | 720 | "source": [
|
| 721 | + "# функция принимает любое количество позиционных параметров\n", |
709 | 722 | "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)" |
711 | 729 | ]
|
712 | 730 | },
|
713 | 731 | {
|
714 | 732 | "cell_type": "code",
|
715 |
| - "execution_count": 22, |
| 733 | + "execution_count": 4, |
716 | 734 | "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 | + ], |
718 | 744 | "source": [
|
| 745 | + "# функция принимает минимум 1 аргумент\n", |
719 | 746 | "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)" |
721 | 752 | ]
|
722 | 753 | },
|
723 | 754 | {
|
724 | 755 | "cell_type": "code",
|
725 |
| - "execution_count": 8, |
| 756 | + "execution_count": 6, |
726 | 757 | "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 | + ], |
728 | 767 | "source": [
|
| 768 | + "# a - обязательный позиционный аргумент\n", |
| 769 | + "# args - прочие позиционный аргумент\n", |
| 770 | + "# c, d - обязательные ключевые аргументы\n", |
729 | 771 | "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)" |
731 | 776 | ]
|
732 | 777 | },
|
733 | 778 | {
|
734 | 779 | "cell_type": "code",
|
735 |
| - "execution_count": 23, |
| 780 | + "execution_count": 8, |
736 | 781 | "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 | + ], |
738 | 791 | "source": [
|
| 792 | + "# a - обязательный позиционный аргумент\n", |
| 793 | + "# args - прочие позиционный аргумент\n", |
| 794 | + "# c - обязательные ключевые аргументы\n", |
| 795 | + "# d - необязательные ключевые аргументы\n", |
739 | 796 | "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)" |
741 | 802 | ]
|
742 | 803 | },
|
| 804 | + { |
| 805 | + "source": [ |
| 806 | + "Для передачи произвольного количества позиционных аргументов в объявление функции нужно добавить ```**kwargs```. Имя ```kwargs``` также не является стандартизованным. В теле функции переменная ```kwargs``` будет представлена словарем, где ключами будут строковые представления имен переданных аргументов, а значениями - значения этих аргументов. ```**kwargs``` должно располагаться после всех прочих аргументов. " |
| 807 | + ], |
| 808 | + "cell_type": "markdown", |
| 809 | + "metadata": {} |
| 810 | + }, |
743 | 811 | {
|
744 | 812 | "cell_type": "code",
|
745 |
| - "execution_count": 24, |
| 813 | + "execution_count": 10, |
746 | 814 | "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 | + ], |
748 | 824 | "source": [
|
| 825 | + "# функция с произвольным количеством именованных параметров\n", |
749 | 826 | "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)" |
751 | 832 | ]
|
752 | 833 | },
|
753 | 834 | {
|
754 | 835 | "cell_type": "code",
|
755 |
| - "execution_count": 12, |
| 836 | + "execution_count": 11, |
756 | 837 | "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 | + ], |
758 | 847 | "source": [
|
| 848 | + "# a, b - позиционные аргументы\n", |
| 849 | + "# c, d - ключевые аргументы\n", |
| 850 | + "# kwargs - прочие ключевые аргументы\n", |
759 | 851 | "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)" |
761 | 860 | ]
|
762 | 861 | },
|
763 | 862 | {
|
|
775 | 874 | }
|
776 | 875 | ],
|
777 | 876 | "source": [
|
| 877 | + "# SyntaxError\n", |
778 | 878 | "def baz(**kwargs, a=0):\n",
|
779 | 879 | " print(f'{kwargs = }')"
|
780 | 880 | ]
|
781 | 881 | },
|
| 882 | + { |
| 883 | + "source": [ |
| 884 | + "Функция может принимать произвольное количество любых аргументов, т.е. содержать ```*args``` и ```**kwargs``` одновременно." |
| 885 | + ], |
| 886 | + "cell_type": "markdown", |
| 887 | + "metadata": {} |
| 888 | + }, |
782 | 889 | {
|
783 | 890 | "cell_type": "code",
|
784 |
| - "execution_count": 25, |
| 891 | + "execution_count": 13, |
785 | 892 | "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 | + ], |
787 | 902 | "source": [
|
788 | 903 | "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)" |
790 | 911 | ]
|
791 | 912 | },
|
792 | 913 | {
|
793 | 914 | "cell_type": "code",
|
794 |
| - "execution_count": 26, |
| 915 | + "execution_count": 15, |
795 | 916 | "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 | + ], |
797 | 926 | "source": [
|
| 927 | + "# a, b - позиционные аргументы\n", |
| 928 | + "# args - прочие позиционные аргументы\n", |
| 929 | + "# c - обязательный ключевой аргумент\n", |
| 930 | + "# d - необязательный ключевой аргумент\n", |
| 931 | + "# kwargs - прочие ключевые аргументы\n", |
798 | 932 | "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)" |
800 | 941 | ]
|
801 | 942 | },
|
| 943 | + { |
| 944 | + "source": [ |
| 945 | + "Механизм распаковки коллекций позволяет легко передавать их значения в разные функции." |
| 946 | + ], |
| 947 | + "cell_type": "markdown", |
| 948 | + "metadata": {} |
| 949 | + }, |
802 | 950 | {
|
803 | 951 | "cell_type": "code",
|
804 |
| - "execution_count": null, |
| 952 | + "execution_count": 16, |
805 | 953 | "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 | + ] |
808 | 1006 | },
|
809 | 1007 | {
|
810 | 1008 | "source": [
|
|
0 commit comments