【Lua 菜鸟教程】数据基础

Lua 菜鸟教程链接:https://www.runoob.com/lua/lua-tutorial.html

目录

字符串

表示

转义字符

操作

数组

一维数组(默认从1开始)

多维数组

迭代器

泛型for迭代器

无状态的迭代器

多状态的迭代器

table(不固定大小)

操作

table.concat (table [, 分隔符 [, 开始索引[, 结束索引]]])

table.insert (table, [pos,] value)和table.remove (table [, pos])

table.sort (table [, comp])

table.maxn (table) Lua5.2之后该方法已经不存在了


字符串

表示

-- 双引号
string1 = "Lua"
print("\"字符串 1 是\"",string1)

-- 单引号
string2 = 'runoob.com'
print("字符串 2 是",string2)

-- [[和]]之间
string3 = [["Lua 教程"]]
print("字符串 3 是",string3)
"字符串 1 是"    Lua
字符串 2 是    runoob.com
字符串 3 是    "Lua 教程"

转义字符

转义字符

意义

ASCII码值(十进制)

\a

响铃(BEL)

007

\b

退格(BS) ,将当前位置移到前一列

008

\f

换页(FF),将当前位置移到下页开头

012

\n

换行(LF) ,将当前位置移到下一行开头

010

\r

回车(CR) ,将当前位置移到本行开头

013

\t

水平制表(HT) (跳到下一个TAB位置)

009

\v

垂直制表(VT)

011

\\

代表一个反斜线字符''\'

092

\'

代表一个单引号(撇号)字符

039

\"

代表一个双引号字符

034

\0

空字符(NULL)

000

\ddd

1到3位八进制数所代表的任意字符

三位八进制

\xhh

1到2位十六进制所代表的任意字符

二位十六进制

操作

方法 用途
string.upper(arg)

字符串全部转为大写字母

string.lower(arg) 字符串全部转为小写字母
string.gsub(mainString,findString,replaceString,num)

在字符串中替换。

>string.gsub("aaaa","a","z",3);

zzza    3

string.find (mainString, findString, [init, [end]])

在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。

> string.find("Hello Lua user", "Lua", 1)

7    9

string.reverse(arg) 字符串反转
string.format(...)

返回一个类似printf的格式化字符串

>string.format("the value is:%d",4)

the value is:4

string.char(arg)

 

string.byte(arg[,int])

char 将整型数字转成字符并连接

> string.char(97,98,99,100)

abcd

 

byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

> string.byte("ABCD",4)

68

> string.byte("ABCD")

65

string.len(arg) 字符串长度
string.rep(string, n) 返回字符串的n个拷贝
string.gmatch(str, pattern)

回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。

> for word in string.gmatch("Hello Lua user", "%a+")  do print(word) end

Hello

Lua

user

string.match(str, pattern, init)

只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 
在成功配对时, 函数将返回配对表达式中的所有捕获结果;

如果没有设置捕获标记, 则返回整个配对字符串.

当没有成功的配对时, 返回nil。

> = string.match("I have 2 questions for you.", "%d+ %a+")

2 questions

 

字符串格式化 string.format(...)

-- 基本字符串格式化
print(string.format("基本格式化 %s %s",string1,string2))

-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))

-- 十进制格式化
print(string.format("%.4f",1/3))
-- 接受一个数字, 并将其转化为ASCII码表中对应的字符
string.format("%c", 83)                 -- 输出S

-- 接受一个数字并将其转化为有符号的整数格式
string.format("%+d", 17.0)              -- 输出+17
string.format("%05d", 17)               -- 输出00017
-- 接受一个数字并转换为无符号整数
string.format("%u", 3.14)               -- 输出3

-- 接受一个数字并转换为八进制
string.format("%o", 17)                 -- 输出21
-- 接受一个数字并将其转化为十六进制数格式, 使用小/大写字母
string.format("%x", 13)                 -- 输出d
string.format("%X", 13)                 -- 输出D

-- 接受一个数字并将其转化为科学记数法格式, 使用小写字母e/E
string.format("%e", 1000)               -- 输出1.000000e+03
string.format("%E", 1000)               -- 输出1.000000E+03

-- 接受一个数字并将其转化为浮点数格式
string.format("%6.3f", 13)              -- 输出13.000

-- 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
string.format("%q", "One\nTwo")         -- 输出"One\
                                        --   Two"

-- 接受一个字符串并按照给定的参数格式化该字符串
string.format("%s", "monkey")           -- 输出monkey
string.format("%10s", "monkey")         -- 输出    monkey
string.format("%5.3s", "monkey")        -- 输出  mon

%号后添加参数. 参数将以如下的顺序读入:

  • (1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
  • (2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
  • (3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
  • (4) 宽度数值
  • (5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.

数组

一维数组(默认从1开始

array = {"Lua", "Tutorial"}

for i= 0, 2 do
   print(array[i])
end
nil
Lua
Tutorial

多维数组

-- 初始化数组
array = {}
for i=1,3 do
   array[i] = {}
      for j=1,3 do
         array[i][j] = i*j
      end
end

-- 访问数组
for i=1,3 do
   for j=1,3 do
      print(array[i][j])
   end
end
-- 初始化数组
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
   for col=1,maxColumns do
      array[row*maxColumns +col] = row*col
   end
end

-- 访问数组
for row=1,maxRows do
   for col=1,maxColumns do
      print(array[row*maxColumns +col])
   end
end

迭代器

泛型for迭代器

array = {"Google", "Runoob"}

for key,value in ipairs(array) 
do
   print(key, value)
end

无状态的迭代器

无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。

这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。

function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end
 
function ipairs (a)
    return iter, a, 0
end

多状态的迭代器

很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到 table 内,将 table 作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在 table 内,所以迭代函数通常不需要第二个参数。

array = {"Google", "Runoob"}

function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

for element in elementIterator(array)
do
   print(element)
end

table(不固定大小)

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。

当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。

操作

table.concat (table [, 分隔符 [, 开始索引[, 结束索引]]])

fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))

-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))

-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
连接后的字符串     bananaorangeapple
连接后的字符串     banana, orange, apple
连接后的字符串     orange, apple

table.insert (table, [pos,] value)和table.remove (table [, pos])

fruits = {"banana","orange","apple"}

-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])

-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])

print("最后一个元素为 ",fruits[5])
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
索引为 4 的元素为     mango
索引为 2 的元素为     grapes
最后一个元素为     mango
移除后最后一个元素为     nil

table.sort (table [, comp])

fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
        print(k,v)
end

table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
        print(k,v)
end
排序前
1    banana
2    orange
3    apple
4    grapes
排序后
1    apple
2    banana
3    grapes
4    orange

table.maxn (table) Lua5.2之后该方法已经不存在了

function table_maxn(t)
  local mn=nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)
tbl 最大值:    34
tbl 长度     3

【Lua 菜鸟教程】数据基础_第1张图片

 

你可能感兴趣的:(#,Lua)