- > 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