下面是两者拼接字符串的区别
python:
>>> print("un" + "ium") #能拼接两个常量字符串
unium
>>> a = "un"
>>> print(a + a + "ium") #也能拼接变量(类型需要是str,否则报错)和常量字符串,lua中的加号不能拼接字符串,但有其他功能
ununium
>>> print("un" "ium" "un" "ium")
'''
自动拼接相邻的字符串,不过这个只能拼接常量字符串,不能拼接变量和常量字符串;但是可以用来对很长的打印信息分行,打印结果也是单行的。lua不行
'''
uniumunium
>>> print(a*3) #这个比较厉害,可以对字符串做乘法,意思就是重复字符串,lua不可以
ununun
lua:
> print("un" .. "ium") -- 类似python的+,但是python不具有这个操作符
> a = "un"
> print(a .. a .. "ium") -- 类似python的+
ununium
> print(10 .. 20) -- 还能连接数字,输出类型是string,注意点点要跟数字10分开,不然会被当成小数的。
1020
> print(10 ..20) -- 不推荐这样写
1020
> a = "10"
> print(a + 1) -- 当一个string加number的时候,lua会先判断这个string能否转换成number(tonumber函数),能就得出加出来的数,否则报错
11.0
> a = "10a"
> print(a+1) -- 这里就报错了
stdin:1: attempt to perform arithmetic on a string value (global 'a')
stack traceback:
stdin:1: in main chunk
[C]: in ?
对字符串中某个字符的读取也不一样,python提供的功能更强大,lua只能走string的函数
python:
>>> # 在python中索引起步是0
>>> a = "1234567"
>>> print(a[0])
1
>>> print(a[-1])
7
>>> print(a[2:4]) # : 这个符号对应的区间是:[) 前面闭区间,后面开区间
34
>>> print(a[2:0]) # 等同 print(a[-5:-7])
#无输出
>>> print(a[-3:-1])
56
>>> print(a[:2])
12
>>> print(a[2:])
34567
>>> a[8] # 越界访问
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> a[-8:] # 越界,输出全部
'1234567'
'''
对应的字符串索引图表就是
+---+---+---+---+---+---+---+---+---+---+
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+---+---+
0 1 2 3 4 5 6 7 8
-9 -8 -7 -6 -5 -4 -3 -2 -1
'''
>>> a[0] = "a" # 不能赋值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> len(a) #查看字符串长度
7
lua:
> -- 在lua中索引起步是1,嘿嘿,区别于各种语言
> a = "1234567"
> print(string.sub(a,1)) -- 当然你要把这里的1改成0也是可以的,不推荐
1234567
> print(string.sub(a,2,1)) -- 无输出
> print(string.sub(a,3,3)) -- 等同python的a[2:3],python不许这种写法:a[2:2]。
> -- 所以我们就知道了,对于lua,它的区间是:[] 前后闭区间
3
> string.sub(a,8) -- 越界了,无输出
> string.sub(a,-8) -- 越界了,输出全部
1234567
--[[
对应的字符串索引图表就是,
+---+---+---+---+---+---+---+---+---+---+
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+---+---+
0 1 2 3 4 5 6 7 8 9
-9 -8 -7 -6 -5 -4 -3 -2 -1
--]]
> string.len(a) --查看字符串长度
7
对于用正向索引还是负向索引看哪个用的方便吧,一般用正向的。
通过上面的比较,python对字符串访问提供的功能更多,lua要更接近C的方式一点(只能通过函数操作)。 python还有list类型,lua可以通过table的方式实现类似的功能,看例子:
python: >>> lst = [1,4,9,16]
>>> type(lst)
<class 'list'>
>>> lst[0] # []的访问跟上面字符串的访问一样
1
>>> lst[1]
4
>>> lst[2]
9
>>> lst[1:10] # lua不支持
[4, 9, 16]
>>> lst[-1]
16
>>> id(lst)
35530696
>>> id(lst[:]) # 每次[]操作,返回都是新的list对象
35530888
>>> lst2 = [25,36]
>>> lst + lst2 # python还支持两个list的串联
[1, 4, 9, 16, 25, 36]
>>> lst[3] = 81 # list不同于str,可以赋值
>>> lst
[1, 4, 9, 81]
>>> lst.append(100) # 通过append函数追加数据
>>> lst
[1, 4, 9, 81, 100]
>>> # python不仅可以单个赋值还能区间赋值 这个lua没有
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # 替换成大写
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # 删除它们
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # 用一个空的来清空这个list
>>> letters[:] = []
>>> letters
[]
>>> len(letters) # 使用函数 len 查看容量
0
>>> letters = [1,2,3,"a","b"] # 虽然python支持,但是我们最好不要这样做,数据类型最好要保持一致
>>> letters
[1, 2, 3, 'a', 'b']
>>> a = ['a', 'b', 'c'] # python还支持list嵌套
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
lua: > lst = {1,4,9,16}
> lst
table: 00448638
> lst[1] -- lua从索引1开始
1
> lst[2]
4
> lst[3]
9
> lst[-1] -- lua的table []操作不支持负数访问
nil
> lst1 = {25,36}
> lst + lst2 -- lua 不支持 table相加,如果要实现这个功能需要借助table的函数,后面再说~
stdin:1: attempt to perform arithmetic on a table value (global 'lst')
stack traceback:
stdin:1: in main chunk
[C]: in ?
> lst[4] = 81 -- lua也可以赋值
> lst[4]
81
> #lst -- 通过 # 来取得 table 的容量
4
> letters = {1,2,3,"a","b"} -- 虽然lua可以这样做,但是我们尽量保证我们的table数据类型一致
> letters[1]
1
> letters[4]
a
> a = {"a","b","c"} —— lua也支持table嵌套
> n = {1,2,3}
> x = {a,n}
> x[1][1]
a
> x[2][1]
1
|