一 Lua函数的定义
(1)Lua 编程语言函数定义格式
函数定义: '函数名' + '参数组成的列表' + '函数体'
一对圆括号'()'把参数列表'括起来'
即使被调用的函数'不需要参数',也需要'一对圆括号()'
++++++++++++'分割线'++++++++++++
function function_name(argument1, argument2, argument3..., argumentn)
function_body
return result '返回值非必须'
end
二 函数调用
一个'函数调用'视为'一条语句',视为'表达式'
+++++++++++'分割线'+++++++++++
当前lua程序中'定义函数',在当前lua程序中'调用函数'-->function(args)
(1)面向对象风格的调用
冒号操作符-->":" -->仅适合于'table中函数'的调用
module_name.func(args) --> '最佳实践'
module_name:func(args)
(2)调用函数时使用的参数个数与定义函数时使用的参数个数
+++++++++++'特点'+++++++++++
1)使用'参数过多',会'抛弃'多余的参数
2)使用'参数不足'将参数设置为'nil'的方式来'调整参数的个数'
备注: 了解这个即可,最好参数个数'二者等价'
三 多返回值
特点: 允许一个函数'返回多个结果'
具体: return关键字后'列出所有要返回'的值
当函数被作为一条单独语句调用时,其所有的返回值'都会被丢弃'
+++++++++++++++'分割线'+++++++++++++++
f()、g() -->f(g())-->会把'g返回值的个数'调整与'f的参数个数'一致
(1)多重赋值,函数返回值个数
如果一个'函数没有返回值'或者'返回值个数不够多',那么Lua语言会'用nil来补充'缺失的值
(2)表构造器存储函数的返回值
1)'表构造器'会完整地接收'函数调用的所有返回值','不会'调整返回值的个数
备注: 这种行为只有'当函数调用'是表达式列表中'最后一个时'才有效,在'其它位置上'的函数调用总是'只返回一个结果'
(4)函数细节
1)将函数调用'用一对圆括号括起来'可以'强制'其只返回'一个结果'
备注:return语句后面的内容是'不需要'加括号的,如果'加括号'可能会导致程序出现'额外的行为'
2)函数的返回值是'函数'
return foo()
(5)可变长参数列表
函数'参数列表'中的三个点'(...)'表示该函数的参数是'可变长的'
特点:函数被调用时,Lua内部会把它的'所有参数收集起来',我们把这些被收集起来的参数称为'函数的额外参数'
++++++++++'分割线'++++++++++
1)只包含'可变参数'
2) '普通参数' + '可变参数'
特点1:如果参数列表中'也需要'固定参数,则'固定参数'必须放在'可变长参数'-->'之前'
特点2:Lua语言会'先将前面'的参数赋值给固定参数,然后将'剩余的参数'(如果有)作为可变长参数
(6)遍历函数的可变参数
① table.pack
场景引入: 可变参数中'包含无效的nil',那么{...}获得的表可能'不再是'一个'有序的序列',无法判断表中的'原始参数'是否'以nil结尾'
++++++++++++++++'table.pack'++++++++++++++++
功能:把参数列表'转换成'Lua语言中一个'真实的列表'-->table
特点:该函数像表达式{...}一样'保存所有的参数',然后将其'放在一个表中'返回,但是这个表还有一个'保存了参数个数'的额外字段"n"
获取方式: 'table.pack(...).n'
备注: 参数少采用-->'table.pack',参数过多-->'select'
② select
③ unpack
特点:把Lua语言中'真实的列表'转换成一组'返回值'
需求: 通过'数组a'传入可变的参数来'调用函数f' --> f(table.unpack(a)) -->动态调用具有'任意参数'的'任意函数' -->'泛型调用'
解释:unpack会返回'a中所有的元素',而这些元素又'被用作函数f的参数'
限制: 该函数'只能-->only'用于'序列'
(7)哑变量
作用: 丢弃'不需要的变量'
四 函数的本质
五 递归调用
需求: 输入一个数字,输出'阶乘'
function fact(n)
if 1 == n then
-- 1: 返回条件
return 1
else
-- 2: 递归体-->f(n)=n*f(n-1)
return n * fact(n-1)
end
end
print("Enter a number : ")
a = io.read("*number")
print(fact(a))
六 随机数产生
-- lua中产生 1 - n 之间'不重复随机数'
local function GetRandomNumList(len)
local rsList = {}
for i = 1,len do
table.insert(rsList,i)
end
local num,tmp
for i = 1,len do
num = math.random(1,len)
tmp = rsList[i]
rsList[i] = rsList[num]
rsList[num] = tmp
end
return rsList
end
七 函数小结
八 math库