Что такое функция? 7 класс онлайн-подготовка на Ростелеком Лицей
Отношения между объектами
Любой объект (стул, стол, собака, человек) может быть предметом исследования. Но исследовать можно не только сами объекты, но и отношения между ними. Мы часто рассуждаем об отношениях между людьми – дружбе, ненависти, любви. На них непосредственно нельзя указать, они неосязаемы, но вместе с тем мы говорим о них, описываем, прекрасно друг друга понимаем, когда слышим: «Петя дружит с Васей».
В жизни мы вводим отношения не только между людьми. Например, на карте есть два города A и Б – это два объекта. А расстояние между A и Б – это отношение между ними. На него уже нельзя указать пальцем. Или фраза: «Плед лежит на стуле». Плед и стул – это объекты, а вот «лежит на» – это уже отношение между пледом и стулом. Оказывается, мы можем изучать не только сами объекты, но и отношения между ними. Этим мы сейчас и займёмся.
Определение функции
У каждого человека есть размер обуви. Людей очень много, а размеров обуви мало. Если с одной стороны отметить всех людей (например, в виде точек), а с другой – существующие размеры обуви, то можно от каждой точки провести стрелку к одному из размеров обуви (Рис. 1) (в математике используют такую терминологию: можно отобразить множество людей на множество размеров обуви). Или, говоря по-другому, между этими множествами можно установить соответствие.
Рис. 1. Отображение множества людей на множество размеров обуви
Можно установить и обратное соответствие: каждый размер обуви есть у некоторого подмножества людей (Рис. 2).
Рис. 2. Отображение множества размеров обуви на множество людей
Другой пример: обычные часы. Каждому времени суток соответствует какое-то определённое положение стрелок на этих часах. И, наоборот, каждое положение стрелок соответствует какому-то времени суток. Обратите внимание: во всех примерах мы рассматриваем не сами объекты (люди и обувь, время суток и стрелки часов), а новое понятие – отношение между объектами.
Итак, как видим, примеров разных отношений очень много. А как говорить о них точно? Все ли нужно изучать? И как это делать? Все отношения задают между множествами какое-то соответствие. Некоторые из соответствий особенные, они каждому элементу из одного множества ставят в соответствие ровно один элемент из другого множества. Такие соответствия, которые называются функциями, мы и будем изучать.
В наших примерах: у человека может быть только один размер обуви, каждому времени суток соответствует только одно положение стрелок на часах. А вот, например, 36 размер обуви может быть у большого количества людей. Поэтому такие соответствия функциями не будут.
Дадим строгое определение функции. Функция – это соответствие между двумя множествами такое, что каждому элементу одного множества ставится в соответствие единственный элемент другого множества . Первое множество называют областью определения функции, а второе – областью значений функции. Обозначают: и соответственно.
Пример 1: задана функция, которая ставит в соответствие каждому человеку размер его обуви. Область определения функции – множество людей, область значений функции – множество размеров обуви.
Пример 2: задана функция, которая ставит в соответствие каждому дню месяца среднюю температуру воздуха. Область определения функции – множество дней месяца, область значений функции – множество температур (Рис. 3).
Рис. 3. Соответствие между днями месяца и средней температурой воздуха
Числовая функция
В математике мы чаще будем работать с одним из видов функций – числовыми функциями. Числовая функция – это функция, областью определения и областью значений которой являются числовые множества. Например, функция пройденного пути в зависимости от времени (при равномерном движении): . Такая функция является числовой.
Числовые функции можно задавать разными способами.
- Словесный.
- Аналитический.
- Графический.
- Табличный.
В рассмотренном выше примере мы задали функцию с помощью формулы, такое способ задания называется аналитическим. Рассмотрим другой пример. Каждому числу поставим в соответствие его квадрат. Это функция. На самом деле это будет функция площади квадрата в зависимости от длины его стороны: (если мы оговорим, что ).
Мы будем изучать различные числовые функции. Что вообще можно в них изучать? У функций могут быть наибольшие и наименьшие значения – максимумы и минимумы, функции могут возрастать и убывать и т.д. Все эти свойства функций помогают решать конкретные прикладные задачи (например, нахождение оптимальных параметров, при которых та или иная величина достигает своего максимума – доход, эффективность и т.д., или минимума – расход, количество ошибок и т.д.). Но для того чтобы решать задачи, нужно выделить общие свойства функций и изучить их.
Повторим рассуждение, которое уже озвучивали в наших уроках. Есть заводы, которые создают различные инструменты. А дальше каждый сам использует созданные инструменты в своих целях: с помощью отвёртки можно закручивать и откручивать винты и шурупы, но можно ею же пытаться открыть дверь или забить гвозди. Так и математика – завод инструментальный, создаёт различные инструменты, которые потом могут использоваться в физике, экономике и других сферах для решения конкретных прикладных задач.
Естественные области определения и значений
В примере с площадью квадрата мы сказали, что . Т.е. наложили некоторое ограничение на область определения функции: . Получается, что и – это две различные функции? Да, именно так, потому что первая функция определена при неположительных значениях переменной (Рис. 1), а вторая – нет (Рис. 2).
Рис. 1. График функции
Рис. 2. График функции
То есть для задания функции, вообще говоря, недостаточно просто задать формулу соответствия. Необходимо ещё указать области определения и значений функции. Но чаще всего этого не делают, предполагая, что они естественные. Естественная область определения при аналитическом задании – это область допустимых значений выражения, которое записано в формуле.
Пример 1.
Область определения:
Записывают так:
Пример 2.
Область определения:
Отсюда:
Естественная область значений – это множество значений, которые может принимать функция. Например, естественная область значений функции – это все числа больше либо равные . Записывают так:
Графический способ задания функции
Анализировать функцию иногда легче, если построен её график. По нему часто легко определить, на каких промежутках функция убывает или возрастает, где у неё максимум и минимум и т.д. Таким образом, у графического способа задания функции (задание функции с помощью графика) и аналитического разные цели. Если сказать грубо, то аналитический способ более точный, он позволяет вычислить значение функции в любой точке и выполнять с функцией различные преобразования. Графический способ более наглядный – по графику можно сделать вывод о тех или иных свойствах функции.
Рассмотрим графический способ подробнее. График функции представляет собой совокупность точек , где и – соответствующие значения из областей определения и значений (Рис. 4).
Рис. 4. График функции
График задает соответствие между множествами и или – что то же самое – задает функцию. При этом для изображения необходимо задать соответствующую систему координат. Чаще всего мы будем использовать декартову систему координат.
Область определения и область значений функции при графическом задании функции
Рассмотрим функцию, заданную следующим графическим образом (Рис.1).
Рис. 1. График функции
Область определения функции – это все значения, при которых определена функция.
Рис. 2. Область определения рассматриваемой функции
Область значений функции – это все значения , которые принимает функция.
Для рассматриваемой функции область значений функции – это все числа от до включительно (см. рис. 3):
Рис. 3. Область значений рассматриваемой функции
Если строго, то область определения функции – это проекция графика на ось абсцисс, а область значений функции – проекция графика на ось ординат. Проекция – понятие, которое нам знакомо из геометрии. Слово неслучайно созвучно со словом прожектор (оба от латинского projectio – «бросание вперёд») Если мы посветим на график функции прожектором следующим образом, то тень, которую мы увидим на экране, – это проекция графика на ось , т.е. область значений функции (Рис. 4).
Рис. 4. Проекция графика на ось
Аналогично тень на будет проекцией графика на ось (Рис. 5), т.е. область определения функции.
Рис. 5. Проекция графика на ось
Словесный и табличный способы задания
Любую функцию можно задать различными способами. Рассмотрим на примере конкретной функции. Словесный способ: функция, которая ставит в соответствие каждому числу его квадрат. Табличный способ: при задании табличным способом указываются пары соответствующих значений.
При таком задании функции область определения функции и область задания функции – это множество значений переменных, которые указаны в таблице:
Аналитический способ: с помощью формулы: . Графический способ задания функции (Рис. 1).
Рис. 1. Графический способ задания функции
Линейные функции
Для задания числовых функций мы чаще всего будем использовать аналитический и графический методы, т. к. при использовании этих методов легче изучать свойства функций. Различные свойства функции мы будем изучать на протяжении всего курса алгебры, а сейчас рассмотрим несколько частных случаев функций. Вернемся к функции пройденного пути при равномерном движении, т.е. , где – путь, – скорость, – время. Например, при скорости получим функцию . Если , то , если , то , если , то . Мы видим, что при одинаковом изменении аргумента , у нас одинаковое изменение значения функции – пройденного пути . Функции, обладающие таким свойством,называются линейными, в общем виде их можно записать так: . Графиком таких функций будет прямая. Пример линейной функции: пусть . Построим график этой функции. Нарисуем таблицу и заполним ее, т.е. при двух разных значениях найдем, чему равен . И по полученным значениям построим прямую на координатной плоскости.
Итак, точки принадлежат графику функции. Отметим эти точки на плоскости и проведем через них прямую (Рис. 5).
Рис. 5. График линейной функции
Эта прямая и является графиком функции . Обратим внимание, что для построения графика линейной функции нам достаточно двух точек. Это связано с тем, что мы знаем: графиком будет прямая, а любая прямая на плоскости однозначно задаётся по двум точкам.
Нелинейные функции
Естественно, не все функции линейные. Например, мы знаем, что площадь квадрата зависит от его стороны следующим образом: . Попробуем приблизительно построить ее график по точкам. Поскольку сторона квадрата больше 0, то . Значит, точка не принадлежит графику функции (точку «выкалывают», на графике обводят в кружок).
Снова нарисуем таблицу, возьмем некоторые значения и найдем значения при этих фиксированных значениях .
Нарисуем эти точки на плоскости и посмотрим, какая линия через них проходит (Рис. 6).
Рис. 6. График нелинейной функции
Данная функция уже не является линейной, так как при увеличении на 1, увеличивался на разные величины, в зависимости от начального значения переменной .
Такие функции называются нелинейными. Рассмотренная функция является примером квадратичной функции.Сторона квадрата не может быть отрицательной или равной 0, поэтому обобщим и построим график функции для любых значений аргумента. Построим график данной функции по точкам. Снова нарисуем таблицу, заполним ее разными значениями и посчитаем, чему равен при каждом из этих значений .
Отметим эти точки на плоскости и проведем кривую, которая проходит через них (Рис. 7). Полученный график называют параболой.
Рис. 7. График квадратичной функции
В общем виде квадратичная функция записывается так: , где – некоторые числа, .
Другие примеры нелинейных функций
Если рассмотреть зависимость времени на преодоление заданного расстояния в зависимости от скорости, то получим пример еще одного вида функций – обратной пропорциональности. Например, если расстояние между двумя городами равно , то , где – время, – это скорость (Рис.
Рис. 1. График обратной пропорциональности
Рассмотрим, как выглядит график в общем виде (для любых допустимых значений аргумента). Функция имеет следующий вид: . Рассмотрим графики функции при и (Рис. 2).
Рис. 2. Графики функции при и
Рассмотрим ещё один пример. Объем куба зависит от его стороны: . Такая функция называется кубической (). Попробуем приблизительно построить ее график по точкам (Рис. 3).
Рис. 3. График функции
Сторона куба не может быть отрицательной или равной , поэтому обобщим и построим график функции для любых значений аргумента (Рис. 4).
Рис. 4. График функции
Заключение
На этом уроке мы познакомились с понятием функция (отношение между множествами объектов).
Для того чтобы определить функцию, необходимо задать три вещи: область определения функции , область значений функции , правило, по которому каждому элементу из первого множества ставится в соответствие единственный элемент второго (Рис. 8).
Рис. 8. Вещи, необходимые для определения функции
Основные способы задания функции: аналитический, графический, словесный, табличный. На уроках математики мы чаще всего будем обращаться к аналитическому и графическому способам. На следующем уроке мы более подробно изучим свойства одного типа функций, а именно: линейной функции.
Список рекомендованной литературы
- Никольский С.М., Решетников Н.Н., Потапов М.К., Шевкин А.В. Алгебра. 7 класс. Учебник. ФГОС, издательство «Просвещение», 2017.
- Дорофеев Г.В., Суворова С.Б., Бунимович Е.А. Алгебра. 7 класс. Учебник, издательство «Просвещение», 2014.
- Макарычев Ю.Н., Миндюк Н.Г., Нешков К.И., Суворова С.Б. Алгебра. 7 класс. Учебник, издательство «Просвещение», 2013
Рекомендованные ссылки на ресурсы сети Интернет
1. Интернет-портал «ege-study.ru» (Источник)
2. Интернет-портал «math-prosto. ru» (Источник)
3. Интернет-портал «algebraclass.ru» (Источник)
Домашнее задание
1. Площадь прямоугольника со сторонами см и см равна . Выразить формулой зависимость от . Для значения аргумента найти соответствующее значение функции .
2. Функция задана формулой . Найти значение функции, соответствующее значению аргумента, равному .
3. Найти область определения функции: .
ФУНКЦИЯ • Большая российская энциклопедия
ФУ́НКЦИЯ (от лат. functio – исполнение, осуществление), одно из основных понятий математики, означающее зависимость одних переменных величин от других. Слово «величина» в этом определении понимается в самом широком смысле: это может быть именованное число, отвлечённое число (действительное или комплексное), неск. чисел (т. е. точка пространства) и вообще элемент любого множества.
Действительная функция одного действительного переменного
В простейшем случае, когда величина – действительное число, понятие «Ф. » определяется следующим образом. Пусть каждому числу $x$ из заданного множества $E$ поставлено в соответствие число $y$, обозначаемое $y=f(x)$ (читается «игрек равен эф от икс»). Тогда говорят, что на множестве $E$ задана функция $y=f(x)$, $x∈E$. При этом употребляются следующие термины: $x$ – независимое переменное, или аргумент; $y$ – зависимое переменное, или функция; $E$ – множество значений, которые может принимать $x$, – область определения, или область задания Ф. (областью определения Ф. может быть множество всех действительных чисел, интервал, отрезок и т. п.). Слова «поставлено в соответствие» означают, что указан определённый способ, по которому для каждого $x∈E$ находится значение $y=f(x)$. Этот способ в данном случае обозначен символом $f$. Для обозначения Ф. применяются и др. буквы, напр. $y=g(x)$, $y=F(x)$, $s=h(t)$, $v=φ(s)$. {2m}.$$
Графический способ задания функции
Распространён графич. способ задания Ф. Графиком Ф. $y=f(x)$, $y∈E$, называется множество точек плоскости с прямоугольными координатами $(x,y)$, где $x∈E$, $y=f(x)$. Графич. способ задания Ф. широко применяется на практике. Так, мн. процессы изменения одной величины в зависимости от другой исследуются с помощью кривых, записанных с помощью самопишущих приборов. Хотя график Ф. и не даёт возможности точного определения численных значений $x$ и $y$, он наглядно отражает качественное поведение Ф. (непрерывность, монотонность, максимумы и минимумы, точки перегиба и т. д.) и поэтому является важным средством исследования функции.
Табличный способ задания функции
При табличном способе задания Ф. задаётся в виде таблицы, в которой для каждого значения аргумента указывается соответствующее ему значение Ф. Такой способ задания Ф. часто применяется в тех случаях, когда область определения состоит из конечного числа значений.
Действительная функция нескольких действительных переменных
Ф. от двух переменных определяется следующим образом. Рассматривается множество $E$ упорядоченных пар чисел $(x,y)$. Если каждой паре $(x,y)∈E$ поставлено в соответствие действительное число $z$, то говорят, что на множестве $E$ определена Ф. $z=f(x,y)$ от двух переменных $x$ и $y$. Т. к. каждой паре чисел $(x,y)$ соответствует на плоскости точка с координатами $(x,y)$, то Ф. $f(x,y)$ задана на множестве $E$ точек плоскости. График Ф. $z=f(x,y)$ можно изобразить в трёхмерном пространстве, где задана прямоугольная система координат $(x,y,z)$, в виде множества точек $(x,y,f(x,y))$, проекции которых на плоскость $(x,y)$ принадлежат множеству $E$. Напр., график функции $z=\sqrt{1-x^2-y^2},$ $x^2+y^2 ⩽ 1$, и имеется в виду арифметич. корень, изображается верхней половиной шаровой поверхности радиуса 1 с центром в начале координат.
Аналогично можно рассматривать множество $E$, состоящее из упорядоченных систем $(x_1,x_2,…,x_n)$ из $n$ чисел, и Ф. $z=f(x_1,x_2,…,x_n)$ от $n$ переменных, определённую на множестве $E$.
Общее понятие функции
Пусть заданы множества $E$ и $E_1$ элементов любой природы и пусть каждому элементу $x∈E$ поставлен в соответствие элемент $y∈E_1$, обозначаемый $y=f(x)$. Тогда говорят, что задана функция $y=f(x)$, $x∈E$, что часто записывается как $f:\,E→E_1$.
Принята следующая терминология: $x$ – независимое переменное, или аргумент; $E$ – область определения Ф., каждый элемент $x∈E$ – значение аргумента; $y$ – зависимое переменное, или Ф., от аргумента $x$; $E_1$ – область значений Ф., каждый элемент $y∈E_1$ такой, что $y=f(x)$ для некоторого значения $x∈E$, называется значением функции. 2}$ отображает отрезок $–1 ⩽ x ⩽ 1$ на отрезок $0 ⩽ y ⩽ 1$.
Для Ф. $f(x)$ и $g(x)$ естественным образом определяются арифметич. операции: это Ф., принимающие (в тех случаях, когда это имеет смысл) значения $f(x)±g(x)$, $f(x)g(x)$, $f(x)/g(x)$.
Термин «Ф.» чаще всего используется только для обозначения числовой Ф. от одного или нескольких переменных (действительных или комплексных). В др. случаях, как правило, используются спец. термины: оператор, отображение, преобразование, функционал.
См. также Монотонная функция, Непрерывная функция, Периодическая функция, Специальные функции, Чётные и нечётные функции, Элементарные функции.
Исторический очерк
Как и остальные понятия математики, понятие Ф. сложилось не сразу, а прошло долгий путь развития. По существу, речь о функциональной зависимости и её графич. изображении идёт в работе П. Ферма «Введение и изучение плоских и телесных мест» (1636, опубл. в 1679). Изучение линий по их уравнениям в «Геометрии» Р. Декарта (1637) также указывает на ясное представление о взаимной зависимости двух переменных величин. У англ. математика И. Барроу («Лекции по геометрии», 1670) в геометрич. форме устанавливается взаимная обратность действий дифференцирования и интегрирования (разумеется, без употребления самих этих терминов). Это свидетельствует о совершенно отчётливом владении понятием Ф. В геометрич. и механич. виде это понятие можно найти и у И. Ньютона. Однако термин «Ф.» впервые появляется лишь в 1692 у Г. Лейбница, и притом не совсем в современном его понимании. Лейбниц называет Ф. разл. отрезки, связанные с к.-л. кривой, напр. абсциссы её точек. В первом печатном курсе «Анализа бесконечно малых» франц. математика Г. Лопиталя (1696) термин «Ф. » не употребляется.
Первое определение Ф. в смысле, близком к современному, встречается у И. Бернулли (1718): «Функция – это величина, составленная из переменной и постоянной». В основе этого не вполне отчётливого определения лежит идея задания Ф. аналитич. формулой. Та же идея выступает и в определении Л. Эйлера, данном им во «Введении в анализ бесконечных» (1748): «Функция переменного количества есть аналитическое выражение, составленное каким-либо образом из этого переменного количества и чисел или постоянных количеств». На протяжении 18 в. отсутствовало достаточно ясное понимание различия между Ф. и её аналитич. выражением. С нач. 19 в. уже всё чаще и чаще определяют понятие Ф. без упоминания о её аналитич. выражении. Такие определения встречаются в работах Ж. Фурье (1822), Д. Дирихле (1829, 1837), Н. И. Лобачевского (1834). Так сложилось совр. понятие Ф., свободное от упоминания о её аналитич. задании.
Flow & Scope • Программа Hello World
Интерпретатор Python читает программу точно так же, как вы читаете эту страницу: по одной строке, слева направо и сверху вниз. Интерпретатор выполняет операции и функции в том порядке, в котором он их встречает. Это называется потоком управления или потоком выполнения . В отличие от интерпретатора Python, когда мы что-то читаем и сталкиваемся со словом, которое не понимаем, мы не сходим с ума и не отключаемся (обычно). Мы продолжаем читать и либо угадываем определение слова, исходя из контекста, либо делаем паузу и сверяемся со словарем. Интерпретатор Python не такой гибкий. Вы не можете вызвать функцию до ее определения. Интерпретатор должен знать, что это за функция и что она делает до встречает эту функцию.
Написание функций Python: Flow
Например, следующая программа, too_soon.py:
too_soon() защита слишком_скоро(): print("Не ставить тележку перед трубкозубом")
… вернет эту ошибку:
Трассировка (последний последний вызов): Файл "too_soon. py", строка 1, вслишком_скоро() NameError: имя 'too_soon' не определено
Когда мы вызываем функцию, она считывает наши аргументы по одному слева направо. Затем он обрабатывает значения аргументов и по завершении возвращает значение. Попробуйте следующее в программе под названием flow.py: 9))
В приведенном выше примере, несмотря на то, что мы передали сначала переменную «слева», наша функция сначала напечатала «справа», потому что именно в этом порядке мы ее вызывали.
Написание функций Python: Область применения
Представьте, что ваша программа Python — это мир ( Hello World ), а ваша функция — это ваша группа друзей. Одним из соглашений программирования является объявление переменных в верхней части вашей программы. Эти переменные глобальные . Любые переменные, объявленные внутри функции, равны местный . Глобальные переменные доступны внутри или вне функции, но локальные переменные доступны только внутри функции, в которой они объявлены. Глобальные переменные подобны новостям или общеизвестным фактам: все знают имя президента США. Локальные переменные подобны секретам и внутренним шуткам: их понимаете только вы и ваши друзья; остальной мир понятия не имеет, о чем вы говорите. Это называется прицелом . Переменная, доступная любой функции в программе, имеет глобальная область . Переменная, доступная только внутри функции, имеет локальную область видимости . Давайте напишем программу, inventory.py:
global_variable = "Сегодня 4 августа." вечеринка защиты(): local_variable = «Сегодня мой день рождения!» печать (глобальная_переменная) печать (локальная_переменная) вечеринка() печать (глобальная_переменная) print(local_variable)
Это вернет следующую ошибку:
Traceback (последний вызов последний): Файл "invitation.py", строка 10, впечать (локальная_переменная) NameError: имя «local_variable» не определено
Измените строку 10 на что-нибудь забавное и снова запустите программу:
global_variable = «Сегодня 4 августа». вечеринка защиты(): local_variable = «Сегодня мой день рождения!» печать (глобальная_переменная) печать (локальная_переменная) вечеринка() печать (глобальная_переменная) print("Это моя вечеринка, и я высушу, если захочу...")
Когда я вызываю функцию party(), мои друзья знают, что сегодня и 4 августа, и мой день рождения. Вызов глобальной переменной вне функции party возвращает дату, 4 августа, потому что у всех есть доступ к дате. Но вызов локальной переменной вне функции party() возвращает ошибку, потому что никто за пределами функции party() не знает, что у меня день рождения.
Говоря о вечеринке, в следующей главе будет торт.
Программирование на Lua: 6.1
Программирование на Lua: 6.1 Это первое издание было написано для Lua 5.0. Несмотря на то, что они по-прежнему актуальны для более поздних версий, есть некоторые отличия.
Четвертое издание предназначено для Lua 5.3 и доступно на Amazon и в других книжных магазинах.
Покупая книгу, вы также помогаете проекту Lua.
Программирование на Луа | ||
Часть I. Язык Глава 6. Дополнительные сведения о функциях |
Когда функция записывается внутри другой функции, он имеет полный доступ к локальным переменным из объемлющей функции; эта функция называется лексической областью видимости . Хотя это может показаться очевидным, это не так. Лексическая область видимости плюс первоклассные функции, мощная концепция языка программирования, но немногие языки поддерживают эту концепцию.
Начнем с простого примера. Предположим, у вас есть список имен учеников. и таблица, которая связывает имена с оценками; вы хотите отсортировать список имен, в соответствии с их оценками (сначала более высокие оценки). Вы можете выполнить это задание следующим образом:
имена = {"Петр", "Павел", "Мария"} оценки = {Мэри = 10, Пол = 7, Питер = 8} table. sort (имена, функция (n1, n2) вернуть оценки[n1] > оценки[n2] -- сравнить оценки конец)Теперь предположим, что вы хотите создать функцию для выполнения этой задачи:
функция sortbygrade (имена, оценки) table.sort (имена, функция (n1, n2) вернуть оценки[n1] > оценки[n2] -- сравнить оценки конец) конецИнтересным моментом в примере является то, что анонимная функция, данная
вроде
обращается к параметру классов
,
который является локальным для включающей функции sortbygrade
.
Внутри этой анонимной функции оценок
не является ни глобальной, ни локальной переменной.
Мы называем это внешней локальной переменной ,
или upvalue .
(Термин «повышенная стоимость» немного вводит в заблуждение,
потому что оценивает
как переменную, а не значение.
Однако этот термин имеет исторические корни в Lua.
и это короче, чем «внешняя локальная переменная».)Почему это так интересно? Потому что функции являются первоклассными значениями. Рассмотрим следующий код:
функция новыйСчетчик() местный я = 0 функция возврата () -- анонимная функция я = я + 1 вернуть я конец конец c1 = новыйСчетчик() печать (c1()) --> 1 печать (с1()) --> 2Теперь анонимная функция использует upvalue,
i
,
сохранить свой счетчик.
Однако к тому времени, когда мы вызовем анонимную функцию, и
уже за рамками,
потому что функция, которая создала эту переменную
( newCounter
) вернулся.
Тем не менее, Lua правильно обрабатывает эту ситуацию,
используя концепцию закрытия .
Проще говоря, замыкание — это функция плюс все
должен правильно получить доступ к своим значениям.
Если мы снова вызовем newCounter
,
он создаст новую локальную переменную i
,
так что мы получим новое закрытие,
воздействуя на эту новую переменную:c2 = новыйСчетчик() печать (с2()) --> 1 печать (с1()) --> 3 печать (c2()) --> 2Итак,
c1
и c2
— разные замыкания
над той же функцией
и каждый действует независимо
создание локальной переменной i
. С технической точки зрения, ценностью в Lua является замыкание,
не та функция.
Сама функция — это всего лишь прототип замыканий.
Тем не менее, мы будем продолжать использовать термин «функция» для
ссылайтесь на закрытие всякий раз, когда нет возможности путаницы. Замыкания являются ценным инструментом во многих контекстах.
Как мы видели,
они полезны в качестве аргументов для функций более высокого порядка
например вроде
.
Замыкания полезны для функций, которые строят другие функции.
как наш пример newCounter
;
этот механизм позволяет программам Lua включать
причудливые техники программирования из функционального мира.
Замыкания также полезны для функций обратного вызова .
Типичный пример здесь происходит
когда вы создаете кнопки в типичном наборе инструментов GUI.
Каждая кнопка имеет функцию обратного вызова для вызова
когда пользователь нажимает кнопку;
вы хотите, чтобы разные кнопки выполняли разные действия при нажатии.
Например, цифровому калькулятору нужно десять одинаковых кнопок,
по одному на каждую цифру. Вы можете создать каждый из них с функцией, подобной следующей:
функция digitButton (цифра) Кнопка возврата {метка = цифра, действие = функция () add_to_display(цифра) конец } конецВ этом примере мы предполагаем, что
Кнопка
является функцией набора инструментов.
который создает новые кнопки;
метка
— метка кнопки;
а действие
— это функция обратного вызова
вызываться при нажатии кнопки.
(На самом деле это закрытие,
потому что он обращается к upvalue цифра
.)
Функция обратного вызова может быть вызвана
долгое время после digitButton
выполняла свою задачу и
после того, как локальная переменная цифра
вышла из области видимости,
но он все еще может получить доступ к этой переменной. Затворы ценны также в
совсем другой контекст.
Поскольку функции хранятся в обычных переменных,
мы можем легко переопределить функции в Lua,
даже предопределенные функции. Это средство — одна из причин, по которой Lua такой гибкий.
Однако часто, когда вы переопределяете функцию, вам нужно
исходная функция в новой реализации.
Например, предположим, что вы хотите переопределить функцию грех
до
работают в градусах, а не в радианах.
Эта новая функция должна преобразовать свой аргумент,
а затем вызовите исходную функцию sin
, чтобы выполнить реальную работу.
Ваш код может выглядеть так
старый грех = math.sin math.sin = функция (х) вернуть oldSin(x*math.pi/180) конецБолее чистый способ сделать это выглядит следующим образом:
делать локальный oldSin = math.sin местное k = math.pi/180 math.sin = функция (х) вернуть старый грех (х * к) конец конецТеперь мы храним старую версию в приватной переменной; единственный способ получить к нему доступ через новую версию.
Вы можете использовать эту же функцию для создания безопасных сред,
также называется песочницей . Безопасная среда необходима при запуске ненадежного кода,
Например, код, полученный сервером через Интернет.
Например, чтобы ограничить файлы, к которым может получить доступ программа,
мы можем переопределить функцию open
(из библиотеки io
) с использованием замыканий:
делать локальный oldOpen = io.open io.open = функция (имя файла, режим) если access_OK(имя файла, режим) то вернуть oldOpen(имя файла, режим) еще вернуть nil, "доступ запрещен" конец конец конецЧем хорош этот пример, так это тем, что после такого переопределения программа не может вызвать неограниченный
открытый
,
кроме как через новую ограниченную версию.
Он сохраняет небезопасную версию как закрытую переменную в замыкании,
недоступен извне.
С помощью этого средства вы можете создавать песочницы Lua в самом Lua,
с обычным преимуществом: гибкостью.
Вместо универсального решения,
Lua предлагает вам метамеханизм,
так что вы можете адаптировать свою среду для ваших конкретных потребностей безопасности.