Python 和 Lua 学习比较 二

上一篇文章对比了基本功能。
今天来讲讲控制语句!
我的记录笔记都是根据我自身水平来讲的,如果你并没有任何程序语言的经验,可以先找本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。

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值