上一篇文章对比了基本功能。
今天来讲讲控制语句!
我的记录笔记都是根据我自身水平来讲的,如果你并没有任何程序语言的经验,可以先找本c/c++的书先学习一下,然后如果对脚本感兴趣,可以再来看我写的东西。篇幅有限,我不可能从基础讲起,抱歉。如果你熟悉c/c++,那一定能看懂我说了什么 O(∩_∩)O~。我的讲解习惯是讲一段代码,然后打印输出,然后在代码或者输出后面添加注释,说明一些原因或者原理,又或者一些需要注意的地方。如果特别一点,我还会在代码的后面拎出来再说一遍需要注意的地方。
下面从最基本的if
语句开始讲。
python:
>>> x = int(input("Please enter an integer : "))
Please enter an integer : 42
>>> if x < 0: # 如果x小余0,注意冒号,每条判断语句都有冒号
... print("x < 0") #tab缩进
... elif x == 0: # 取代 else if
... print("x == 0") #tab缩进,跟上面保持一致
... elif x == 1: # 可以有很多的 elif
... print("x == 1")
... else: # 最后只有一个else,注意冒号
... print("x > 0")
...#停止缩进,结束判断语句
x > 0 # 我们的结果
lua:
> x = tonumber(io.read())
42
>if x < 0 then -- 如果x小余0,注意 then 关键字
>> print("x < 0")
>>elseif x == 0 then -- 中间没有空格,替代c的 else if
>> print("x == 0")
>>elseif x == 1 then
>> print("x == 1")
>>else -- lua的else后面没有then
>> print("x > 0")
>>end -- lua需要用end结束判断语句
x > 0
两者都对else if
这一语句做了改造。还有,一条判断语句结束python用:
,lua用then
,整个判断的结束一个靠结束缩进,一个是end
语句。
for语句:
python:
>>> # python的for语句不同于其他,不能定义计步,
>>> # 也不能定义终止条件,只能遍历一个序列(list或者str)
>>> animals = ["dog","cat","fish"]
>>> for animal in animals: # 必须用冒号跟随
... print(animal,len(animal))
...
dog 3
cat 3
fish 4
>>> # 如果你需要遍历某个序列的时候并修改,一个好的建议是循环它的copy
>>> # ,否则你会遇到很多困惑^_^
>>> for a in animals[:]: # 必须用冒号跟随
... if(len(a) == 4):
... animals.insert(0,a)#函数 insert,指定索引位置插入数据。
...
>>> animals
['fish', 'dog', 'cat', 'fish'] #我们的最终 animals
>>> python还提供了range()函数
>>> for i in range(5): # 从0开始,指定一个结束的数字
... print(i)
...
0
1
2
3
4
>>> for i in range(5,9):#指定开始数和结束数
... print(i)
...
5
6
7
8
>>> for i in range(0,10,3): print(i) # 指定开始数,结束数,步长
...
0
3
6
9
>>> for i in range(0,-10,-5): print(i) #步长为负数
...
0
-5
>>> # 通过range我们可以做很多有意义的事情比如:
>>> language = ["lua","python"]
>>> for i in range(len(language)):
... print(i,language[i])
...
0 lua
1 python
>>> # range返回的并非是list对象,而是range对象,它是一个类
>>> print(range(10))
range(0, 10)
>>> # 如果你想要list可以这样:
>>> list(range(5))
[0, 1, 2, 3, 4]
lua:
> -- lua 的for 有两种用法,一种是数字式,一种是通用式(名字自己起的O(∩_∩)O~),看例子:
> -- 数字式
> s = ""
> for i=1,5,1 do -- 必须用 do 跟随
--[[
数字式的for可以指定三个参数,第一个参数类似c里面for的第一条语句
,只在开始的时候执行一遍;5 表示i==5的时候,是循环的终止条件;
最后一个1表示步长(默认1,可以不填),每次循环i=i+1
--]]
> s = s..i.."," --这里做了字符串拼接操作。
> end -- lua语句结束专用关键字
> s -- 查看s的内容
1,2,3,4,5,
> for i=5,1,-1 do print(i) end -- 也可以这样,倒着来,计步设为负数。
5
4
3
2
1
> for i=5,1,-3 do print(i) end -- 步长设为-3
5
2
> -- 通用式
> days = {"Sunday","Monday","Tuesday"}
> for i,v in ipairs(days) do -- 必须用 do 跟随
--[[
通用式的for循环需要用到函数 ipairs或者pairs,前者需要table的key是整数
,后者可以是任意值。
这个例子中 i获取到的就是整数值的table key,v就是table的value
注意这里的for in语法。
--]]
>> print(i,v)
>> end
1 Sunday
2 Monday
3 Tuesday
> -- pairs 的例子:
> for k,v in pairs(_G) do print(k,v) end
--[[
这里的 k,v分别获取了_G的key,value,
这个在前一篇文章我也说过,这条语句能帮我很好的记住我们有哪些可用的table和function。
--]]
xpcall function: 64358800
rawequal function: 64358f10
rawlen function: 64358ea0
pcall function: 64358910
print function: 64358f70
dofile function: 643598e0
...
> -- 这里有很多打印,我就不一一展示了。
> -- 如果你对一个不是整数当key的table去尝试遍历,输出为空。
> for i,v in ipairs(_G) do print(i,v) end
> --无输出
说到for循环,自然会想到break,它可以让我们跳出循环。lua只支持break,python除了break,还有continue和else语句。
看下面的例子:找到一个偶数
python
>>> for n in range(1,10):
... if n%2 == 0:
... print("find even is ",n)
... break;
...
find event is 2
>>> for n in range(1,10):
... if n%2 != 0:
... print(n," isn't even")
... continue
...
1 isn't even
3 isn't even
5 isn't even
7 isn't even
9 isn't even
>>> for n in range(10):
... if n>10:
... break;
... else: #注意冒号,这里的else表示如果遍历完毕;一旦中途break,这个else语句将不会执行。
... print("no number bigger than 10")
...
no number bigger than 10
>>> for n in range(1,10):
... if n > 5:
... print(n,"is bigger than 5")
... break;
... else:# 中途跳出了循环, 这里的else没有执行。
... print("no number bigger than 5")
...
6 is bigger than 5
lua
> for i=1,10 do
>> if i%2 == 0 then
>> print("find even is",i)
>> break -- 后面还会介绍return
>> end
>> end
find even is 2
这里还需要讲的是python的 pass
语句,由于我们的python是依赖缩进的,但是如果像for循环必须要一条内嵌语句,但我们又不需要做任何事,如果填空行是会报错的,这时候pass
就派上用场了
python
>>> for n in range(5):
... pass
...
两者还有其他循环,这里一并展示
python
>>> while i<5 : # while 循环
... print(i)
... i = i+1 # python和lua都不支持 i++和i--
... else: # 如果没有中途跳出循环。
... print("end")
...
1
2
3
4
end
>>> # python 没有 do while循环。
lua
> i = 5
> while i > 1 do -- while 循环
>> print(i)
>> i = i-1
>> end
5
4
3
2
> i = 5
> repeat -- do while 循环
>> print(i)
>> i = i-1
>> until i == 0
5
4
3
2
1
两者都舍弃了 c中的switch case。
未完待续。。。