Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011-kl-lab8.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
916.48 Кб
Скачать

4.3 Область дії змінних

При визначенні функції створюється нова локальна область дії змінних. Коли здійснюється операція присвоювання до нової змінної в тілі функції то ім’я цієї змінної визначено тільки в межах функції. Це ім’я недоступне поза функцією а також і в інших функціях. Тому, обираючи імена змінних в тілі функції можна не турбуватися про їх суперечності з іменами змінних, які зустрічаються в інших функціях.

Коли відбувається звертання за існуючим іменем в тілі функції, то інтерпретатор Python спочатку намагається розв’язати це звертання серед локальних імен функції. Якщо такого імені у функції не знайдено, пошук продовжується серед глобальних імен модуля. Якщо і тут немає такого імені, інтерпретатор буде намагатися його знайти серед імен вбудованих в Python. Це так зване LGB правило розв’язання імен: локальне, глобальне, вбудоване.

У функції можуть створюватися нові глобальні змінні за допомогою оголошення global . Але цього потрібно намагатися уникати. Визначення глобальних змінних у функції обмежує її переносимість (повторне використання) та робить її залежною від основної програми.

4.4 Контроль типів параметрів

Python не вимагає оголошення типів змінних при написанні програми і це дозволяє визначати функції, гнучкі до типів їх аргументів. Наприклад, програма морфологічного аналізу очікує послідовність слів , але ця програма не контролює, чи ця послідовність буде представлена як список, чи як стрічка, чи кортеж, чи ітератор (ітератор - новий тип змінних, який буде розглядатися пізніше). Тому при написанні програм, які будуть використовуватися в подальшому, потрібно щоб при неправильному виклику функцій видавались відповідні попередження (програма повинна контролювати типи змінних а аргументах функцій). Наприклад, в функції tag(), передбачається, що її аргументи завжди мають тип стрічка.

 

>>> def tag(word):

... if word in ['a', 'the', 'all']:

... return 'det'

... else:

... return 'noun'

...

>>> tag('the')

'det'

>>> tag('knight')

'noun'

>>> tag(["'Tis", 'but', 'a', 'scratch']) #1

'noun'

Функція повертає вірні значення для аргументів 'the' та'knight', але у випадку коли аргумент список #1— функція не реагує, незважаючи на те, що результат, який вона повертає однозначно помилковий. Потрібно зробити певні додаткові дії для того щоб забезпечити для параметру word функції tag()тип – стрічка. Просте рішення, це перевірити тип аргументу за допомогою стрічки програми: if not type(word) is str. Якщо тип word не стрічка, Python повертає спеціальне пусте значення, None. Це важливе уточнення, оскільки функція перевіряє тип аргументу і пробує повернути спеціальне, діагностичне значення при неправильних вхідних даних. Проте, таке рішення також небезпечне, тому що програмі, яка викликає функцію невідомо що None це спеціальне діагностичне значення і це значення може бути використано в інших частинах програми з невідомими наслідками. Такий підхід також буде помилковим у випадку якщо тип word буде Unicode а не стрічка. Правильним буде наступне рішення з використанням assert твердження разом з абстрактним типом Python basestring, який є суперкласом (надкласом) для стрічки і Unicode.

 

>>> def tag(word):

... assert isinstance(word, basestring), "argument to tag() must be a string"

... if word in ['a', 'the', 'all']:

... return 'det'

... else:

... return 'noun'

Якщо assert твердження не справджується, то генерується помилка, яка не ігнорується і зупиняє виконання програми і виводить відповідне повідомлення про помилку з описом помилки. Додавання операторів контролю (assert твердження) до програми допомагає виявляти логічні помилки і це є різновидом захищеного програмування. Більш загальний підхід - це документування параметрів кожної функції використовуючи стрічку документування.

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