The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Подсказка по параметрам функций Python (python)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: 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

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, Deepwalker (??), 12:19, 25/10/2010 [ответить]  
  • +/
    Побочных, побочных эффектов, русскоязычный вы мой.
     
  • 2, Автор (?), 12:47, 11/12/2010 [ответить]  
  • +/
    Если бы писал побочных, не брал бы в кавычки, написал "боковых эффектов", специально, чтобы подчеркнуть, что это буквальная калька с английского.
     
  • 3, batiskaf (?), 09:43, 05/04/2013 [ответить]  
  • +/
    очень позновательно, спасибо
     
  • 4, Vlad2030 (?), 23:03, 04/05/2013 [ответить]  
  • +/
    Как написать функцию чтобы она печатала имена и значения своих переменных??

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

    например,:

    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

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру