Python, параметры (аргументы) функций, шпаргалка

Напоминалка по использованию параметров (аргументов) функций в 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

  

Опубликовано: September 30, 2010

Комментарии:


Имя: Игорь

Спасибо, пригодилась



Имя: Den

За a(**d) отдельное спасибо.



Имя: test

Спасибо!



Имя: alex

Спасибо



Имя: Serg

Спасибо за доходчивые разъяснения!



Имя: Vlad2030

Как написать функцию чтобы она печатала имена и значения своих переменных??

def fprintf(*args,**kwargs):
print kwargs[]...
print args[]...

KP=2
N_elem = [1,2,3,5,7,9,[55]]
c='privet'

KP = 2
N_elem = [1, 2, 3, 5, 7, 9, [55]]
c = 'privet'

fprintf(KP, N_elem, c)

результат:
KP = 2
N_elem = [1, 2, 3, 5, 7, 9, [55]]
c = privet



Имя: seyalek


>>Как написать функцию чтобы она печатала имена и значения своих переменных??

def fprintf(**kwargs):
for k, v in kwargs.items():
print "%s = %s" % (k, v)

и извратно вызывать:
fprintf(KP=KP, N_elem=N_elem, c=c)



Имя: Александр

Жаль, что такое большое количество примеров нельзя использовать в СРР Ибо фитонки я не знаю. А ведь тема интересная и очень хотелось бы знать, как её применять на практике, а не просто 1,2,3. Например если есть задача воплотить идею в атмегу8 На срр [это индекс массива] = {Привет мир} =)
индекс++ и каждый цикл выводим по букве.



Имя: Denis

При работе программы значения именованным параметрам присваиваются один раз, в месте определения функции. Если присваемый объект изменяемый, то измененный во время работы функции, он при в следующих вызовах будет иметь не то, значение, которое указано как значение в определении функции, а то, которое было присвоено во время предыдущего вызова.

То о чем вы упомянули относиться только к спискам.
Потому, что присваивая параметру список, и параметр и список создаются в одной ячейке и имеют один id. При изменении параметра меняется список и сохраняется все в той же ячейке.

Вообщем как-то так!



Имя: Asya

def even(x):
if x%2==0:
print("Yes")
____?
print("No")

Что поставить в предпоследне



Имя: Asya

def even(x):
if x%2==0:
print("Yes")
____?
print("No")

Что поставить в предпоследней строчке???



Имя: Shitz

Спасибо



Имя: aaa

Asya, else



Имя: Alesha

Asya, тупая!



Комментировать:

Имя:

Комментарий: