Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL-LAB8(9).doc
Скачиваний:
18
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

1.4 Зазначені (поіменовані) аргументи.

У випадку коли функція має багато параметрів то досить легко заплутатись в їх порядку при виклику функції. В мові Python реалізовано можливість явно визначати відповідність між значннями і іменами аргументів при виклику функції. Ключі дозволяють встановити відповідність за іменами а не за позиціями. До параметрів можна звертатися за іменами (ключами) і присвоювати їм значення по замовчуванню. Застосовуючи такий підхід параметри функції можуть бути записані в довільному порядку, а також і опущені у випадку визначення їх значень по замовчуванню.

 

>>> def repeat(msg='<empty>', num=1):

... return msg * num

>>> repeat(num=3)

'<empty><empty><empty>'

>>> repeat(msg='Alice')

'Alice'

>>> repeat(num=5, msg='Alice')

'AliceAliceAliceAliceAlice'

При спільному використанні двох типів параметрів потрібно пересвідчитись, що спочатку йдуть звичайні параметри а потім поіменовані параметри. Така послідовність необхідна, бо звичайні параметри визначаються позицією, яку вони займають у списку аргументів функції. Можна визначити функцію з довільними неіменованими (звичайними), та іменованими (ключами) параметрами і доступатися до них через список аргументів *args (список ) та через ключі у словнику**kwargs(словник).

 

>>> def generic(*args, **kwargs):

... print args

... print kwargs

...

>>> generic(1, "African swallow", monty="python")

(1, 'African swallow')

{'monty': 'python'}

Коли *args зустрічається, як параметр функції то він відповідає всім неіменованим параметрам функції. Наступний приклад також ілюструє цю особливість синтаксисуPython. Функція zip() може мати довільну кількість аргументів#1. Використання імені змінної *song демонструє, аналогічний результат з використанням імені змінної*args в попередньому прикладі.

 

>>> song = [['four', 'calling', 'birds'],

... ['three', 'French', 'hens'],

... ['two', 'turtle', 'doves']]

>>> zip(song[0], song[1], song[2]) #1

[('four', 'three', 'two'), ('calling', 'French', 'turtle'), ('birds', 'hens', 'doves')]

>>> zip(*song) #2

[('four', 'three', 'two'), ('calling', 'French', 'turtle'), ('birds', 'hens', 'doves')]

Зрозуміло, що *song зручніше записати ніжsong[0], song[1], song[2], і отримати еквівалентний результат.

Наступний приклад демонструє використання поіменованих аргументів (ключів) при визначенні функції, а також три різні способи виклику цієї функції:

 

>>> def freq_words(file, min=1, num=10):

... text = open(file).read()

... tokens = nltk.word_tokenize(text)

... freqdist = nltk.FreqDist(t for t in tokens if len(t) >= min)

... return freqdist.keys()[:num]

>>> fw = freq_words('ch01.rst', 4, 10)

>>> fw = freq_words('ch01.rst', min=4, num=10)

>>> fw = freq_words('ch01.rst', num=10, min=4)

Прихований ефект, який забезпечує використання поіменованих аргументів, це їх опціональність ( необов’язковість ). Буде отримано однаковий результат і при виклику функції: freq_words('ch01.rst', min=4),і при виклику freq_words('ch01.rst', 4). Значенняnum=10 зберігається по замовчуванню. Іншй приклад опціональних аргументів функції, це використання прапорців (позначок). Оновлена версія попередньої функції виводить інформацію про хід свого виконання , якщо встановлений прапорець verbose (спробуйте також присвоїти значення прапорцяverbose=True):

 

>>> def freq_words(file, min=1, num=10, verbose=False):

... freqdist = FreqDist()

... if trace: print "Opening", file

... text = open(file).read()

... if trace: print "Read in %d characters" % len(file)

... for word in nltk.word_tokenize(text):

... if len(word) >= min:

... freqdist.inc(word)

... if trace and freqdist.N() % 100 == 0: print "."

... if trace: print

... return freqdist.keys()[:num]

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]