Lua函数进阶 - 上

 

 

 

1 参数的简化

 

 

 

-- 1: 函数参数的简化

function MyFunction()
    print("这是我的函数")
end
MyFunction()
--带参函数
function SetName(str)
    print("请设置你的昵称: "..str)
end
--字符串形式参数
SetName("YJJ")
SetName "魔教中人"  --如果参数是字符串,则圆括号可以省略

--带参函数
function SetNameArray(nameArray)
    for i, v in ipairs(nameArray) do
        print(v)
    end
end
--Table形式参数调用
numArray = {1,2,34}
SetNameArray(numArray)
--简化形式调用,在比较清晰的时候再用,容易自己混淆
SetNameArray {5,6,7}

2 可变参数

 

 

 

 

 

 

 

 

 

--可变参数
function MultiPoVal(...)    --表示可变参数
    for i, v in pairs({...}) do
        print(v)
    end
end

--简化可变参数写法
--Lua有一个内置函数 arg 来代替 {...} 似乎高版本种,arg并不能用
function MultiPoVal(...)    --表示可变参数
    print("输入参数的个数: "..#arg)
    for i, v in pairs(arg) do
        print(v)
    end
end
--测试可变参数
MultiPoVal("东邪","西毒","北药师")

--对于存在 'nil' 数值输入,如何进行可变参数函数的编写
--含义解释;
--select("#",...)表示,返回可变参数长度
--select("i",...)表示,返回从索引数值到可变参数所有内容
function MultiPoVal(...)    --表示可变参数
    local num
    for i = 1, select('#',...) do
        num = select(i,...)
        print(num)
    end
end
MultiPoVal("东邪","西毒","北药师",nil,"JoJo")

 

3 标准函数库

 

 

 

--Lua语言的函数库
print(math.abs(-999))   --求绝对值
print(math.max(12,33,44)) --求最大值
print(math.min(12,33,4,22)) --求最小值
print(math.sin(0)) --求正玄值
print(math.cos(0)) --求余弦值
print(math.sqrt(36)) --求平方根
--随机数
print(math.randomseed(20000))   --随机因子,只有再随机因在发生巨大变化时,随机数才会改变
print(math.random(1,10)) --求随机数,有bug不好用

--字符串函数
print(string.lower("SSCSFSCG")) --得到小写
print(string.upper("jojo")) --得到大写
--还有很多不在赘述

--操作系统
print(os.date())    --得到当前时间
print(os.time())    --1970年至今的秒值

--结合系统时间,写一个随机数
function GetTrueRandom(min,max)
    local strTime = os.time();  --得到时间字符串
    local strRev = string.reverse(strTime)  --反转字符串
    local strRandomTime  = string.sub(strRev,1,6)
   math.randomseed(strRandomTime) --改变随机因子
    print("随机数为: "..math.random(min,max)) --获取 1~200 的随机数
end
--调用随机数程序
GetTrueRandom(1,100)

 

4 函数尾调用

-因为尾调用不占用 堆栈 空间, 所以不会出现 栈溢出. 所以尾调用起到了优化存储空间的作用

 

 

 

--函数尾调用 函数最后一行返回的是函数,则是尾调用
--什么是尾调用
--因为尾调用不占用 堆栈 空间, 所以不会出现 栈溢出. 所以尾调用起到了优化存储空间的作用
function FunA()         --不是尾调用
    local res = math.abs(-88)
    return res
end

function FunB()         --不是尾调用
    return FunA()
end

-- 递归算法,演示尾调用
function RecurFunc(num)
    if (num>1) then
        --return RecurFunc(num - 1)           --是尾调用,正常执行
        return RecurFunc(num - 1) + 0   --不是尾调用,造成栈溢出
    else
        return "End !"
    end
end
res = RecurFunc(100)
print(res)

 

 

 

--尾调用括号的作用
function FunC()
    print("Func")
    --return FunD()   --返回多个数值
    return (FunD()) --迫使返回一个数值  100,nil
end

function FunD()
    print("FinD")
    return 100,200
end

res1,res2 = FunC()
print(res1,res2)

 

5 函数的本质

 

 

--函数的本质
--eg1: 函数本质上是匿名的
function GetNum(num)
    return num*2
end
GetNum2 = function(num)
    return num*3
end
print(GetNum(10))
print(GetNum2(2))

--eg2: 函数可以存储在表中
funArray = {GetNum,GetNum2}
--输出表中所有函数
for k, v in pairs(funArray) do
    print(funArray[k](20))
end

--eg3: 函数的内容与表初始化同事进行
FuncList = {}
FuncList.add = function(x,y) return x * y end
FuncList.div = function(x,y) return x / y end

print(FuncList.add(20,30))
print(FuncList.div(30,5))

--尾调用括号的作用function FunC()    print("Func")    --return FunD()   --返回多个数值    return (FunD()) --迫使返回一个数值  100,nilend
function FunD()    print("FinD")    return 100,200end
res1,res2 = FunC()print(res1,res2)

posted @ 2020-03-28 14:08  少林拖地僧  阅读(276)  评论(0编辑  收藏  举报
Live2D