第五章 函数 Lua程序设计笔记

--第五章 函数
若函数只有一个参数,并且此参数时字符串或table,则圆括号可有可无

print "hello world" <--> print("hello world")
f {x = 10, y = 20} <--> f ({x = 10, y = 20})

--5.1多重返回值

function foo0 () end
function foo1 () return "a" end
function foo2 () return "a", "b" end

1当函数调用作为一条单独的语句时,会丢弃所有返回值。
2将函数作为表达式的一部分使用时,会保留函数的第一个返回值。
3将函数作为一系列表达式中的最后一个参数使用时,才能获得它的所有值。

x,y = foo2(), 20  -- x = "a", y = 20 不是最后一个
print(foo2())  -->a b  是最后一个
print(foo2(),1)  --> a 1  不是最后一个

table构造式可以接受所有的值,这是也必须是最后一个

t = {foo0()} -- t = {}
t = {foo1()} -- t = {"a"}
t = {foo2()} -- t = {"a", "b"}
t = {foo0(),foo2(),4} -- t[1] = nil, t[2] = "a", t[3] = 4   不是最后一个

将一个函数调用放入一对圆括号中,迫使他返回一个值:

print((foo0())) -- nil
print((foo1())) -- a
print((foo2())) -- and

unpack函数,接受一个数组参数,并返回其所有元素

print(unpack{10,20,30})  --> 10,20,30
a,b = unpack{10,20,30}  -- a = 10, b = 20, 30被丢弃

--5.2变长参数

function add(...)
local s = 0
for i,v in ipairs{...} do
    s = s+v
end
return s
end

print(add(1,2,3,4,5,6))

参数列表中的三个点表示该参数可以接受不同数量的实参

--5.3具名实参
例如在一个GUI库中,一个用于创建新窗口的函数可能会具有很多参数,其中大部分都是可选的
使用具名实参:

w = Window{x = 0, y = 0, width = 300, height = 200,
            title = "Lua", background = "blue",
            border = true
}

函数:(_Window才是真正调用创建窗口的函数)

function Window(options)
    if type(options.title) ~= "string" then
        error("no title")
    elseif type(options.width) ~= "number" then
        error("no width")
    elseif type(options.height) ~= "numer" then
        error("no height")
    end

    --其他参数时可选的
    _Window(options.title,
            options.x or 0,  --默认值
            options.y or 0,
            options.width, options.height,
            options.background or "white",
            options.border    --默认为false(nil)
        )
end
时间: 2024-10-22 15:14:33

第五章 函数 Lua程序设计笔记的相关文章

第六章 深入理解函数 Lua程序设计笔记

--第六章 深入理解函数Lua中函数是"第一类值",与其他传统类型有相同的权利:可以储存到变量或table中,可以作为函数实参传递,还可以作为函数的返回值. 函数的标准定义: foo = function(x) return x*2 end 一个函数定义实际上就是一条赋值语句,这条语句创建了一种类型为"函数"的值,并将这个值赋予一个变量. --6.1closure(闭合函数) function newCounter() local i = 0 return func

第四章 语句 Lua程序设计笔记

--第四章 语句--4.1 赋值Lua支持多重赋值,先对等号右边所有元素求值,然后进行赋值.这可以用来交换变量x, y = y, x 若值的个数少于变量的个数,则多余的变量会被赋值为nil.若值的个数多余变量的个数,则多余的值会被丢弃. --4.2局部变量与块block局部变量的作用域仅限于声明它们的那个块.一个快可以是一个执行体.一个函数或者一个chunk 尽可能使用局部变量:1避免搞乱全局环境2访问局部变量更快3局部变量随其作用域结束而消失,GC可以释放其值. local foo = foo

第三章 表达式 Lua程序设计笔记

--第三章 表达式--3.1 算数操作符--3.2 关系操作符其计算结果是true或false.如果两个值的类型不同,则Lua认为他们不相等.nil只与自身相等.对于table.userdata和函数,Lua作引用比较,只有当它们引用同一个对象时,才认为它们相等. --3.3逻辑操作符--3.4字符串连接Lua中字符串是不可变的值,连接操作符只会创建一个新字符串,而不会对员操作数进行修改.--3.5优先级Lua二元操作符中只有^ 和..是右结合,其他都是左结合 --3.6table构造式{} 混

Welcome to Swift (苹果官方Swift文档初译与注解三十五)---248~253页(第五章-- 函数 完)

Function Types as Return Types (函数类型作为返回值类型) 一个函数的类型可以作为另一个函数的返回值类型.可以在一个函数的返回值箭头后面写上一个完整的函数类型. 例如: 下面的例子定义了两个简单的函数,分别为stepForward 和 stepBackward.其中stepForward函数返回值比它的输入值多1,stepBackward函数返回值比它输入值少1.这两个函数的 类型都是(Int) -> Int: func stepForward(input: Int

Welcome to Swift (苹果官方Swift文档初译与注解三十三)---235~240页(第五章-- 函数)

Default Parameter Values (参数默认值) 在定义函数的时候,你可以给任何参数定义一个默认的值,如果定义了默认值,在调用这个函数的时候,你可以忽略这个参数. 注意: 设置参数默认值的时候,需要按照函数的参数列表最后的开始,这可以确保在调用函数的时候,即使没默认值的参数也可以按顺序的对应上,也使得函数在调用的时候更加清晰. 下面的代码例子是join函数的新版本,它使用了默认参数: func join(string s1: String, toString s2: String

Welcome to Swift (苹果官方Swift文档初译与注解三十)---225~230页(第五章-- 函数)

Functions (函数) 函数是一个执行特定任务的代码段.通过名称来标识和调用它们. 在Swift中,每个函数都有类型,包括函数的参数类型和返回值类型.这些类型与Swift中的其他类型使用起来一样,这使得函数可以作为参数传递给另一个函数,以及可以从一个函数中返 回函数,一个函数也可以写在另一个函数内部,这样可以更有效的封装和嵌套. Defining and Calling Functions (定义和调用函数) 当你在定义函数的时候,你可以选择性的命名一个或者多个参数类型值,以及函数执行后的

Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数)

In-Out Parameters (全局参数) 像前面描述的参数变量,只能在函数体内进行修改,如果你需要函数修改的它的参数值,并且希望这些改变在函数调用结束后仍然有效,可以定义使用全局参数. 定义全局参数使用关键字inout,全局参数的值在函数调用的时候进行传递,在函数体内进行修改,最后函数回传新值来替换之前的值. 全局参数在函数中,只能使用变量来当作参数,不能使用常量或者文本值作为参数.因为常量或者文本值不可以被修改.为了表明参数变量可以被修改,要在变量名的前面直接添加一个& 符号. 注意

python第五章函数

第五章 函数 5.1三元运算/三目运算 v = 前面 if 条件语句 else 后面 #如果条件成立,"前面"赋值给v,否则后面赋值给v. v = a if a>b else b # 取a和b中值较大的赋值给v # 让用户输入值,如果值是整数,则转换成整数,否则赋值为None data = input('请输入值:') value = int(data) if data.isdecimal() else None 5.2 函数 5.2.1.函数介绍 截止目前为止,都是面向过程式编

第五章函数

第五章 函数 5.1 函数的本质及应用场景 截至目前:面向过程编程(可读性差/可重用性差) 对于函数编程: 本质:将N行代码拿到别处并给他起一个名字,以后通过名字就可以找到这段代码并执行 应用场景: 代码重复执行 代码特别多超过一屏,可以选择通过函数进行代码的分割 # 面向过程编程 user_input = input('请输入角色:') if user_input == '管理员': import smtplib from email.mime.text import MIMEText fro