Определение области определения функции: § Область определения функции

1.2. Понятие функции

Для исследования различных явлений полезно знать, как изменение одних величин влияет на другие величины.

Понятие функции связано с установлением зависимости (связи) между двумя (несколькими) переменными величинами при их совместном изменении, или установлением зависимости между элементами двух (нескольких) множеств.

Определение.

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

Для указания этого факта, что y есть функция от х, пишут: ,,и т.п.

Можно также сказать, что функция f отображает множество Х на множество Y. Это обозначается так (рис.1.1).

Рис. 1.1

Переменная х называется независимой переменной или аргументом.

Переменная y называется зависимой переменной или функцией.

Относительно самих величин х и y говорят, что они находятся в функциональной зависимости.

1.3. Область определения и изменения функции

Определение.

Совокупность всех значений независимой переменной х, для которых функция y определена, называется областью определения или областью существования этой функции.

Определение.

Множество Х называется областью определения функции и обозначается .

Обычно областью определения функции являются:

;

;

;

;

; ;

; ;

,

где ,и.

Например, для функций:

1) ;

2) .

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

Определение.

Множество значений Y называется областью изменения или областью значений функции, и обозначается .

Область изменения функции (множество ее значений) определяется законом соответствия.

Например, для функций

1) ;;

2) ;.

Определение.

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

R.

В дальнейшем будем изучать лишь числовые функции. Частное значение функции призаписывается так:.

Например, если , то,,и т. п.

1.4. Последовательность

Определение.

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

Значения функции т.е. элементы множестваназываются членами последовательности, а– общим членом последовательности.

Последовательность обычно обозначают через или.

Например, ;.

1.5. График функции

Для наглядного представления функции строят ее график.

Определение.

Графиком функции называется множество всех точек плоскости, для каждой из которых

х является значением аргумента, а y – соответствующим значением функции.

Например, графиком функции является верхняя полуокружность радиусас центром в(рис. 1.2).

Рис. 1.2

1.6. Способы задания функции

Задать функцию – это значит указать правило, позволяющее по данному значению независимой переменной находить соответствующее значение функции.

Существует три основных способа задания функции: аналитический, табличный и графический.

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

Например, ;;, где.

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

Табличный способпредусматривает задание таблицы, в которой различным значениям аргументапоставлены соответствующие значения функции:

х

х1

х2

хn

y

y1

y2

yn

Такие таблицы составляются, например, по данным эксперимента; для облегчения вычислений с часто встречающимися функциями (таблицы логарифмов, таблицы тригонометрических функций и т. д.).

Графический способзадания функции состоит в том, что в данной системе координат задается некоторая кривая. Преимуществом графического задания является его наглядность, недостатком – его неточность.

Функции в Python, определение функций.

Функции в Python определяются с помощью инструкции def, которое вводит определение функции. За ним должно следовать имя функции и заключенный в скобки список формальных параметров аргументов. Операторы, которые формируют тело функции, начинаются со следующей строки и должны иметь отступ.

def func_name(param):
    pass
  • func_name — идентификатор, то есть переменная, которая при выполнении инструкции
    def
    связывается со значением в виде объекта функции.
  • param — это необязательный список формальных параметров аргументов, которые связываются со значениями, предоставляемыми при вызове функции. В простейшем случае функция может вообще не иметь параметров. Это означает, что при ее вызове она не получает никаких аргументов. В определении такой функций круглые скобки после ее имени остаются пустыми, такими же они должны оставаться при ее вызове.

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

Определение функции — это исполняемый оператор. Его выполнение связывает имя функции в текущем локальном пространстве имен с объектом функции (оболочка вокруг исполняемого кода функции). Этот объект функции содержит ссылку на текущее глобальное пространство имен, которое будет использоваться при вызове функции.

Определение функции не выполняет тело функции, а только вычисляет аргументы, если они присутствуют. Тело функции выполняется только при вызове.

# Определим функцию, которая печатает список чисел ряда Фибоначчи до n
>>> def fib(n):
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Вызов функции
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

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

Определение функции может быть заключено в одно или несколько выражений-декоратора. Выражения-декораторы оцениваются при определении функции в области, содержащей определение функции. Результатом должен быть вызываемый объект, который вызывается с объектом функции в качестве единственного аргумента. Возвращаемое значение привязывается к имени функции, а не к объекту функции. Несколько декораторов применяются вложенным образом. Например, следующий код

@f1(arg)
@f2
def func(): pass
# Примерно эквивалентен
def func(): pass
func = f1(arg)(f2(func))

Эти два выражения эквивалентны за исключением того, что исходная функция временно не привязана к имени

func.

Когда один или несколько параметров имеют выражение parameter=expression, говорят, что функция имеет значения параметров по умолчанию. Для параметра со значением по умолчанию, соответствующий аргумент может быть опущен в вызове. Если параметр имеет значение по умолчанию, то все последующие параметры также должны иметь значение по умолчанию — это синтаксическое ограничение.

Значения параметров по умолчанию оцениваются слева направо при определении функции. Это означает, что эти выражение вычисляется один раз, когда функция определена, и что для каждого вызова используется одно и то же предварительно вычисленное значение. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь

Семантика вызова функций более подробно описана в разделе «Что происходит в момент вызова функции?». Вызов функции всегда присваивает значения всем параметрам, упомянутым в списке параметров, либо из позиционных аргументов, из ключевых аргументов, либо из значений по умолчанию. Если присутствует форма *identifier, то она инициализируется кортежем, которая получает любые избыточные позиционные параметры, по умолчанию — пустой кортеж. Если присутствует форма **identifier, то она инициализируется новым упорядоченным словарем, получающим любые избыточные ключевые аргументы, по умолчанию используется новый пустой словарь.

Параметры аргументов, следующие после * или *identifier являются параметрами только ключевых слов и могут быть переданы только в качестве ключевых аргументов (более подробно в разделе «Варианты передачи аргументов в функцию Python»).

Параметры могут иметь аннотацию типов в форме :expression после имени аргумента. Любой параметр может иметь аннотацию, даже в форме *identifier или **identifier. Функции могут иметь аннотацию возвращаемого значения в форме -> expression, которое следует после списка параметров. Эти аннотации могут быть любым допустимым выражением Python. Наличие аннотаций не меняет семантику функции. Значения аннотации доступны в виде значений словаря с ключами по именам параметров в атрибуте объекта функции __annotations__ и оцениваются при выполнении определения функции. Если используется импорт аннотаций из __future__, то аннотации сохраняются в виде строк во время выполнения, что позволяет отложить оценку. В этом случае аннотации могут оцениваться в другом порядке, чем они появляются в исходном коде.

Также возможно создавать анонимные функции (функции, не привязанные к имени) для немедленного использования в выражениях. Здесь используются лямбда-выражения, описанные в разделе «Анонимные функции (lambda-выражения) в Python».

Обратите внимание

, что лямбда-выражение — это просто сокращение для упрощенного определения функции. Функция, определенная в операторе def, может быть передана или присвоена другому имени, как функция, определенная лямбда-выражением. Форма def на самом деле более мощная, так как она позволяет выполнять несколько операторов и аннотаций.

Примечание для программиста: Функции Python — это объекты первого класса. Оператор def, выполняемый внутри определения функции, определяет локальную функцию, которая может быть возвращена или передана. Свободные переменные, используемые во вложенной функции, могут обращаться к локальным переменным функции, содержащей def. Подробнее смотрите в раздел Именование и привязка.

Так как функции в Python являются объектами первого класса, то значение имени функции имеет тип, который распознается интерпретатором как определяемая пользователем функция. Это значение может быть присвоено другому имени, которое затем может также использоваться как функция:

>>> fib
<function fib at 10042ed0>
>>> f = fib 
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
>>>

Исходя из других языков, можно возразить, что fib это не функция, а процедура, поскольку она не возвращает значение. На самом деле, даже функции без оператора return возвращают значение, хотя и довольно скучное. Это значение называется None (встроенное имя). Вывод значения None обычно подавляется интерпретатором, если это единственное возвращаемое значение. Вы можете увидеть это, используя команду print():

>>> fib(0)
>>> print(fib(0))
None
>>>

Функция, которая возвращает список чисел ряда Фибоначчи, вместо того, чтобы печатать его:

>>> def fib2(n):  # возврат ряда Фибоначчи до n
...      """Возвращает список, содержащий ряд Фибоначчи до n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # вызов функции
>>> f100
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>

Этот пример, демонстрирует некоторые новые возможности Python:

  • Оператор return возвращает значение из функции. return без аргумента возвращает None. Функции, у которых return не определен, также возвращает None.
  • Оператор result.append(a) вызывает метод объекта списка result. Метод — это функция, которая «принадлежит» объекту и имеет имя obj.methodname, где obj есть некоторый объект (может быть выражение), и methodname имя метода, которое определяется типом объекта. Разные типы определяют разные методы. Методы разных типов могут иметь одно и то же имя, не вызывая двусмысленности. Можно определить свои собственные типы объектов и методы, используя классы. Метод append(), показанный в примере, определен для объектов списка. Он добавляет новый элемент в конец списка.

Scoping — Кто с кем может общаться

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

Ваши ключевые выводы:

  • Локальная область означает, что переменные доступны только в кодовом блоке
  • Глобальная область означает, что переменные доступны везде
  • Неожиданное поведение может произойти с глобальными переменными
  • Не используйте глобальные переменные в коде
  • Сборка мусора помогает предотвратить утечку памяти

Давайте определим область видимости:

  • Это набор правил для определения того, какой код может взаимодействовать с другим кодом
  • Переменные имеют область действия
    • Глобальная область действия — каждый может читать и писать в переменную. WordPress использует множество глобальных переменных. Да, это означает, что какой-то фрагмент кода или плагин может перезаписать вашу глобальную переменную, что приведет к неожиданным результатам и ошибкам.
      Не используйте глобальные переменные в своем коде.
    • Локальная область действия — доступ ограничен блоком кода, в котором объявлена ​​переменная. Это область видимости переменных, которую вы должны использовать при написании кода.

Объявление переменной

Помните, что переменная представляет фактическое значение данных. Чтобы объявить переменную, вы сначала даете ей определяемое пользователем имя, а затем присваиваете ей значение. Присваивание называется инициализацией переменной. Мы называем это инициализацией, потому что мы устанавливаем начальное состояние для переменной.
pageName = 'FAQ'

Что происходит, когда вы объявляете переменную?

  1. вы даете ему имя
  2. вы выполняете присваивание или инициализируете переменную

В памяти определяемая пользователем переменная хранится в памяти или таблице символов, а затем указывает на ячейку памяти данных, которые она представляет.

Область действия переменной

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

Для переменных, указанных в вызове функции, таких как displayPage(pageName) , ячейка памяти данных передается в функцию (подпрограмму) и , а не сама переменная . При получении этого кода:

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode

Показать скрытые символы

pageName = ‘Часто задаваемые вопросы’
isPageLoaded = displayPage (имя_страницы)
// pageName в функции не совпадает
// как pageName в строке 2.
функция displayPage( pageName ) {
isPageLoaded = ложь
возврат isPageLoaded
}

просмотреть в исходном виде call-функции размещено на ❤ на GitHub

переменные pageName и isPageLoaded в строках 1 и 2 являются не теми же переменными что и в функции displayPage .

Почему? Они в разных масштабах.

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

Вызов пользовательских функций

В программах у вас есть имя функции (или подпрограммы), и вы можете передать ей ряд аргументов.
Что мы делаем в глобальной области действия следующего кода?

  1. мы инициализируем переменную isPageLoaded на
  2. вызов функции displayPage и
  3. передача displayPage адрес памяти из pageName переменная
  4. результат этой функции затем присваивается ispageLoaded переменная.

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode

Показать скрытые символы

// глобальная область
pageName = ‘Часто задаваемые вопросы’
isPageLoaded = displayPage (имя_страницы)
// локальная область
функция displayPage (имя_страницы) {
}

просмотреть в исходном виде cs0110-3. 9-а размещено на ❤ на GitHub

На шаге 3 выше, поскольку мы передаем только ячейку памяти , а не фактическую переменную, следующий код также будет работать. Вы заметили другое имя переменной, используемое в аргументах функции?

Этот файл содержит двунаправленный текст Unicode, который может быть интерпретирован или скомпилирован не так, как показано ниже. Для просмотра откройте файл в редакторе, который показывает скрытые символы Unicode. Узнайте больше о двунаправленных символах Unicode

Показать скрытые символы

// глобальная область
pageName = ‘Часто задаваемые вопросы’
isPageLoaded = displayPage (имя_страницы)
// локальная область
функция displayPage (otherPageName) {
}

просмотреть в исходном виде cs0110-3. 9-б размещено с помощью ❤ от GitHub

Подробнее о локальной и глобальной области действия

Любая переменная, используемая внутри функции, по умолчанию находится в локальной области действия этой функции. Ни другие функции, ни основная программа не могут получить доступ к этим локальным переменным. Они скрыты внутри функции. Когда эта функция заканчивается, или когда вы выходите из функции, дойдя до возвращает оператор , локальная переменная теряет область действия. В этот момент сборка мусора освобождает эту область памяти. Если эта функция будет вызвана снова, будет выделена новая память для хранения значения локальной переменной.

Это означает, что глобальная переменная может существовать в глобальной области видимости, а переменная с таким же именем может быть объявлена ​​в локальной области видимости функции или подпрограммы. Глобальная переменная и локальная переменная не являются одной и той же переменной. Они не указывают на одно и то же место в памяти.

Функция живет в своем маленьком мире. Он может «видеть» только то, что находится внутри себя, поэтому он не знает ни о каких глобальных переменных. Однако вы можете сделать функцию осведомленной о глобальных переменных. Вы делаете это, явно объявляя внутри этой функции, что переменная функции указывает на глобальную переменную.

[короткий код optin-monster]

Эпизод #13