0Pricing
Lua Academy · 课时

数值 for 循环

使用 for i=start,limit,step 语法遍历数值范围。

数值 for 循环 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

数值 for 语法

Lua 的数值 for 循环形式为 for var = start, limit, step do。如果省略 step,其默认值为 1。循环变量仅在循环体内是局部变量,不能在循环体内修改。循环开始前会计算一次上限和步长。

-- Count 1 to 5
for i = 1, 5 do
  io.write(i .. " ")
end
print()   -- 1 2 3 4 5

-- Count with step 2
for i = 1, 10, 2 do
  io.write(i .. " ")
end
print()   -- 1 3 5 7 9

使用负步长倒计时

使用负步长可以递减计数。当步长为负数时,只要 var >= limit,循环就会继续。如果步长为负数时起始值已经小于上限,循环体将不会执行。

for i = 10, 1, -1 do
  io.write(i .. " ")
end
print()
-- 10 9 8 7 6 5 4 3 2 1

-- Step -2
for i = 10, 0, -2 do
  io.write(i .. " ")
end
print()
-- 10 8 6 4 2 0

循环变量是局部变量

循环控制变量(i)会自动成为局部变量。您不能在循环内更改它的值——Lua 会忽略对循环变量的赋值。如果要以其他方式跟踪迭代次数,请使用单独的局部变量。

for i = 1, 5 do
  -- i is read-only inside the loop
  -- i = i + 10  -- this creates a new global i, not the loop var
  print(i)  -- always 1, 2, 3, 4, 5 as expected
end
-- i is nil here (it was local to the loop)
print(i)  -- nil (or whatever global i was)

遍历数组

数值 for 最常见的用途是按索引遍历数组。使用 #arr 作为上限。与 ipairs 不同,这种形式可以控制步长并反向遍历,而且对于稠密数组来说速度略快。

local fruits = {"apple", "banana", "cherry", "date"}

for i = 1, #fruits do
  print(i, fruits[i])
end
-- 1  apple
-- 2  banana
-- 3  cherry
-- 4  date

使用 for 求和

数值 for 循环非常适合对数组中的值进行累加。模式始终相同:在循环前初始化结果变量,在循环内更新它,并在循环后使用它。

local values = {10, 20, 30, 40, 50}
local total = 0

for i = 1, #values do
  total = total + values[i]
end

print("Total:", total)    -- 150
print("Count:", #values)  -- 5
print("Mean:", total / #values)  -- 30

嵌套数值 for

可以嵌套两个数值 for 循环,用于矩阵遍历、遍历表的表,或生成坐标对等二维操作。外层循环处理行,内层循环处理列;每次迭代访问一个单元格。

local rows, cols = 3, 4

for r = 1, rows do
  for c = 1, cols do
    io.write(string.format("%2d ", r * c))
  end
  print()
end
--  1  2  3  4
--  2  4  6  8
--  3  6  9 12

浮点步长

步长和上限可以是浮点数,但这可能引入精度误差。若需要精确的迭代次数,请使用整数。如果必须使用浮点数,请注意循环次数的计算方式为 floor((limit - start) / step) + 1。

-- Float step
for x = 0.0, 1.0, 0.25 do
  io.write(x .. " ")
end
print()
-- 0.0  0.25  0.5  0.75  1.0

-- Prefer integer math when possible
for i = 0, 4 do
  local x = i * 0.25
  io.write(x .. " ")
end

构建结果表

数值 for 循环是根据现有数据构建新表的标准方式。先创建一个空表,然后使用循环按索引填充它。

local source = {1, 2, 3, 4, 5}
local squares = {}

for i = 1, #source do
  squares[i] = source[i] ^ 2
end

for i = 1, #squares do
  print(squares[i])   -- 1, 4, 9, 16, 25
end

数值 for 中的 break

您可以使用 break 提前退出数值 for 循环。执行会跳转到 end 之后的语句。这对于线性搜索很有用:一直遍历到找到目标,然后退出循环。

local data = {5, 3, 8, 1, 9, 2, 7}
local target = 9
local foundAt = nil

for i = 1, #data do
  if data[i] == target then
    foundAt = i
    break
  end
end

if foundAt then
  print("Found at index " .. foundAt)  -- 5
else
  print("Not found")
end

循环次数计算

for i = start, limit, step 的迭代次数为 max(0, floor((limit - start) / step) + 1)。理解这一点可以避免差一错误。当步长为 1 时,次数就是 limit - start + 1。

-- How many iterations?
local count = 0
for i = 1, 10, 3 do
  count = count + 1
end
print(count)   -- 4  (i = 1, 4, 7, 10)

count = 0
for i = 5, 1 do   -- step=1 but start > limit
  count = count + 1
end
print(count)   -- 0 (no iterations)

快速检查

for i = 10, 1, -3 do 会遍历哪些值?

回顾:数值 for

总结:

  • for i = start, limit, step do —— 步长默认为 1
  • 使用负步长倒计时
  • 循环变量会自动成为局部变量,并且是只读的
  • 循环开始前只计算一次上限和步长
  • break 可以提前退出
  • 标准模式:构建结果表、搜索数组、累加总和

常见问题解答

「数值 for 循环」课时是免费的吗?

是的 — 「数值 for 循环」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「数值 for 循环」这节课中我会学到什么?

使用 for i=start,limit,step 语法遍历数值范围。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「数值 for 循环」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. if、elseif 和 else 语句
  2. while 和 repeat-until 循环
  3. 数值 for 循环
  4. 泛型 for 和 break
← 返回 Lua Academy