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 时执行循环体语句。


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 循环流程图如下:


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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,517评论 0 38
  • 很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。 一组被重复执行的语句称之为循环体...
    谁说我是小小云阅读 264评论 0 0
  • 1.介绍 1.1 SMB Server Message Block 微软历史上出现安全问题最多的协议 实现复杂 默...
    cybeyond阅读 1,814评论 0 0
  • 还记得我们最初的相遇吗, 还记得那些日子里的文字和故事吗 还记得我们倚仗着青春, 肆无忌惮的笑吗, 那些狂傲到极致...
    泷子阅读 295评论 0 1
  • 一望可相见,一步如重城。所爱隔山海,山海不可平。 第一次读到这句话,是刚收到大学入取通知书,迫不及待去贴吧去了解新...
    她生活阅读 402评论 0 0