基本的控制结构
Nim 是命令式的语言,也支持函数风格,也支持类和对象。 基本的控制结构还是老样子 for while if else … 基本上和 python 差不多 不过,增添了 case 语句
var x = 76
case x
of 1..10:
echo "small"
of 99,100:
echo "big"
else:
echo "normal"
用 if elif 等也能完成,可以能是 python 不用case的原因吧 基本的循环次数控制,不用 python 的range 方式,更简单:
for i in 3 .. 8:
echo i
会输出从 3 到 8 的数字, 如果不希望包含结尾数字,则
for i in 3 ..< 8:
echo i
则结果是:
3
4
5
6
7
与 python 一样,for 可以作用于任何 iterable 的对象 字符串当然是可以的。
for c in "hello!":
echo c
会逐一输出每个字符 如果我们想要同时知道序号,并不需要像python那样用 enumerate 而是直接写两个变量接收就好了:
for i, v in "hello":
echo i, " => ", v
程序输出:
0 => h
1 => e
2 => l
3 => l
4 => o
while 的用法与 python 一样。
var a = 1
while a * a < 30:
echo a
inc a
会输出:
1
2
3
4
5
collections 常用容器
array 数组
这个类型在 python 没有内置提供,python 只提供了 list set dict 等 nim 的数组要求在编译时已知大小,元素类型,并且长度不能变化。
var
a: array[3,int] = [1,2,3]
b = ["hello", "tom", "haha"]
c: array[4,int]
c[1] = 100
echo a
echo type(b)
echo c
运行结果:
[1, 2, 3]
array[0..2, string]
[0, 100, 0, 0]
可见,数组的类型有两部分信息,一个是长度,一个是元素类型 数组中只能装同种类型的元素,这与 python 不同 数组类型可以推断 数组也可以先不赋值,这样就用默认的值初始化
var x = [ ] 像这样写,在python中很常见,这里不行,因为编译器无法推断出类型。
sequence 序列
大约相当于 python 中的list 其长度不固定,可以动态变化 但,元素类型要统一
var
a: seq[int] = @[]
b = @["hello", "tom"]
a.add(100)
a.insert(99,0)
b.add(["i", "am"])
echo a
echo b
运行结果:
@[99, 100]
@["hello", "tom", "i", "am"]
注意到,增加单个元素和增加多个元素用的都是 add seq 的字面常量要前边加个 @,稍显难看
index slice 索引和切片
数组,序列,字符串等都可以索引和切片 索引可以从前开始,也可以从尾开始 python 中的 -1 这里用 ^1 python 中的 2:5 这里用 2..4 当然也可以 2..< 5 切片的赋值能造成插入或删除的效果 但对数组,一定要满足数目相同的限制
var
a = "hello,tom"
b = [10,20,30,40]
c = @[1,10,100]
echo a[0], a[^1] # 取首尾字符
b[2..^1] = [300,400]
c[1..2] = [9,99,999,9999]
echo b
echo c
运行结果
hm
[10, 20, 300, 400]
@[1, 9, 99, 999, 9999]
tuple 元组
nim 的元组与 python 出入较大 python 中元组是不可变的,nim 中可以自己控制是否可变 (var let …) nim 中元组的项可以有个名字,便于访问 每个元组都有类型,类型包含了每一项的类型 这样可以在赋值时严格检查
var
a = ("zhangsan", 15, 22.5)
b = (name: "fish", weight: 100)
a[0] = "Apple"
b.weight = 200
echo type(a), " ------ ", a
echo type(b), " ------ ", b
运行结果:
(string, int, float64) ------ ("Apple", 15, 22.5)
tuple[name: string, weight: int] ------ (name: "fish", weight: 200)
|