本帖最后由 Aitlo 于 2021-8-20 19:40 编辑
- -- 标准函数库
- --[===[Lua的标准函数库也是lua内置函数,主要分为以下三大类:
- 数学函数
- 字符串函数
- 操作系统库
- 应用案例:使用操作系统的时间系统函数,配合随机函数,开发准确的随数函数。 ]===]
- -- 学习lua语言的函数库
- -- 数学函数库、字符串函数库、操作系统库
- -- 数学函数库
- print(math.abs(-888)) -- 求绝对值 输出结果:888
- print(math.max(1,5,3)) -- 求最大值 输出结果:5
- print(math.min(1,5,3)) -- 求最小值 输出结果:1
- print(math.sin(0)) -- 求正弦 输出结果:0
- print(math.cos(0)) -- 求余弦 输出结果:1
- print(math.sqrt(36)) -- 求平方根 输出结果:6
- print(math.random(1,100)) -- 产生随机数 输出结果:1-100之间的一个数
- print(math.floor(18.88)) -- 返回不大于输入数值的整数(即:取整,向下取整不是四舍五入) 输出结果:18
- -- 字符串函数
- print(string.lower("AbCdeFfg")) -- 得到全部的小写
- print(string.upper("AbCdeFfg")) -- 得到全部的大写
- -- 还有很多...
- -- 操作系统库
- print(os.date()) -- 得到日期
- print(os.time()) -- 得到时间戳
复制代码- -- 函数尾调用
- --[===[lua中可以在一个函数中,使用return返回另一个函数,这种语法称为“尾调用”。
- (即:一个函数调用另一个函数的最后一个动作)
- eg:
- function f(x)
- return g(x)
- end
- ]===]
- -- 函数尾调用
- -- eg:演示什么是“尾调用”
- function FunA() -- 不是尾调用
- local res = math.abs(-88)
- return res
- end
- function FunB() -- 不是尾调用
- local res = FunA()
- return res
- end
- -- 测试调用
- res = FunB()
- print(res) -- 输出结果:88
- function FunA() -- 是尾调用
- return math.abs(-66)
- end
- function FunB() -- 是尾调用
- return FunA()
- end
- -- 测试调用
- res = FunB()
- print(res) -- 输出结果:66
- -- eg:演示递归算法中,尾调用的作用
- -- 因为尾调用不占用“堆栈”空间,所有不会出现“栈溢出”,可以起到优化存储空间的作用。
- function RecurFunc(num)
- if(num>0)then
- -- print(num)
- return RecurFunc(num-1) -- 这是“尾调用”(递归函数)
- -- return RecurFunc(num-1)+ 0 -- 不是“尾调用”(递归函数),这里如果进行10W次递归调用,则会报错“stack overflow”栈溢出
- else
- return "End"
- end
- end
- -- 测试演示1
- res = RecurFunc(10)
- print(res) -- 输出结果:End
- -- 测试演示2
- res = RecurFunc(100000)
- print(res) -- 输出结果:End
- -- eg:尾调用中括号的作用
- function FunC()
- print('FunC')
- return FunD() -- 此种方式,返回多个数值
- -- return (FunD()) -- 此种方式,迫使返回一个数值
- end
- function FunD()
- print('FunD')
- return 100,200
- end
- -- 测试演示3
- res1,res2 = FunC()
- print(res1,res2) -- 输出结果:End
- --[===[注意事项:
- 封装函数中的return x() 与 return (x()) 含义不同,后者只能返回一个结果。
- (即:前者返回函数类型,后者是一个数值)
- 说明:
- 当A函数调用完B函数就再没有可执行的工作时,程序就不需要返回那个B所在的函数。
- 所以在尾调用之后程序也不需要保存任何关于该函数的栈信息。
- 由于“尾调用”不会耗费栈空间,所以一个程序可以拥有无数嵌套的“尾调用”,
- 而不用担心造成栈溢出。
- ]===]
复制代码
|