Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
def my_func(param=some_other_func()):
pass
def some_func():
return 'Hello!'
def some_func2():
return [1, 2, 3]
def my_func(a = some_func(), b = some_func2()):
print a, b
my_func()
Hello! [1, 2, 3]. Почему? Потому что все функции были выполнены на момент объявления функции. Естественно, если попытаться из some_func-ов потрогать my_func, нам просто скажут, что нет такого объекта. И правильно сделают — сначала объект создается, а лишь потом ему назначается референс в виде идентификатора.my_func-а поизменять b — в данном случае, мы будем всегда работать с одним и тем же списком, потому что его значение уже было однажды вычислено, а списки являются mutable объектами (т.е. могут менять своё содержимое), тогда как строка 'Hello!' — immutable, т.е. значение своё менять не может и после каждой операции со строками создается новый экземпляр.
class A{
public:
static int a=0;
int inc(){a++; return a;};
}
class A:
a = 0
def inc(self):
A.a += 1
return A.a
inc() в любом экземпляре класса A значение a (т. н. class attribute в терминологии Python) изменится сразу во всех экземплярах класса. Программист волен пользоваться и instance attribute — при этом аттрибут будет персональным для каждого экземпляра класса. Собственно, лично я не вижу никакой путаницы :) При многопоточном программировании надо будет всего лишь обернуть inc в lock-и.sys._getframe().f_locals, затем в f_globals и f_builtin) и так пока не найдет нужный символ, либо «наступит» NameError.parse станет известно непосредственно при вызове этой функции. Можно вообще написать нечто вида def abc(): return this_name_will_never_exist + 1 и оно нормально скомпилируется и даже запустится, правда, вывалив NameError.print lambda: 10 - 3. :) По вкусу можно написать print (lambda: 10 - 3), чтобы избежать неоднозначностей при возврате tuple-ов.lambda (x, y): expr и lambda x, y: expr — две разных ф-ции. Первая принимает один параметр, который должен мочь распаковаться (т.е. быть iterable) в ровно два элемента, тогда как вторая функция принимает два аргумента. Пример использования первой:t = (a, b) # либо [a, b], iter([a, b]) и т.д. print (lambda (x, y): x + y)(t)
print (lambda (x, y): x + y)((a, b)) (скобки не лишние).print (lambda x, y: x + y)(a, b).Так же возможны различные сочетания positional и keyword аргументов.
def foo(a, b, c, d = 1, e = None, f = '3', *args, **kwarg). Порядок важен — сначала позиционные аргументы, затем keyword-аргументы, только затем *args и **kwarg. args и kwarg — просто общепринятые названия, и могут быть любыми по вкусу :)varargslist: ((fpdef ['=' test] ',')*
('*' NAME [',' '**' NAME] | '**' NAME) |
fpdef ['=' test] (',' fpdef ['=' test])* [','])
Статью прочитал, хотел порекомендовать, но не порекомендую, потому что я ничего не понял. То, что я ничего не понял — ваша вина, я должен был понять, потому что я должен был, а вы виноваты, что я не понял. И вот, тут тоже есть один, который ничего не понял. Ну вы же сами понимаете, что я хочу сказать, поэтому я не буду этого говорить, вы и так всё поняли, что я сказать-то хотел.
… Терминология, «параметры по умолчанию» хорошо, а можно ещё «именованые аргументы»...Думаю, вам, конечно же, известно, что «параметры по умолчанию и «именованные аргументы» — две больших разницы, поэтому просто будем считать, что вы нечаянно оговорились :)
Основы Python — кратко. Часть 6. Расширенное определение функций.