• Lua 人门(一)


    Lua基础数据类型

    nil 空

    • nil 表示"无效值"
    • 变量赋值前默认为nil
    • 将nil赋予给一个全局变量就等同于删除它

    number 数字

    • Number 类型用于表示实数,和 C/C++ 里面的 double 类型很类似。
    • math.floor(向下取整)和 math.ceil(向上取整)

    String 字符串

    • 字符串还可以用一种长括号(即[[ ]])括起来的方式定义。我们把两个正的方括号(即[[)间插入 n 个等号定义为第 n 级正长括号。就是说,0 级正的长括号写作 [[ ,一级正的长括号写作 [=[,如此等等。反的长括号也作类似定义;举个例子,4 级反的长括号写作 ]====]。一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。整个词法分析过程将不受分行限制,不处理任何转义符,并且忽略掉任何不同级别的长括号。这种方式描述的字符串可以包含任何东西,当然本级别的反长括号除外。例:[[abc bc]],里面的 " " 不会被转义。

    Lua 的字符串是不可改变的值,不能像在 c 语言中那样直接修改字符串的某个字符,而是根据修改要求来创建一个新的字符串。Lua 也不能通过下标来访问字符串的某个字符。想了解更多关于字符串的操作

    • 在 Lua 实现中,Lua 字符串一般都会经历一个“内化”(intern)的过程,即两个完全一样的 Lua 字符串在 Lua 虚拟机中只会存储一份。每一个 Lua 字符串在创建时都会插入到 Lua 虚拟机内部的一个全局的哈希表中。 这意味着
    1. 创建相同的 Lua 字符串并不会引入新的动态内存分配操作,所以相对便宜(但仍有全局哈希表查询的开销),
    2. 内容相同的 Lua 字符串不会占用多份存储空间,
    3. 已经创建好的 Lua 字符串之间进行相等性比较时是 O(1) 时间度的开销,而不是通常见到的 O(n).

    table (表)

    • Table 类型实现了一种抽象的“关联数组”。“关联数组”是一种具有特殊索引方式的数组,索引通常是字符串(string)或者 number 类型,但也可以是除 nil 以外的任意类型的值。

    function (函数)

    while

    • 没有do-while
    • 没有continue
    • 有break

    repeat

    -类似do-while

    repeat
        print("1")
    until false
    

    for

    for数字

    for var = begin, finish, (step) do
        --body
    end
    

    for 泛型

    -- 打印table t中所有的key
    for k in pairs(t) do
        print(k)
    end
    
    local a = {"a", "b", "c", "d"}
    for i, v in ipairs(a) do
      print("index:", i, " value:", v)
    end
    
    local days = {
       "Monday", "Tuesday", "Wednesday", "Thursday",
       "Friday", "Saturday","Sunday"
    }
    
    local revDays = {}
    for k, v in pairs(days) do
      revDays[v] = k
    end
    
    -- print value
    for k,v in pairs(revDays) do
      print("k:", k, " v:", v)
    end
    
    -- output:
    k:  Tuesday   v: 2
    k:  Monday    v: 1
    k:  Sunday    v: 7
    k:  Thursday  v: 4
    k:  Friday    v: 5
    k:  Wednesday v: 3
    k:  Saturday  v: 6
    

    Lua函数

    function function_name (arc)
    -- arc 表示参数列表,函数的参数列表可以为空
       -- body
    end
    
    function_name = function (arc)
      -- body
    end
    
    foo.bar = function (a, b, c)
        print(a, b, c)
    end
    

    函数的参数

    local function fun1(a, b)       --两个形参,多余的实参被忽略掉
       print(a, b)
    end
    
    local function fun2(a, b, c, d) --四个形参,没有被实参初始化的形参,用nil初始化
       print(a, b, c, d)
    end
    
    local x = 1
    local y = 2
    local z = 3
    
    fun1(x, y, z)         -- z被函数fun1忽略掉了,参数变成 x, y
    fun2(x, y, z)         -- 后面自动加上一个nil,参数变成 x, y, z, nil
    
    -->output
    1   2
    1   2   3   nil
    

    具名参数

    • Lua 还支持通过名称来指定实参,这时候要把所有的实参组织到一个 table 中,并将这个 table 作为唯一的实参传给函数。
    local function change(arg) -- change 函数,改变长方形的长和宽,使其各增长一倍
      arg.width = arg.width * 2
      arg.height = arg.height * 2
      return arg
    end
    
    local rectangle = { width = 20, height = 15 }
    print("before change:", "width  =", rectangle.width,
                            "height =", rectangle.height)
    rectangle = change(rectangle)
    print("after  change:", "width  =", rectangle.width,
                            "height =", rectangle.height)
    
    -->output
    before change: width = 20  height =  15
    after  change: width = 40  height =  30
    

    按引用传递

    • 当函数参数是 table 类型时,传递进来的是 实际参数的引用,此时在函数内部对该 table 所做的修改,会直接对调用者所传递的实际参数生效,而无需自己返回结果和让调用者进行赋值。 我们把上面改变长方形长和宽的例子修改一下。
    function change(arg) --change函数,改变长方形的长和宽,使其各增长一倍
      arg.width = arg.width * 2  --表arg不是表rectangle的拷贝,他们是同一个表
      arg.height = arg.height * 2
    end                  -- 没有return语句了
    
    local rectangle = { width = 20, height = 15 }
    print("before change:", "width = ", rectangle.width,
                            " height = ", rectangle.height)
    change(rectangle)
    print("after change:", "width = ", rectangle.width,
                           " height =", rectangle.height)
    
    --> output
    before change: width = 20  height = 15
    after  change: width = 40  height = 30
    

    函数返回值

    function init()             --init 函数 返回两个值 1 和 "lua"
      return 1, "lua"
    end
    
    x = init()
    print(x)
    
    x, y, z = init()
    print(x, y, z)
    
    --output
    1
    1 lua nil
    
    local function init()       -- init 函数 返回两个值 1 和 "lua"
        return 1, "lua"
    end
    
    local x, y, z = init(), 2   -- init 函数的位置不在最后,此时只返回 1
    print(x, y, z)              -->output  1  2  nil
    
    local a, b, c = 2, init()   -- init 函数的位置在最后,此时返回 1 和 "lua"
    print(a, b, c)              -->output  2  1  lua
    
    --函数调用的实参列表也是一个列表表达式。考虑下面的例子
    local function init()
        return 1, "lua"
    end
    
    print(init(), 2)   -->output  1  2
    print(2, init())   -->output  2  1  lua
    --如果你确保只取函数返回值的第一个值,可以使用括号运算符,例如
    local function init()
        return 1, "lua"
    end
    
    print((init()), 2)   -->output  1  2
    print(2, (init()))   -->output  2  1
    

    全动态函数调用

    local function run(x, y)
        print('run', x, y)
    end
    
    local function attack(targetId)
        print('targetId', targetId)
    end
    
    local function do_action(method, ...)
        local args = {...} or {}
        method(unpack(args, 1, table.maxn(args)))
    end
    
    do_action(run, 1, 2)         -- output: run 1 2
    do_action(attack, 1111)      -- output: targetId    1111
    

    模块

    把下面的代码保存在文件 my.lua 中

    local foo={}
    
    local function getname()
        return "Lucy"
    end
    
    function foo.greeting()
        print("hello " .. getname())
    end
    
    return foo
    

    把下面代码保存在文件 main.lua 中,然后执行 main.lua,调用上述模块。

    local fp = require("my")
    fp.greeting()     -->output: hello Lucy
    
  • 相关阅读:
    KL散度(相对熵)和交叉熵的区别
    将模型从 PyTorch 导出到 ONNX 并使用 ONNX Runtime 运行
    Numpy Boolean Indexing Mask(Numpy 布尔索引掩码 )
    python PIL 图像处理库(Pillow)简介
    YOLO v3 网络结构和源码详解
    PyTorch 下使用 Tensorboard
    Python vars() 函数
    python 的 Tqdm 模块
    Pytorch 中的模式设置:model.eval() 和 model.train()
    Pytorch 中的 zero_grad 使用方法
  • 原文地址:https://www.cnblogs.com/7fancier/p/9778972.html
Copyright © 2020-2023  润新知