Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[10]

def change(): x=-l change()

значение глобальной переменной х не изменится. Вместо этого в локальной области будет создана новая переменная, имя которой совпадет с именем глобальной переменной. Если же попытаться проверить значение глобальной переменной до попытки изменения её значения, будет выдано значение именно глобальной:

def trytogetO: print х trytogetO

Таким образом, чтение глобальных переменных не считается питоном нарушением стиля, а запись в них данных - считается. Но, используя оператор global, можно обойти и это ограничение. Так,

def incr():

х+=1 incr()

вызовет ошибку «обращение к локальной переменной до первого присваивания» (local variable х referenced before assignment), a: x=l

def incr():

global x

x+=l incr()

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

Функции в питоне являются полноправными типами данных, поэтому их можно присваивать друг другу:

def а(х,у):return х+у+2

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

4.4 Особые приёмы работы с функциями

Таких приемов насчитывается пять штук. Это именованные параметры, необязательные для указания параметры, параметры с неизвестной длиной и параметры с неизвестными именами. Еще один прием, лямбда-исчисление, будет рассмотрен нами отдельно, так как он стоит этого.


•Именованные параметры - это механизм, позволяющий при вызове подпрограммы менять местами её параметры, зная их имена. Например, мы объявили функцию:

def qualifу(author,name,quality):

print author+"s", name, is a, quality, book.

Её можно вызывать так:

qualifуCG.Booch, OOA&D with Applications, good)

А можно - так:

qualifу(quality=good, name=00A&D with Applications, author=G.Booch)

Результат будет одинаковым: G.Boochs OOA&D with Applications is a very good book..

Можно комбинировать этот подход с обычным перечислением параметров по порядку, но при этом именованные параметры должно стоять после всех обычных:

qualifу(author=G.Booch, OOA&D, good)-нельзя qualifуCG.Booch, quality=good,name=OOA&D) - можно

•Необязательные для указания параметры - это механизм, позволяющий при вызове подпрограммы указывать значения только критических параметров, без которых она работать не будет, имея, тем не менее, возможность указания их при желании. Это реализуется путем указания значений по умолчанию для всех необязательных параметров при определении функции:

def qualify(author,name="book",quality="bad"):

print author+"s", name, is a, quality, book.

Теперь наша функция может принимать от одного до трех параметров, причем, воспользовавшись предыдущим приёмом, можно задать качество книги без указания названия:

qualifуCG.Booch,qualify=very good)

Рекомендуется при использовании необязательных для указания параметров присваивать им значения только неизменяемых типов (строк, чисел, кортежей), потому что используемое по умолчанию значение присваивается только один раз. Например, у вас есть функция:

def addel(n,х= []):

х.append(n)

print x

Теперь попробуем запустить её несколько раз: addel(2,[3,4]) # дат [3,4,2]- правильно


addel(l) # дат [1]- пока правильно

addel(2) # дат [1,2]- неправильно!

addel(3) # дат [1,2,3]- уж совсем неправильно!

Вместо этого следует пользоваться проверкой внутри тела функции, менее удобной, но работающей правильно.

•Параметры неизвестной длины - это механизм, позволяющий ре-ализовывать подпрограммы, полностью инвариантные относительно количества предоставляемых им параметров. Записывается это так:

def qualif yAuthors(*several) :

for one in several:

qualifу(one)

При этом, как вы поняли, все параметры питон собирает в один кортеж и его отдает в качестве указанной переменной. Кортеж, безусловно, может быть пуст.

•Непредусмотреные параметры - это механизм, позволяющий ре-ализовывать подпрограммы, стойкие к лишним параметрам и инвариантные относительно их имен. При этом еще однам именем обозначается словарь, который либо пуст, если все параметры предусмотрены, либо состоит из пар название-значение. Синтаксис таков:

def qualify(author,name="book",quality="bad",**aux):

print author+"s", name, is a, quality, if aux:

print book,,

for a in aux.keys(): print a,works in ,aux[a...J

print as one can read. else:

print book.

Тогда нашей весьма выросшей процедурой можно пользоваться вот так:

qualifу(G.Booch,00A&D,very good)

qualifу(A.V.Aho,R.Sethi,J.D.Ullman, quality=perfect, name=Dragon Book, Aho=AT&T Bell Labs,Sethi=AT&T Bell Labs,Ullman=Stanford University)

что выдаст:

G.Boochs OOA&D is a very good book.

A.V.Aho,R.Sethi,J.D.Ullmans Dragon Book is a perfect book, Aho works in AT&T Bell Labs, Sethi works in AT&T Bell Labs, Ullman works in Stanford University, as one can read.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13]