Lua循环与迭代器函数

Lua 语言提供了以下几种循环处理方式:
while 循环:在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true

for 循环:重复执行指定语句,重复次数可在 for 语句中控制。

repeat...until :重复执行循环,直到 指定的条件为真时为止

循环嵌套:可以在循环内嵌套一个或多个循环语句(while do ... end;for ... do ... end;repeat ... until;)

一、While循环

Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。
statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式,在 condition(条件) 为 true 时执行循环体语句。


Lua循环与迭代器函数_第1张图片
image.png

while结构体,输出数字1-20

a=1
while (a<=20) do--while循环输出1-20
print (a)
a=a+1--Lua中不能使用a++自增
end

输出1-20奇数

a=1
while (a<=20) do--while循环输出1-20
if (a%2==1) then
print(a)
end
a=a+1--Lua中不能使用a++自增
end
二、For循环

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类::
数值for循环
泛型for循环
(1)数值 for循环
Lua 编程语言中数值for循环语法格式:

for var=start,end,step do 
循环体
end
--这里var会从start变化到end,每次变化--step步长变化

例如以下for循环代码遍历出1-10的顺序和倒序排列

for i=1,10,1 do--顺序
print(i)
end

for i=10,1,-1 do--倒序
print(i)
end

(2)泛型 for循环
泛型for循环通过一个迭代器函数来遍历所有值,类似C#中的foreach语句。
Lua 编程语言中泛型for循环语法格式:

--打印tab的所有值  
for k,v in pairs(tab) 
    do print(k,v) 
end  

例如遍历一张表中所有的key和value

tab={key1="value1",key2="value2"}

for k,v in pairs(tab) do
   print(k,v)
end

输出结果:

key1    value1
key2    value2
三、repeat...until循环

我们注意到循环条件判断语句(condition)在循环体末尾部分,所以在条件进行判断前循环体都会执行一次。
如果条件判断语句(condition)为 false,循环会重新开始执行,直到条件判断语句(condition)为 true 才会停止执行。

Lua repeat...until 循环流程图如下:


Lua循环与迭代器函数_第2张图片
image.png

C#中do while 是当满足条件执行而repeat until是直到满足条件停止执行
例如如下程序输出数字1-10

repeat
 print(b)
 b=b+1
 until (b>10)--直到b>10才会停止执行
四、循环嵌套

例子:我们输出1输出一次2输出2次以此类推10输出十次,我们用for嵌套for和for嵌套while试试,代码如下

 for i=1,10 do
   for j=1,i do
    print(i)
   end
 end
 
 
for i=1,10 do
 j=1
 while (j<=i)
  print(i)
  j=j+1
 end
end

IF语句
if语句结构

if(布尔表达式)then 
为true的时候要执行的代码
end
五、迭代器函数(pairs与ipairs)

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址
在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。

在遍历table的时候有一个pairs函数还有另一个ipairs函数,那么这两个有什么区别呢
pairs:迭代 table,可以遍历表中所有的 key 可以返回 nil
ipairs:迭代数组,不能返回 nil,如果遇到 nil 则退出

array={"Lua","C#","JAVA","C"}
array[2]=nil

for k,v in pairs(array) do
print(k,v)
end

for k,v in ipairs(array) do
print(k,v)
end

输出结果

1   Lua
3   JAVA
4   C
1   Lua

pairs迭代table,遍历表中所有的Key和Value
ipairs安装索引从1开始,递增遍历,遇到nil值就停止
自定义迭代函数

以下是泛型for的结构体

for 变量列表 in 迭代函数 状态变量 控制变量 do
  --循环体
end

执行过程:
1,调用迭代函数,(把状态变量和控制变量当作参数传递给迭代函数)
2,如果迭代函数的返回值为nil,退出for循环
如果不是nil的话,把返回值赋值给变量列表,并执行循环体

--自定义迭代函数
--state(状态变量):循环的次数  control(控制变量):当前循环次数
function square(state,control)
  if(control>=state)then
     return nil
  else
  control=control+1
     return control,control*control

  end
end
--遍历
for i,j in square,9,0 do
 print(i,j)
end

输出结果

1   1
2   4
3   9
4   16
5   25
6   36
7   49
8   64
9   81

你可能感兴趣的:(Lua循环与迭代器函数)