电子说
今天我们继续学习Lua语法基础教程,中篇。
变量,可以看作是一个桶,在里面装你想要装的内容。这些内容可以是Lua包含的所有合法类型。
例如:我想要新建一个桶,名叫bucket,在里面放入233这个数字,就可以像下面一样:
bucket = 233
让我们试着自己新建几个变量吧!
--新建三个变量,并赋值
year = 1926
month = 8
day = 7
--打印出三个变量的值
print(year,month,day)
nil类型表示没有任何有效值,只要是没有声明的值,它就是nil
比如我打印一个没有声明的值,便会输出nil:
ccc = 233
print(ccc)
print(aaa)
这里需要你思考一下,运行以下代码,将会输出什么结果?
a = 1
b = '2'
c = a
print(a,b,c,d)
赋值是改变一个变量值的最基本的方法。
如下面一样,使用等号对左边的变量进行赋值
n = 2
n = 3
n = n + 1
b = n
Lua可以对多个变量同时赋值,变量用逗号分开,赋值语句右边的值会依次赋给左边的变量。
n = 1
a, b = 10, 2*n
当左右值的数量不一致时,Lua会进行下面的设定:
下面的例子可以展示这种设定:
a, b, c = 0, 1
print(a,b,c)
--输出0 1 nil
a, b = a+1, b+1, b+2
print(a,b)
--输出1 2
a, b, c = 0
print(a,b,c)
--输出0 nil nil
这里需要你思考一下,运行以下代码,将会输出什么结果?
a,b,c = 1,2,3
a,c = a+1,b
d = c,b
print(a,b,c,d)
这部分需要你自己完成一个任务:
已知下面的代码,并且已知a
和b
的值,请在交换他们的值,使打印输出12 34
a = 34
b = 12
--你需要在这里进行交换变量的操作
--提示:新建一个变量来存放临时的值
print(a,b)
我们已经知道了,在Lua中,可以使用print函数来打印你想要得到的结果。
同时在上一节,我们学会了新建变量和设置变量的值。
让我们试着输出某个变量吧!使用print函数
,输出已知变量。 我们已知变量num
为某个数字,试着输出它的值吧!
num = 123
--请补全代码,输出num的值
print(你要在这里填东西)
运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。
上一节中,新建的数字变量,我们称之为number类型的变量。
本节我们来学习使用算术运算符,如下所示:
/ 除法
% 取余,求出除法的余数
^ 乘幂,计算次方
我们可以通过以下实例来理解算术运算符的应用:
a = 21
b = 10
c = a + b
print('a + b 的值为 ', c )
c = a - b
print('a - b 的值为 ', c )
c = a * b
print('a * b 的值为 ', c )
c = a / b
print('a / b 的值为 ', c )
c = a % b
print('a % b 的值为 ', c )
c = a^2
print('a^2 的值为 ', c )
c = -a
print('-a 的值为 ', c )
c = a * (b - a)
print('a * (b - a) 的值为 ', c )
你需要完成下面的任务:
已知,一个长方体的长宽高分别为a、b、c(单位米),且这个物体重量为m(单位克)
请打印出物体的密度(单位g/m³)
注:密度计算公式 密度 = 质量 / 体积
a,b,c = 1,2,3 --长宽高
m = 10 --重量
--请打印出物体的密度
字符串(即string),就是一串文本数据,可以存储你要的文本。
在第二节中,print出的数据就是一个字符串。
Lua 语言中字符串可以使用以下三种方式来表示:
你可以参考下面的例子来深入理解:
--双引号间的一串字符
str1 = "Lua"
--单引号间的一串字符
str2 = 'Lua'
--[[和]]--间的一串字符
str3 = [[Lua]]
str4 = [[使用双括号时,甚至能包含换行数据
换行了
最后一行]]
--输出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)
接下来你需要完成下面的练习:
新建三个变量s1、s2、s3
分别存入字符串数据:str、abc、233,使输出打印正确
--请在空白处补全代码
print("s1,s2,s3的值:",s1,s2,s3)
print("s1,s2,s3的类型:",type(s1),type(s2),type(s3))
在上一节中,我们学习了如何声明字符串。
但是我们有时候会遇到一些特殊的问题,如:如何输出单引号和双引号?如何输出回车换行?
也许我们可以用下面的方式简单规避,输出单引号时,声明字符串用双引号括起来,像下面这样
str = "'"
同理,输出双引号时,声明字符串用单引号括起来,像下面这样
str = '"'
但是,这样会出现一个问题:如何同时显示单引号和双引号?这里就需要转义字符登场了。
转义字符用于表示不能直接显示的字符,比如后退键、回车键、等。
以 开头的都是转义字符,下面时常用的转义字符格式:
转义字符 | 含义 |
---|---|
n | 换行(LF),将当前位置移到下一行开头 |
r | 回车(CR),将当前位置移到本行开头 |
反斜杠字符 | |
' | 单引号 |
" | 双引号 |
� | 空字符(NULL) |
ddd | 1到3位八进制数所代表的任意字符 |
xhh | 1到2位十六进制所代表的任意字符 |
例如,如果我们想给str赋值一个单引号,一个双引号('"),那么我们可以这样写:
str = "'""
下面需要你来完成一个简单的任务:
新建一个变量str,给str赋值为
abcd"ef'gh]]
并打印出来
str = --补全代码
print(str)
--输出应为abcd"ef'gh]]
字符串和字符串可以相加吗?可以!我们可以用拼接符号来将两个独立的字符串拼起来。
我们使用..
来表示字符串拼接符号,如下面的示例代码:
print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)
下面你要完成这个任务:
已知三个字符串变量s1
、s2
、s3
请将他们按顺序拼接起来,存入all
,并使用print输出结果
s1,s2,s3 = "aaa","bbb","ccc"
all = --请补全代码
print(all)
上面一节学习了如何拼接字符串,这个方法固然很好用,但是有时候我们会遇到一个需求,那就是把number
类型的变量和string
类型的变量拼接起来,组成一个新的string
比如下面的变量n
和s
,如何拼接起来呢?
n = 123
s = 'm/s'
我们可以直接将number
类型的变量n
转换成string
类型的值,这样就可以拼接了
使用tostring(value)
函数即可实现这一操作:
n = 123
s = 'm/s'
result = tostring(n)..s
print(result)
下面你要完成这个任务:
已知三个变量n1
、s
、n2
然后将他们按顺序拼接起来,存入变量result
,使输出结果正确
小提示:在某些情况下,Lua会自动将number类型转换成string类型
n1,s,n2 = 1,"abc",2
result = --请补全代码
print(result)
6.5 string转number
上面一节学习了如何将number转成string,这一节我们来学习如何将string转成number
比如下面的变量s
,存储的内容是一个字符串,但是代表了一个数字,如何转成number再与n相加计算呢?
n = 123
s = '2333'
我们可以直接将string
类型的变量s
转换成number
类型的值,这样就可以计算了
使用tonumber(value)
函数即可实现这一操作:
n = 123
s = '2333'
result = tonumber(s) + n
print(result)
下面你要完成这个任务:
已知三个字符串变量s1
、s2
、s3
,其内容均为纯数字
请计算他们的算术和,赋值给新建的变量result
,使下面代码输出正确结果
s1,s2,s3 = "11","12","100"
result = --请补全代码
print(result)
布尔型(boolean)只有两个可选值:true(真) 和 false(假)
Lua 把 false 和 nil 看作是false,其他的都为true(包括0这个值,也是相当于true)
Lua 中也有许多的关系运算符,用于比较大小或比较是否相等,符号及其含义如下表:
符号 | 含义 |
---|---|
== | 等于,检测两个值是否相等,相等返回 true,否则返回 false |
~= | 不等于,检测两个值是否相等,相等返回 false,否则返回 true |
> | 大于,如果左边的值大于右边的值,返回 true,否则返回 false |
< | 小于,如果左边的值大于右边的值,返回 false,否则返回 true |
>= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false |
<= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false |
我们可以通过以下实例来更加透彻的理解关系运算符的应用:
a = 21
b = 10
print('==的结果',a==b)
print(' =的结果',a =b)
print('>的结果',a>b)
print('<的结果',a
print('>=的结果',a>=b)
print('<=的结果',a<=b)
下面问题来了,运行以下代码,将会输出什么结果?请自行思考
a = 1
b = '1'
c = a
d = 2
print(a == b)
print(c == a)
print(a ~= b)
print(d <= c)
逻辑运算符基于布尔型的值来进行计算,并给出结果,下表列出了 Lua 语言中的常用逻辑运算符:
符号 | 含义 |
---|---|
and | 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B |
or | 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B |
not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false |
我们可以通过以下实例来更加透彻的理解逻辑运算符的应用:
print('true and false的结果',true and false)
print('true or false的结果',true or false)
print('true and true的结果',true and true)
print('false or false的结果',false or false)
print('not false的结果',not false)
print('123 and 345的结果',123 and 345)
print('nil and true的结果',nil and true)
下面问题来了,运行以下代码,将会输出什么结果?
a = 1
b = '1'
c = 0
print(a and b)
print(c or a)
print(not b)
print(d and c)
print(1 < 2 and 3 > 2)
题目:如果已知number变量n
,那么如果需要判断n是否符合下面的条件:
3
以下四行判断代码,正确的是?
(返回true即表示变量n
符合要求)
n = 1--这个数可能是任意数字
print(n > 10 or n <= 3)
print(n <= 10 or n > 3)
print(n < 3 and n >= 10)
print(n <= 10 or n > 3)
上面一节学习了布尔类型,那么这个需要用到哪里呢?我们需要用它来进行某些判断。
在Lua中,可以使用if语句来进行判断,如下面所举例的代码,可以判断n是否为小于10的数:
n = 5
if n < 10 then
print('n小于10')
end
我们整理一下,实际上if语句就是如下结构:
if 条件 then
符合条件的代码
end
下面是你需要完成的事:
已知变量n
,请判断n
是否为奇数,如果是,请给n
的值加上1
如果你觉得有难度,请查看下面的提示:
n
除以2的余数:n % 2n
的值加上1:n = n + 1--已知一个number变量n
n = 5 --这个数字是几都有可能
print("n在判断前的值",n)
if 你的条件 then
要做的事
end
print("n在判断后的值",n)
上面一节学习了简单的if语句写法,这一节我们来学习多条件分支语句
在Lua中,可以使用if语句来进行判断,同时可以使用else语句,表示多个分支判断
if 条件1 then
满足条件1
elseif 条件2 then
不满足条件1,但是满足条件2
else
前面条件全都不满足
end
举个例子,比如有一个数字n
:
太小
,适中
,太大
,那么代码就像如下这样:
n = 1--更改这个数多运行几次试试
if n >= 0 and n < 5 then
print('太小')
elseif n >= 5 and n < 10 then
print('适中')
elseif n >= 10 then
print('太大')
end
注意:else和elseif都是可选的,可有可无,但是end不能省略
下面是你需要完成的事:
已知变量n,请判断n是否为奇数,
--已知一个number变量n
n = 5 --这个数字是几都有可能
print("n在判断前的值",n)
if 你的条件 then
要做的事
else
要做的事
end
print("n在判断后的值",n)
你需要使用前面几章的知识,来完成下面的题目
已知三个number类型的变量a、b、c,分别代表三根木棒的长度
请判断,使用这三根木棒,是否可以组成一个三角形(两短边之和大于第三边)
a,b,c = 1,2,3--多改几个数值自行测试
--补全代码
我们在前面了解到,Lua 把 false 和 nil 看作是false,其他的都为true(包括0这个值,也是相当于true)
那么问题来了,执行下面的代码,将会输出什么?
result = ''
if 0 then
result = result..'T,'
else
result = result..'F,'
end
if a then
result = result..'T'
else
result = result..'F'
end
print(result)
函数是指一段在一起的、可以做某一件事儿的程序,也叫做子程序。
在前面的内容中,我们已经接触过了函数的调用,这个函数就是前面用到了很多次的print(...)。
调用函数只需要按下面的格式即可:
函数名(参数1,参数2,参数3,......)
为何要使用函数?因为很多事情都是重复性操作,我们使用函数,可以快速完成这些操作
下面我们举一个最简单的函数例子,这个函数没有传入参数、没有返回值
它实现了一个简单的功能,就是输出Hello world!:
function hello()
print('Hello world!')
end
这个函数名为hello,我们可以按下面的方法进行调用(执行):
function hello()
print('Hello world!')
end
hello()
这行代码会输出Hello world!。
同时,在Lua中,函数也是一种变量类型,也就是说,hello实际上也是一个变量,里面存储的是一个函数,我们可以用下面的代码来理解:
function hello()
print('Hello world!')
end
a = hello
--把hello函数同时赋值给a变量
a()
hello()
--a和hello变量指向同一个函数
--所以执行结果和hello()相同
因为函数只是个变量,你甚至在一开始可以这样声明hello函数:
hello = function()
print('Hello world!')
end
hello()
下面你需要做一件简单的事情:
biu
,使其执行后会打印biubiubiu
这个字符串pong
,使其与biu
指向的函数相同--请在此处补全代码
--请使下面的调用可以正常打印出biubiubiu
biu()
pong()
print("biu和pong相等吗?",biu==pong)
之前我们创建的变量,都是全局变量,这种变量在代码运行周期从头到尾,都不会被销毁,而且随处都可调用。
但是当我们代码量增加,很多时候大量新建全局变量会导致内存激增,我们需要一种可以临时使用、并且可以自动销毁释放内存资源的变量,要怎么解决呢?
我们可以使用local标志来新建临时变量,使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。
参考下面的代码:
a = 123
function add()
local n = a+2
print(n)
end
add()
print(n)
上面的代码中,n就是一个局部变量,它只在这个funcion中有效,并且函数运行完后会自动回收这部分的内存。
我们应该尽可能的使用局部变量,以方便lua虚拟机自动回收内存空间,同时减少资源占用提高运行速度。
下面请阅读以下代码,思考一下,正确的输出结果是什么:
str = 'abc'
function connect()
local s = str..'def'
end
print(s,str)
在前几章的使用中,我们知道函数是可以传入参数的,如print(123)
那么,我们如何编写可以传入参数的函数呢?可以按下面的模板来写
function 函数名(参数1,参数2,...)
代码内容
end
这里传入的参数,等价于在函数内部新建了一个local的变量,修改这些数据不会影响外部的数据(除了后面还没有讲到的table等类型)
举个例子,比如下面的函数,可以实现打印出两个传入值的和:
function add(a,b)
print(a+b)
end
add(1,2)
--会输出3
这段代码其实等价于:
function add()
local a = 1
local b = 2
print(a+b)
end
add()
下面问题来了,请设计一个函数p,可以按下面的调用方式来打印出物体的密度:
--补全这个函数的代码,满足题目要求
function p(a,b,c,m)
print()
end
--一个长方体的长宽高分别为a、b、c(单位米)
a = 1
b = 2
c = 3
--这个物体重量为m(单位克)
m = 230
--下面打印出密度
--注:密度计算公式 密度 = 质量 / 体积
p(a,b,c,m)
接下来我们会分享最后一部分。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !