函数 — 白话Lua系列零基础教程 第六期

Posted 合宙Luat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数 — 白话Lua系列零基础教程 第六期相关的知识,希望对你有一定的参考价值。


新一期白话Lua系列零基础教程又和大家见面了,本期不仅安排了新的练习,还特别安排了“彩蛋”,努力又认真的你不要错过哦~


本期我们将讲解函数相关内容,还没有参与学习的朋友可点击以下链接查看往期教程:



建议大家在阅读时多运行代码进行测试,以确保牢记和巩固知识点。为了方便测试Lua代码,我们提供了Lua在线调试网站:
https://chenxuuu.gitee.io/lua-online/


本教程为零基础教程,适合广大没有接触过Lua的用户进行阅读。




1

初识函数


函数是指一段在一起的、可以做某一件事儿的程序,也叫做子程序。

在前面的内容中,我们已经接触过了函数的调用,这个函数就是前面用到了很多次的print(...)

调用函数只需要按下面的格式即可:

函数名(参数1,参数2,参数3,......)

为何要使用函数?因为很多事情都是重复性操作,我们使用函数,可以快速完成这些操作。

下面我们举一个最简单的函数例子,这个函数没有传入参数、没有返回值。

它实现了一个简单的功能,就是输出Hello world!

function hello()    print('Hello world!')

end


这个函数名为hello,我们可以按下面的方法进行调用(执行):

function hello()    print('Hello world!')

end

hello()


这行代码会输出Hello world!

函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20hello%28%29%0A%20%20%20%20print%28%27Hello%20world%21%27%29%0Aend%0Ahello%28%29%0A

同时,在Lua中,函数也是一种变量类型,也就是说,hello实际上也是一个变量,里面存储的是一个函数,我们可以用下面的代码来理解:

function hello()

   print('Hello world!')

end

a = hello

--把hello函数同时赋值给a变量

a() hello()

--a和hello变量指向同一个函数

--所以执行结果和hello()相同


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20hello%28%29%0A%20%20%20%20print%28%27Hello%20world%21%27%29%0Aend%0Aa%20%3D%20hello%0A--%u628Ahello%u51FD%u6570%u540C%u65F6%u8D4B%u503C%u7ED9a%u53D8%u91CF%0Aa%28%29%0Ahello%28%29%0A--a%u548Chello%u53D8%u91CF%u6307%u5411%u540C%u4E00%u4E2A%u51FD%u6570%0A--%u6240%u4EE5%u6267%u884C%u7ED3%u679C%u548Chello%28%29%u76F8%u540C%0A

因为函数只是个变量,你甚至在一开始可以这样声明hello函数:

hello = function()    print('Hello world!')

end

hello()


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?hello%20%3D%20function%28%29%0A%20%20%20%20print%28%27Hello%20world%21%27%29%0Aend%0Ahello%28%29%0A

下面你需要做一件简单的事情:

  • 新建一个函数变量biu,使其执行后会打印biubiubiu这个字符串,

  • 新建一个函数变量pong,使其与biu指向的函数相同。

--请在此处补全代码


--请使下面的调用可以正常打印出biubiubiu

biu() pong()

print("biu和pong相等吗?",biu==pong)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?--%u8BF7%u5728%u6B64%u5904%u8865%u5168%u4EE3%u7801%0A%0A--%u8BF7%u4F7F%u4E0B%u9762%u7684%u8C03%u7528%u53EF%u4EE5%u6B63%u5E38%u6253%u5370%u51FAbiubiubiu%0Abiu%28%29%0Apong%28%29%0Aprint%28%22biu%u548Cpong%u76F8%u7B49%u5417%uFF1F%22%2Cbiu%3D%3Dpong%29%0A





2

local变量



之前我们创建的变量,都是全局变量,这种变量在代码运行周期从头到尾,都不会被销毁,而且随处都可调用。

但是当我们代码量增加,很多时候大量新建全局变量会导致内存激增,我们需要一种可以临时使用、并且可以自动销毁释放内存资源的变量,要怎么解决呢?

我们可以使用local标志来新建临时变量,使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。

参考下面的代码:

a = 123

function  add()    

        local n = a+2    

        print(n)

end

add()

print(n)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?a%20%3D%20123%0Afunction%20add%28%29%0A%20%20%20%20local%20n%20%3D%20a+2%0A%20%20%20%20print%28n%29%0Aend%0Aadd%28%29%0Aprint%28n%29%0A

上面的代码中,n就是一个局部变量,它只在这个funcion中有效,并且函数运行完后会自动回收这部分的内存。

我们应该尽可能的使用局部变量,以方便lua虚拟机自动回收内存空间,同时减少资源占用提高运行速度。

下面请阅读以下代码,思考一下,正确的输出结果是什么:

str = 'abc'

function connect()    local s = str..'def'

end

print(s,str)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?str%20%3D%20%27abc%27%0Afunction%20connect%28%29%0A%20%20%20%20local%20s%20%3D%20str..%27def%27%0Aend%0Aprint%28s%2Cstr%29%0A





3

函数参数



在前几章的使用中,我们知道函数是可以传入参数的,如print(123)

那么,我们如何编写可以传入参数的函数呢?可以按下面的模板来写。

function 函数名(参数1,参数2,...)    代码内容

end

这里传入的参数,等价于在函数内部新建了一个local的变量,修改这些数据不会影响外部的数据(除了后面还没有讲到的table等类型)

举个例子,比如下面的函数,可以实现打印出两个传入值的和:

function add(a,b)    print(a+b)

end

add(1,2)

--会输出3


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20add%28a%2Cb%29%0A%20%20%20%20print%28a+b%29%0Aend%0Aadd%281%2C2%29%0A--%u4F1A%u8F93%u51FA3%0A

这段代码其实等价于:

function add()    local a = 1    local b = 2    print(a+b)

end

add()


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20add%28%29%0A%20%20%20%20local%20a%20%3D%201%0A%20%20%20%20local%20b%20%3D%202%0A%20%20%20%20print%28a+b%29%0Aend%0Aadd%28%29%0A


下面问题来了,请设计一个函数p,可以按下面的调用方式来打印出物体的密度:

--补全这个函数的代码,满足题目要求

function p(a,b,c,m)    print()

end


--一个长方体的长宽高分别为a、b、c(单位米)

a = 1

b = 2

c = 3

--这个物体重量为m(单位克)

m = 230

--下面打印出密度

--注:密度计算公式 密度 = 质量 / 体积

--duangduang,彩蛋到,拼手速即刻使用

--合宙微信商城五折券码:KEHWGB615166

p(a,b,c,m)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?--%u8865%u5168%u8FD9%u4E2A%u51FD%u6570%u7684%u4EE3%u7801%uFF0C%u6EE1%u8DB3%u9898%u76EE%u8981%u6C42%0Afunction%20p%28a%2Cb%2Cc%2Cm%29%0A%0A%20%20%20%20print%28%29%0Aend%0A%0A--%u4E00%u4E2A%u957F%u65B9%u4F53%u7684%u957F%u5BBD%u9AD8%u5206%u522B%u4E3Aa%u3001b%u3001c%uFF08%u5355%u4F4D%u7C73%uFF09%0Aa%20%3D%201%0Ab%20%3D%202%0Ac%20%3D%203%0A--%u8FD9%u4E2A%u7269%u4F53%u91CD%u91CF%u4E3Am%uFF08%u5355%u4F4D%u514B%uFF09%0Am%20%3D%20230%0A--%u4E0B%u9762%u6253%u5370%u51FA%u5BC6%u5EA6%0A--%u6CE8%uFF1A%u5BC6%u5EA6%u8BA1%u7B97%u516C%u5F0F%20%u5BC6%u5EA6%20%3D%20%u8D28%u91CF%20/%20%u4F53%u79EF%0Ap%28a%2Cb%2Cc%2Cm%29%0A






4

函数返回值



在前面的代码中,我们实现了一个函数,输入变量ab,函数会自动输出两个数值的和。

但是一般来说,我们的需求远远不止这些,我们可能需要一个如下功能的函数:

执行函数,输入两个值,获取这两个值的和

如果还是按上面几节的内容,我们只会输出这个值,并不能把这个值传递给其他的变量进行后续使用,如何解决这个需求呢?

我们可以使用函数的返回值来实现这个需求,结合上面的需求,我们可以用下面的代码实现:

function add(a,b)   

       return a+b

end

all = add(1,2)

--这里all的值就是3了

print(all)



函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20add%28a%2Cb%29%0A%20%20%20%20return%20a+b%0Aend%0Aall%20%3D%20add%281%2C2%29%0A--%u8FD9%u91CCall%u7684%u503C%u5C31%u662F3%u4E86%0Aprint%28all%29%0A


这里的return表示返回一个值,并且立刻结束这个函数的运行

同时,和输入值可以有多个一样,返回值也可以有多个。

function add(a,b)    return a+b,"ok"

end

all, result = add(1,2)

--这里all的值就是3了

--这里result的值就是string "ok"

print(all,result)



函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20add%28a%2Cb%29%0A%20%20%20%20return%20a+b%2C%22ok%22%0Aend%0Aall%2C%20result%20%3D%20add%281%2C2%29%0A--%u8FD9%u91CCall%u7684%u503C%u5C31%u662F3%u4E86%0A--%u8FD9%u91CCresult%u7684%u503C%u5C31%u662Fstring%20%22ok%22%0Aprint%28all%2Cresult%29%0A


下面问题来了,请设计一个函数p,可以按下面的调用方式来返回出物体的密度,返回值为number类型:


function p(a,b,c,m)   

       --请补全代码

end

--一个长方体的长宽高分别为a、b、c(单位米)

a = 1

b = 2

c = 3

--这个物体重量为m(单位克)

m = 230

--下面返回密度值

--注:密度计算公式 密度 = 质量 / 体积

--没看花眼彩蛋又来了,拼手速即刻使用!

--合宙微信商城五折券码:DOTXBE755228

result = p(a,b,c,m)

print(result)



函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20p%28a%2Cb%2Cc%2Cm%29%0A%20%20%20%20--%u8BF7%u8865%u5168%u4EE3%u7801%0Aend%0A%0A--%u4E00%u4E2A%u957F%u65B9%u4F53%u7684%u957F%u5BBD%u9AD8%u5206%u522B%u4E3Aa%u3001b%u3001c%uFF08%u5355%u4F4D%u7C73%uFF09%0Aa%20%3D%201%0Ab%20%3D%202%0Ac%20%3D%203%0A--%u8FD9%u4E2A%u7269%u4F53%u91CD%u91CF%u4E3Am%uFF08%u5355%u4F4D%u514B%uFF09%0Am%20%3D%20230%0A--%u4E0B%u9762%u8FD4%u56DE%u5BC6%u5EA6%u503C%0A--%u6CE8%uFF1A%u5BC6%u5EA6%u8BA1%u7B97%u516C%u5F0F%20%u5BC6%u5EA6%20%3D%20%u8D28%u91CF%20/%20%u4F53%u79EF%0Aresult%20%3D%20p%28a%2Cb%2Cc%2Cm%29%0Aprint%28result%29%0A






5

判断三角形合法性2(自测题)



你需要使用前面几章的知识,来完成下面的题目:

  • 已知三个number类型的变量,分别代表三根木棒的长度;

  • 请判断,使用这三根木棒,是否可以组成一个三角形(两短边之和大于第三边);

  • 请新建一个函数triangle,并可以用如下形式调用(如果可以组成,就返回true)。


function triangle(a,b,c)   

       --请补全代码

end


result = triangle(1,2,3)

--传入值为三边长度,多改几个测试下

print(result)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20triangle%28a%2Cb%2Cc%29%0A%20%20%20%20--%u8BF7%u8865%u5168%u4EE3%u7801%0Aend%0A%0Aresult%20%3D%20triangle%281%2C2%2C3%29--%u4F20%u5165%u503C%u4E3A%u4E09%u8FB9%u957F%u5EA6%uFF0C%u591A%u6539%u51E0%u4E2A%u6D4B%u8BD5%u4E0B%0Aprint%28result%29%0A




6

返回多个值(自测题)



你需要使用前面几章的知识,来完成下面的题目:

  • 已知2个number类型的变量,分别代表一个长方体的长和宽;

  • 请计算这个长方形的周长和面积;

  • 请新建一个函数rectangle,并可以用如下形式调用:


function rectangle(a,b)        --补全代码

end


area,len = rectangle(1,2)

--结果:

--面积area为2

--周长len为6

print(area,len)


函数 — 白话Lua系列零基础教程 第六期

如无法正确显示,请将以下网址复制到浏览器测试:

https://chenxuuu.gitee.io/lua-online/?function%20rectangle%28a%2Cb%29%0A%20%20%20%20--%u8865%u5168%u4EE3%u7801%0Aend%0A%0Aarea%2Clen%20%3D%20rectangle%281%2C2%29%0A--%u7ED3%u679C%uFF1A%0A--%u9762%u79EFarea%u4E3A2%0A--%u5468%u957Flen%u4E3A6%0Aprint%28area%2Clen%29%0A

以上就是函数相关内容讲解


函数 — 白话Lua系列零基础教程 第六期


欢迎加入Luat技术群,与大神本神直接交流


函数 — 白话Lua系列零基础教程 第六期
函数 — 白话Lua系列零基础教程 第六期
函数 — 白话Lua系列零基础教程 第六期




- 粉丝专有福利 -



没抢到文中五折券的同学, 请由公众号菜单“合宙商城”进入或长按下图识别二维码直达,领取粉丝专有福利↓↓↓


函数 — 白话Lua系列零基础教程 第六期



- 往期官方教程 -




●  

●  

●  

●  

●  

●  




●  

●  

●  

●  

● 

●  

●  

● 


仔细阅读本文,有惊喜,你发现了吗

以上是关于函数 — 白话Lua系列零基础教程 第六期的主要内容,如果未能解决你的问题,请参考以下文章

分支判断 — 白话Lua系列零基础教程 第五期

逻辑运算 — 白话Lua系列零基础教程 第四期

白话Lua系列零基础教程 — 变量

Table — 白话Lua系列零基础教程 第七期

零基础JavaScript学习第六期

生财有术第六期开放:何以解忧,唯有实战