【2】Lua基本的函数和控制结构

 

【1】使用Lua

(1)创建函数

 

hello=function()
 
     
    
print("Hello World")
 
     
    
return   99
 
     
    
end
 
     
     
    
print(hello())

lua自定义库 lua自定义函数_参数传递

(2)局部函数

 语法糖 

function  hello()
 
     
    
print("Hello World")
 
     
    
end
 
    
hello()
 
     
    
--//=====================>>遇到lua解释器时会转化成如下定义方式
 
     
    
hello=function()
 
     
    
print("Hello World")
 
     
    
end
 
     
     
    
hello()

 

 local  关键字

local  function  hello()
 
     
    
print("Hello World")
 
     
    
end
 
    
hello()
 
     
    
--//==========================>>当使用local关键字时,它被粗略的转换成如下
 
     
     
    
local  hello=function()
 
     
    
print("Hello World")
 
     
    
end
 
     
     
    
hello()

 

(3)函数的参数和返回值

将摄氏温度转化为华氏温度

 

convert_c2f=function(celsius)
 
     
    
local  converted=(celsius*1.8)+32
 
     
    
return  converted
 
    
 
    
end
 
     
     
    
print(convert_c2f(0))
 
     
    
print(convert_c2f(-39))

lua自定义库 lua自定义函数_lua自定义库_02

 空参数:当没有值通过参数传递的时候,参数会获得一个nil 值。因为convert_c2t的第一行尝试将Celsius乘以1.8,所以她产生了错误:一个nil 值不能作为算术表达式的一部分。 

print(convert_c2f())

lua自定义库 lua自定义函数_参数传递_03

没有返回值:

并不是所有的函数都需要返回值

(4)函数作为lua值

在Lua中每一个函数只是一个简单的Lua 值,它的类型是function.这些值可以被比较(使用==  和~=),绑定到变量名,传递给函数,从函数中返回。或者作为table中的关键字。能以这种方式对待的Lua值被称为头等对象,而支持这种方式的函数被称为头等函数。

 

hello=function  ()  print("Hello World")  end
 
     
    
print(hello ==hello)
 
     
    
hello2=hello
 
     
    
print(hello2==hello)
 
     
    
hello2=function  ()  print("Hello World")  end
 
     
    
print(hello2==hello)

 

lua自定义库 lua自定义函数_控制结构_04

创建一个新的函数,并且被绑定到hello2。尽管这个新的函数具有相同的定义和函数体,但事实上却是另外一独立的函数

【2】用if语句进行判断

 (1)一个简单的条件

function  condition_test(num)
 
     
    
print("你输入的数字:"..num)
 
     
    
if   num==6   then
 
     
    
        print("你输入了正确的逻辑数字:"..num)
 
     
    
end
 
     
     
    
end
 
     
    
condition_test(4)
 
     
    
condition_test(6)

 

lua自定义库 lua自定义函数_参数传递_05

(2)复杂 的表达式

 

name="lisong"
 
     
    
if  name  then
 
     
    
print("表达式为true")
 
     
    
end
 
     
     
    
if  type(name)=="string"  then
 
     
    
print("表达式为true")
 
    
elseif  name==nil  then
 
    
print("表达式为nil")
 
     
     
    
end

lua自定义库 lua自定义函数_Lua函数_06

(3)扩展的条件语句

if  表达式   then

elseif  表达式  then

elseif  表达式  then

else

end

(4)显示个人问候

 

function   greeting(name)
 
     
    
if  type(name)=="string"  then
 
     
    
        print("欢迎你"..name.."先生(女士)")
 
     
    
elseif  type(name)=="nil"  then
 
    
        print("欢迎你朋友")
 
     
    
else
 
     
    
        print("输入错误")
 
     
    
end
 
     
    
end
 
     
    
greeting("李松")
 
    
greeting()
 
    
greeting(10)
 
     
     
    
 \

lua自定义库 lua自定义函数_lua自定义库_07

如果name 的参数是nil ,就以为着没有参数传递给函数

【3】用while 语句来重复动作

语法:

while   表达式   do

end

(1)计算阶乘

定义一个阶乘函数  factorial

 

function  factorial(num)
 
     
    
local  total=1
 
    
while   (num>1)  do
 
     
    
        total=total*num
 
     
    
        num=num-1
 
     
    
        print("total= "..total.."   nun="..num)
 
     
    
end
 
     
    
return   total
 
     
    
end
 
     
    
num=5
 
    
print(num.."的阶乘"..factorial(num))

 

lua自定义库 lua自定义函数_lua自定义库_08

 通过递归 实现  1+2+...+num  的值 

function  digui(num)
 
     
    
if  num==0  then
 
     
    
        return   0
 
    
else
 
     
    
return  digui(num-1)+num
 
     
    
end
 
     
    
end
 
     
     
    
print(digui(10))
 
     
    
print(digui(100))

lua自定义库 lua自定义函数_参数传递_09

 

(2)while 和repeat 之间的差异

repeat/until  循环是while 循环的一个变种

repeat 
         body
     
 until   <boolean 表达式>
 
   
 repeat /until  至少执行一次  
 
   
 
    
function  factorial2(num)
 
     
    
local  total=1
 
     
    
repeat
 
     
    
        total=total*num
 
    
        num=num-1
 
     
    
until   num<1
 
     
    
return  total
 
    
end
 
     
     
    
print(factorial2(4))
 
    
print(factorial2(5))
 
     
    
print(factorial2(-3))

 

lua自定义库 lua自定义函数_Lua_10

【4】 用数值执行for循环

for    varivablename=start_value ,end_value,step_value     do
         --body
 end
 varivablename:  标示符,计数变量
 start_value:       计数的初始值
 end_value:        计数的终止值
 step_value:    每次循环之后,计数变量的增量
 
   
 
 
    
    
for  i=1,5,1  do
 
     
    
print(i)
 
     
     
    
end
 
     
    
print()
 
     
    
for  i=5,1,-1  do
 
     
    
print(i)
 
     
     
    
end

 

lua自定义库 lua自定义函数_Lua函数_11

等同于如下的代码

 

do
 
     
    
local   i=1
 
     
    
while  i<=3 do
 
     
    
        print(i)
 
     
    
        i=i+1
 
    
end
 
     
    
end
 
     
    
print()
 
     
     
    
do
 
     
    
local  i=3
 
     
    
while  i>=1  do
 
     
    
        print(i)
 
    
        i=i-1
 
     
    
end

 

lua自定义库 lua自定义函数_控制结构_12

(1)for  循环计算阶乘

 

function  factorial3(num)
 
     
    
local  total=1
 
     
    
for  i=1, num  do
 
     
    
        total=total*i
 
     
     
    
end
 
     
    
return   total
 
     
    
end
 
     
     
    
print(factorial3(3))
 
    
 
    
print(factorial3(4))
 
    
 
    
print(factorial3(5))

 

lua自定义库 lua自定义函数_参数传递_13

(2)循环条件的求值

 如下代码并不会造成死循环

upper=3
            
for  i=1,upper  do
            
print(i)
            
upper=upper+1
            
end

 

这个例子没有死循环,因为循环条件表达式只求了一次值

  (3)循环中的变量作用域

/
         
i=15
          
for   i=1 ,5  do
          
print(i)
               
end
          
print(i)

 最终  i  的值是全局中的  15  

lua自定义库 lua自定义函数_lua自定义库_14

  

///
    
 
    
--i=15
          
for   i=1 ,5  do
          
print(i)
               
end
          
print(i)

 

此时 i  的值为 nil  

 

lua自定义库 lua自定义函数_控制结构_15

///=========================
         
upper=10
          
do
               
local  max =0
          
for i =1,upper   do
          
        max=i
          
end
          
print(max)
          
end

 如果要保存控制变量的值,就可以在for 循环前面声明一个局部变量,这样就可以保存你所有需要的数字 

lua自定义库 lua自定义函数_控制结构_16