Lua基础(八)函数

一  Lua函数的定义

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库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值