Урок 6. Функции. Локальные переменные. - Форум
W4Tweaks
Меню сайта
Последние файлы
Последние темы


Вход



Мини-чат
 
500

Статистика
Онлайн:

Сегодня заходили: firsacho, Joker, 4erveR, Unaited


Друзья сайта

Если вы хотите увидеть в этом спиcке свой сайт загляните сюда

Наш баннер:



· Регистрация · Вход
[ Новые сообщения · Участники · Подписки · Поиск · RSS ]
Страница 1 из 11
Форум » Worms 4 Mayhem » 5.1. Уроки Lua » Урок 6. Функции. Локальные переменные. (О функциях. Некоторые хитроумные особенности.)
Урок 6. Функции. Локальные переменные.
Герыч
Дата: СБ, 15.01.2011, 12:10:32 | Сообщение # 1
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Итак, на данный момент мы уже умеем работать с переменными и знаем, что у них есть типы (nil, boolean, number, string, function, userdata, thread, table).
В прошлом уроке мы узнали, что такое таблицы (table), и узнали пару функций для работы с ними.
Первые четыре типа мы уже знаем из третьего урока.
Единственный тип, о котором я ещё вам не рассказал, но хочу - это функция(function).

Страшное пожалуй название "функция"... Но вы не пугайтесь, это всего лишь название =)
Я не буду рассказывать, что такое функция в математике(всякие там параболы и синусы), сдались они нам сейчас?
Скажу лучше, что это.
Функция в lua - это какая-то последовательность действий, у которой есть своё название.
Не воспринимайте это, как точное определение.

Представьте, что перед нами стоит задача написать на экране сумму, разность, произведение и частное двух чисел a и b. Её можно решить очень просто:

Code
a = 10
b = 2
print(a + b)
print(a - b)
print(a * b)
print(a / b)

Теперь вдруг кроме чисел a и b надо написать то же самое для чисел c и d. Решаем аналогично

Code
c = 5
d = 7
a = 10
b = 2

print(a + b)
print(a - b)
print(a * b)
print(a / b)

print(c + d)
print(c - d)
print(c * d)
print(c / d)

А теперь вдруг понадобилось сделать это для a и b, для a и c, для a и d, для b и c, для b и d, для c и d.
Пересилю свою лень и напишу решение:

Code
a = 10
b = 2
c = 5
d = 7

print(a + b)
print(a - b)
print(a * b)
print(a / b)

print(a + c)
print(a - c)
print(a * c)
print(a / c)

print(a + d)
print(a - d)
print(a * d)
print(a / d)

print(b + c)
print(b - c)
print(b * c)
print(b / c)

print(b + d)
print(b - d)
print(b * d)
print(b / d)

print(c + d)
print(c - d)
print(c * d)
print(c / d)

Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.

Покажу на примере, как они облегчат жизнь:

Code
function arifmetika(x, y)
   print(x + y)
   print(x - y)
   print(x * y)
   print(x / y)
end

a = 10
b = 2
c = 5
d = 7

arifmetika(a, b)
arifmetika(a, c)
arifmetika(a, d)
arifmetika(b, c)
arifmetika(b, d)
arifmetika(c, d)

Отлично выглядит по сравнению с прошлым кодом? А делает те же действия)

Всё легко - мы взяли и назвали 4 строчки кода словом арифметика, а потом вместо дублирования этих строк кода поставили их имя.

Теперь более формально. Функция описывается вот так:

Code
function имя_функции(параметры_через_запятую)
   код_функции
end

После того, как функция описана, можно её вызывать, то есть писать arifmetika(a, b), подставляя в неё параметры.
При этом выполнится код функции, с учётом, что вместо x подставлено значение a, то есть 10, а вместо y подставлено значение b, то есть 2.

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

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

Code
function parabola(x)
   return 2*x^2+3*x+8
end

y = parabola(2)
print(y)

Этот код выведет на экран число 22.
Всё очень просто: наша Функция вернула 22 наружу и это значение записалось в y.

Чтобы вернуть результат функции используется слово return c возвращаемым значением.
При этом функция завершает свою работу.
Если значение отсутствует, то функция просто завершает свою работу.

Пример:

Code
function test()
   print(1)
   return
   print(2)
end

test()

На экран будет выведено только 1, потому что до строки print(2) выполнение не дойдёт.

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

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

Code
function format_time(h,m,s)
   return h..":"..m..":"..s;
end

print(format_time(10,12,48))

Эта функция распечатает на экране 10:12:48.

В lua есть чудесная возможность - писать в одной строке сразу два присваивания, смотрите:

Code
a, b = 2, 3

print(a)
print(b)

Пример выведет сначала 2, потом 3. В первой строке мы присвоили a первое значение, то есть 2, а переменной b - второе, то есть 3.
Можно писать после равно не только числа но и любые значения или переменные, в частности это можно использовать, чтобы обменять два значения:

Code
a, b = 2, 3

print(a)
print(b)

a, b = b, a

print(a)
print(b)

Тут выведется сначала 2 и 3, а потом, после обмена 3 и 2. Удобно..)

К чему я это всё? А к тому, что функция может возвращать не одно, а 2 значения, смотрите:

Code
function test()
   return 2, 3
end

a, b = test()

print(a)
print(b)

Результат примера аналогичен первому.

А это можно использовать, чтобы вычислить сразу 2 функции с помощью одной:

Code
function sincos(x)
   return math.sin(x), math.cos(x)
end

s, c = sincos(1.2)

print(s)
print(c)

Тут переменная s станет синусом 1.2, а переменная c - косинусом 1.2

Так, теперь ещё одна особенность работы с функциями.
Посмотрите на этот код:

Code
function test()
   a = 10
   b = 20
   return a + b
end

a = 15
b = 22

print(a)
print(b)

print(test())

print(a)
print(b)

Пример напечатает:

Code
15
22
30
10
20

Как видите, после работы функции test переменные a и b снаружи функции изменились.
Это называют Функцией с обратным эффектом. То есть функция возвращает какое-то значение (a + b), но снаружи при этом что-то ещё меняется.
Иногда это делать не надо. В данном примере, чтобы найти сумму 10 и 20 нам не надо использовать внешние переменные.
Поэтому придумали локальные переменные, которые видны только внутри функции.
Объявляется локальная переменная так же как и обычная, но с ключевым словом local:

Code
function test()
   local a = 10
   local b = 20
   return a + b
end

a = 15
b = 22

print(a)
print(b)

print(test())

print(a)
print(b)

В этом примере внешние переменные a и b не изменятся, и на экране появится

Code
15
22
30
15
22

Отлично, с этим разобрались.

Теперь немного посложнее. Помните список типов переменных lua? Один из них function.
Что же это значит? А это значит, что в переменной мы можем хранить функцию!
Смотрите, сейчас переделаю прошлый пример:

Code
function sincos(x)
   return math.sin(x), math.cos(x)
end

sc = sincos

s, c = sc(1.2)

print(s)
print(c)

Тут в переменную sc я записал функцию sincos.
Важно, что записи sc = sincos и sc = sincos() означают разное.
Первая запись - это записать в sc функцию sincos, вторая значит вызвать sincos() без параметров и записать в sc результат. Не путайте!

Если написать в последнем примере print(type(sc)), то на экране будет выведено слово function.
Это значит, что у sc тип данных function. Во как)

А что, если попробовать написать print(type(sincos))? Мы получим тот же результат - тип function.
Интересно, что же это получается, sincos - это переменная, которая хранит функцию? Да это так.

Поэтому функции можно объявлять другим способом, смотрите:

Code
test = function(x)
   return x
end

print(test(2))

Этот пример абсолютно идентичен такому:

Code
function test(x)
   return x
end

print(test(2))

Вот так.

А теперь давайте подумаем.
1) В lua есть тип переменных function.
2) В любой функции можно объявить локальную переменную

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

Code
function f(x, a, b, c)
   local function parabola(x)
    return a*x^2 + b*x+ c
   end
     
   return parabola(x)
end

print(f(2, 1, 2, 3))

Внутри функции f объявлена локальная Функция parabola, которая принимает на вход x. Так как она объявлена внутри функции f она знает числа a, b и c и может их использовать Для вычисления формулы.

С точки зрения программирования это красиво =) У всех людей нормальное представление о красоте, а у программистов такое вот....

Напоследок ещё раз напряжём мозги:
1) В lua есть тип переменных function.
2) Из функции можно возвращать любой тип данных, в том числе и function

Попробуем вернуть из функции функцию:

Code
function parabola(a, b, c)
   return function(x)
    return a*x^2 + b*x+ c
   end
end

f = parabola(1, 2, 3)

print(f(2))

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

Надеюсь после прочтения всего этого вы не повредели свои мозги)))

Ну и самое последнее - в функциях не было бы смысла, если бы разработчики lua не сделали бы нам прилично много готовых функций для решения разнообразных задач.
Вы уже видели в прошлом уроке функции для работы с таблицами.
Как правило, все их функции орагнизованы в модули, к примеру модуль math - для работы с математикой, модуль table - для работы с таблицами, string - для строк и т.д.
И как вы наверно уже видели, вызов функции выглядит так:

Code
math.sin(10)

Похоже на таблицы, правда?

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

Code
my_module = {}
my_module.do_something = function()
   print("chto-to delaem")
end

my_module.do_something()

Это удобно для организации всех ваших функций в один модуль.



[Прошлый урок]|[Список уроков]|[Следующий урок]


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Drun
Дата: СБ, 15.01.2011, 15:35:49 | Сообщение # 2
Drun
Олег
Группа: Хранители порядка
Сообщений: 1099
Репутация: 1340
Статус: Offline
Новый урок по Lua... На сайте w4tweaks... знаете что это означает? Главный админ вернулся!)
 
SW_Krash
Дата: ВТ, 25.01.2011, 22:58:59 | Сообщение # 3
SW_Krash
BugagaXD
Группа: Проверенные
Сообщений: 818
Репутация: 28
Статус: Offline
прочитал начало... понял что из Герыча хороший препод =))) на днях начну луа заново вспоминать =)

Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Дата: СР, 26.01.2011, 00:28:36 | Сообщение # 4
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
О, отлично, тогда имеет смысл следующий урок придумывать?)

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
firsacho
Дата: СР, 26.01.2011, 00:35:00 | Сообщение # 5
firsacho
ICQ = 453-163-541
Группа: Админы
Сообщений: 3636
Репутация: 71
Статус: Offline
Quote (Герыч)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.
Покажу на примере, как они облегчат жизнь

Вот когда читаешь такой текст, еще раз убеждаешься что в Герыче запрятан талант писателя... ему надо попробовать статьи для научных журналов писать... довольно скучный урок, но текст его заметно оживляет)





Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

www.w4mod.tk - моя модификация для worms4

www.fir-st.narod.ru - моя домашняя творческая страничка

www.botarena.by.ru - мой сайт об игре robot arena 2 (битвы роботов)
 
SW_Krash
Дата: СР, 26.01.2011, 10:52:56 | Сообщение # 6
SW_Krash
BugagaXD
Группа: Проверенные
Сообщений: 818
Репутация: 28
Статус: Offline
хм... интересно... firsacho, ты тоже дочитал до места
Quote (Герыч)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.
Покажу на примере, как они облегчат жизнь

или всё осилил???

Герыч, по-поводу следующего урока подожди, лично мне пока не нужен =))) хотя у других может быть иное мнение =)


Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Дата: ЧТ, 27.01.2011, 22:21:08 | Сообщение # 7
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Почему не нужен?

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
SW_Krash
Дата: ЧТ, 27.01.2011, 22:24:07 | Сообщение # 8
SW_Krash
BugagaXD
Группа: Проверенные
Сообщений: 818
Репутация: 28
Статус: Offline
я этот ещё не прочёл =) хотя если желание есть пиши =))) а ещё буду благодарен если подкорректируешь статью http://w3d.wiki-site.com/index.p....elay.29

она очень полезная... но формат гонит =)))



Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Дата: ЧТ, 27.01.2011, 22:25:48 | Сообщение # 9
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Взаимно буду оч благодарен, если ты найдёшь хорошую вики, куда можно это перенести. Формат гонит из-за особенностей этой вики.

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
CRYZenD
Дата: СР, 16.01.2013, 23:56:46 | Сообщение # 10
Только что регнулся
Группа: Новички
Сообщений: 2
Репутация: 0
Статус: Offline
Герыч, а когда будет следующий урок?
 
firsacho
Дата: ЧТ, 17.01.2013, 00:02:33 | Сообщение # 11
firsacho
ICQ = 453-163-541
Группа: Админы
Сообщений: 3636
Репутация: 71
Статус: Offline
CRYZenD, ну т.к. этот урок был 2 года назад, логично, что нового не ожидается)
Рекомендую продолжить изучение по этой ссылке: http://w3d.wiki-site.com/index.p....%8B_Lua А вопросы если что - на наш форум.





Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

www.w4mod.tk - моя модификация для worms4

www.fir-st.narod.ru - моя домашняя творческая страничка

www.botarena.by.ru - мой сайт об игре robot arena 2 (битвы роботов)
 
Форум » Worms 4 Mayhem » 5.1. Уроки Lua » Урок 6. Функции. Локальные переменные. (О функциях. Некоторые хитроумные особенности.)
Страница 1 из 11
Поиск:

Copyright W4Tweaks™ 2008-2016 Хостинг от uCoz