Ключевые слова:python, (найти похожие документы)
From: Казанов Евгений Игоревич
Date: Mon, 23 Oct 2010 17:02:14 +0000 (UTC)
Subject: Подсказка по параметрам функций Python
Оригинал: http://blog.swlogic.eu/2010/09/30/python-parametry-funkcij-napominalka/
Напоминалка по использованию параметров (аргументов) функций в Python.
Позиционные параметры
Замечания:
* Все как обычно.
* При вызове указывать обязательно все позиционные аргументы.
1 def a(a,b):
2 print a,b
3
4 a(5,6)
5
6 >>> 5 6
Произвольное количество аргументов
Замечания:
* Обозначается звездочкой перед аргументом - *args
* Внутри функции выглядит как кортеж, элементы кортежа расположены в
том же порядке, что и аргументы функции, указанные при вызове.
* Передать список при вызове функции как набор аргументов можно,
приписав к обозначению списка спереди звездочку
Пример 1. Определение функции с переменным количеством аргументов:
1 def a(*args):
2 print type(args)
3 print args
4
5 a(1,2,3,4,5)
6
7 >>> <type 'tuple'>
8 >>> (1, 2, 3, 4, 5)
Пример 2. Передача списка в функцию, как набора аргументов:
1 def a(*args):
2 print args
3
4 a(1,2,3)
5 a([1,2,3])
6 a(*[1,2,3])
7
8 >>> (1, 2, 3)
9 >>> ([1, 2, 3],)
10 >>> (1, 2, 3)
Комментарии к примеру 2:
* Строка 8: Переменное к-во аргументов
* Строка 9: Список (передается как один аргумент)
* Строка 10: Список со звездочкой (передается как переменное к-во
аргументов)
Именованные аргументы
Замечания:
* При вызове указывать необязательно. Если не указаны, им
присваиваются дефолтные значения.
1 def a(b=4,c=5):
2 print b,c
3
4 a()
5 a(12,13)
6 a(b=15,c=16)
7
8 >>> 4 5
9 >>> 12 13
10 >>> 15 16
Примечания:
* При работе программы значения именованным параметрам присваиваются
один раз, в месте определения функции. Если присваемый объект
изменяемый, то измененный во время работы функции, он при в
следующих вызовах будет иметь не то, значение, которое указано как
значение в определении функции, а то, которое было присвоено во
время предыдущего вызова.
Пример к примечанию:
1 def a(b=[1]):
2 b[0] += 1
3 b.append(1)
4 print b
5
6 a()
7 a()
8 a()
9
10 >>> [2, 1]
11 >>> [3, 1, 1]
12 >>> [4, 1, 1, 1]
Произвольное количество именованных аргументов
Замечания:
* Обозначается двумя звездочками перед аргументом - **kwargs
* Внутри функции выглядит как словарь, с ключами, соответствующими
именам аргументов, указанными при вызове функции.
* Передать словарь при вызове функции как набор именованных
аргументов можно, приписав две звездочки перед обозначением
словаря. Напримиер так: **kwargs
Пример 1. Определение функции с произвольным количество именованных
аргументов:
1 def a(**kwargs):
2 print kwargs
3
4 a()
5 a(b=1,c=2)
6
7 >>> {}
8 >>> {'c': 2, 'b': 1}
Пример 2. Передача словаря в функцию как произвольного количества
именованных аргументов:
1 def a(**kwargs):
2 print kwargs
3
4 d = {'k1':1,'k2':2}
5
6 a(k1=d)
7 a(**d)
8
9 >>> {'k1': {'k2': 2, 'k1': 1}}
10 >>> {'k2': 2, 'k1': 1}
Комментарии к примеру 2:
* Строка 9: Словарь передан как один именованный аргумент.
* Строка 10: Словарь передан как произвольное количество именованных
аргументов.
Все виды параметров вместе
1 def a(b,c,*args,**kwargs):
2 print b,c,args,kwargs
3
4 a(1,2)
5 a(1,2,3,4)
6 a(1,2,5,6,d=8,e=9,f=10)
7
8 >>> 1 2 () {}
9 >>> 1 2 (3, 4) {}
10 >>> 1 2 (5, 6) {'e': 9, 'd': 8, 'f': 10}
Передача параметра по ссылке (изменение параметра внутри функции)
Если при вызове функции подставим в качестве значения аргумента
переменную, а в теле функции мы меняем значение аргумента, то то, что
произойдет, зависит от того, с каким значение связана наша переменная.
Если переменная связана с неизменяемым значением, например int, str,
tulpe, то естественно, это значение не изменится. А вот если переменная
связана со списком, словарем или классом, то значение связанного с
переменной объекта изменится.
Не изменяется:
1 def a(b):
2 b = 2
3
4 c = 3
5 print c
6 a(c)
7 print c
8
9 >>> 3
10 >>> 3
Изменяется:
1 def a(b):
2 b[0] = 2
3
4 c = [3]
5 print c
6 a(c)
7 print c
8
9 >>> [3]
10 >>> [2]
Следствие 1: если нам нужно "передать параметр по ссылке", как в Си,
делать этого не следует, может получиться не то, что хотим. Цель
передачи параметра по ссылке в Си - вернуть несколько значений из
функции, путем изменения значений по ссылкам внутри функции. В питоне
можно возвращать кортеж, поэтому, если нужно вернуть нескоько значений,
нужно возвращать кортеж и присваивать его значения переменным.
Следствие 2: во избежание "боковых эффектов", значениями по умолчанию
лучше делать неизменяемые типы (None, int, str, tulpe)
1 def a():
2 return(5,6)
3
4 b = 1
5 c = 2
6
7 print b,c
8 b,c = a()
9 print b,c
10
11 >>> 1 2
12 >>> 5 6