-- + - * / % 求幂
-- + - * / % 求幂
可变参数指的是函数的参数的个数是任意多个的
print函数的参数就是可变参数
--参数的位置用...代替
function test(...)--用于打印
print(arg)--注意参数arg 函数接受的多个参数都会被传入arg arg是表
--如果想访问表中的数据 需要 arg[索引] 访问
--还有个注意的地方 这然传入的数据保存在arg表中时 表的最后多了个值 这个值保存了表的数据个数
end
function test(...)
local arg = {...}--这样的表就是不带数据个数的表 避免了上面的问题
res = 0;
for k,v in pairs(arg) do
res = res + v
end
print(res)
end
test(1,2,3,4,5)
--函数总结
函数关键字前也有修饰符
可加local或不加
像变量一样表示全局函数或者局部函数
--函数的定义
function max(num1,num2)--比较两个数的大小
if(num1>num2) then
return num1
else
return num2
end
end
print(max(1,10))
--函数可以作为数据赋值 可以作为参数传递 相当于c#的委托与事件
temp = max
temp(40,3)
--匿名函数可以当做数据赋值
--可以当做参数传递
function myprint(num)
print(num)
end
function add(num1,num2,myprintfun)
numadd = num1+num2
myprintfun(numadd)
end
add(4,6,myprint)
--c#不支持返回多个值 lua支持 不知道现在c#改变了没有
--返回多个值 需要多个变量来接收
aaa
--[[
if(布尔表达式) then
为true的时候需要执行的代码
if(布尔表达式)then
为true的时候要执行的代码
else
为false的时候要执行的代码
end
if (布尔表达式) then
//1
elseif (布尔表达式) then --elseif否则如果 if elseif 都需要加then else不需要加
//2
else
//3
end--简而言之就是多选一
--]]
ε=(´ο`*)))
--for循环
--数值for循环
--[[
for var=start,end,step do --默认步长变化1
循环体
end
--]]
--如
for i=1,10 do --步长默认加1
print(i)
end
for i=20,1,-1 do
print(i)
end
--泛型for循环
--如
table1 = {key1="moshi",key2="shanliu"};
for k,v in pairs(table1) do
print(k,v) --使用逗号会自动分隔开值
end
t2 = {"毛笔","铅笔","钢笔"}
for k,v in pairs(t2) do
print(k,v) --使用逗号会自动分隔开值
end
--c#中的do while 在lua中叫做repeat until do while满足条件继续 until满足停止
--最少执行一次 repeat是重复的意思
--[[
repeat
循环体
until(条件)
--]]
--重复执行循环,直到 指定的条件为真时为止
a =1
repeat
print(a)
a = a + 1
until(a>10)
1 whlie
2 for
3 repeat unil
while () do
end
--多变量同时赋值
a,b = 10,20;
a,b = 10,"hehe";-赋不同类型的值
--交换赋值
a,b = b,a; --这里结果不是我们想象的20,20 而是20,10
--以上因为赋值的时候 先统一计算右边所有的值 再统一赋值
--如
a = b , b = a; a = 20,b = 20 错
是 a = 20,b = 10;
--当右边值的数量多余左边的变量时候 忽略掉多余的
--当赋值时 左边的变量多余右边的值 多余的变量默认赋值为nil
--当函数返回的值太多 而接受者只能接受一个的话 多余的被省略掉了
类型不固定
一般情况下创建的变量都是全局变量
变量名前加上local的才是局部变量
两者的生命周期不一样
全局变量不受代码块的影响
局部变量受所在的局部代码块的影响 出了范围便被销毁
do
end
制作一个代码块
如果有局部变量与全局变量重名 访问最近的
诶
--函数的另外一种用法
--函数作为参数传递
function TestFun(tab,Fun)--tab是表 Fun是函数用于处理tab 这样感觉好像是委托Fun来做这件事
for k,v in pairs(tab) do
Fun(k,v)
end
end
tab = {key1 = "hehe", key2 = "heihei"};
function f1(k,v) --f1作为实参 传给形参Fun
print(k..":"..v);
end
TestFun(tab,f1);
--以上相当于c#的委托与事件 不过我已经不记得c#的委托与事件
--匿名函数 没有名字 只能用一次 一般代码量都很少 如果代码量很多 还是使用函数
--如
TestFun(tab,function(k,v)print(k.."-"..v)end)--后面部分就是匿名函数 不过这样不美观
--加上换行 改写成
TestFun(tab,
function(k,v)
print(k.."-"..v);
end
)
--[[ c#中取得阶乘函数
int fact(int n)
{
if(n==1)
return n;
else
return n*fact(n-1);
}
--]]
--同样在lua中定义个函数 需要关键字 不用写上返回类型 函数可以返回任意类型 或不返回
--函数参数 也不需要类型
--函数不需要{}
function fact(n)
if n==1 then
return n;
else
return n*fact(n-1);
end
end
print(fact(3))
--以上是函数的定义 和函数的使用
--函数也可以当做类型使用 把一个函数当做一个类型来使用
--如
fact2 = fact ;--把函数fact赋值给了fact2 因此fact2也有了fact的功能 也同样能够调用
--函数可以当做值 类型就是function
--约定大于限制 自己注意参数
表中使用字符串作为key的话
是不需要用""括起来的
--表索引的特性和关联数组很像
--{}构建表达式
table1 = {} --空表
table2 = {key1=100,key2="value2",2 = 200} --表名 键值对 最后2=200是不对的 待3纠正
biao = {} --
print(biao)--输出了表的类型以及它的内存地址
--访问表中值的两种方法
hehe = {key1="111",key2="3333"}
print(hehe.key1); --表名.键名
print(hehe["key1"]);--表名["键名"]
--一种表现形式 这种可以当作数组使用 不能用.访问 只可用[]访问
table3 = {"apple","stop","babnbab"}--只有值,没有key,也就是没有键 但也有默认的key 从1开始
--遍历表的方法 利用for 和 pairs方法 取得表的键值对
for key,value in pairs(table3) do
print(key..":"..value)
end
--这里没有参菜鸟教程的这部分
a = {} --空表
a["key"] = "value" --往表中加入 键值对 key value
key = 10 --声明变量
a[key] = 22 --往表中加入键值对 10 22
a[key] = a[key] + 11 --对键操作 改变值为22+11=33
for k, v in pairs(a) do --遍历表
print(k .. " : " .. v)
end
小数整数都被当做数字类型
e指的是指数
其中 E(代表指数)表示将前面的数字乘以 10 的 n 次幂 n次幂就是那个加或者减的数
或者e代指10 后面加就右移 减就左移
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真"
在判断中nil会被当做false处理 type中还是判断为nil
if then 如果 就
全局变量:
不需要声明,给一个变量赋值后即创建了这个全局变量。
删除全局变量给其赋值为“nil”
egg: b = nil
标示符不允许使用特殊字符@¥%,最好不要使用下划线加大写字母的标示符。
“--”:单行注释
"--[[
--]]"多行注释