Elixir 简明笔记(七)--- 列表

列表是Elixir中重要的数据结构。相信其他编程语言中也有类似列表的结构。Lisp的命名来自对列表的处理。在C,Java语言中,列表类似数组结构。Elixir的列表远比数组强大,它更像高级语言python的列表。

列表的定义

Elixir中使用方括号[]定义一个列表,列表的元素可以是任意Elixir类型,列表可以没有元素,即空表,也可以是任意多个元素。列表还可以去嵌套。


iex(1)> l = []
[]
iex(2)> is_list l
true
iex(3)> l1 = [1, 2, :hello, "word", [1, 3]]
[1, 2, :hello, "word", [1, 3]]
iex(4)>

head和tail

Elixir列表是一个的存储结构是链表。也就是说,当你访问列表的第一个元素的时候,速度会很快。但是要访问其中的某个元素,将会带来比较大的开销。因为访问n个元素的时候,必须先遍历n-1个元素。

因此,由于列表的第一个元素比较特殊,访问数独快嘛。就单独给了它一个名字,列表头(head),除了head之外,剩下的元素即位列表尾(tail)。只有一个元素的列表head就是那个元素,tail为空,空列表的没有head和tail。Elixir提供了两个内置函数hd和tl分别访问列表的head和tail。

iex(1)> l = [1, 2, 3, 4]
[1, 2, 3, 4]
iex(2)> hd l
1
iex(3)> tl l
[2, 3, 4]
iex(4)> hd []
** (ArgumentError) argument error
    :erlang.hd([])
iex(5)> tl []
** (ArgumentError) argument error
    :erlang.tl([])
iex(6)> hd [:sigle_element]
:sigle_element
iex(7)> tl [:sigle_element]
[]

|操作符

列表的head和tail十分重要。Elixir提供了一个操作符用于把head和tail连接起来。

iex(1)> head = 1
1
iex(2)> tail = [2, 3, 4]
[2, 3, 4]
iex(3)> [head | tail]
[1, 2, 3, 4]
iex(4)>

实际上,列表就是使用|递归定义的,之前我们写的[]加元素,其实是列表定义的一个语法糖。

iex(1)> [1, 2, 3]
[1, 2, 3]
iex(2)> [3|[]]
[3]
iex(3)> [1|[2|[3|[]]]]
[1, 2, 3]

模式匹配

函数式语言最重要的是一个特性就是模式匹配。Elixir的列表也可以进行模式匹配。|既然可以连接列表的head和tail,实际上也是把列表分为head和tail。那么就可以使用模式匹配。这个技术很强大,尤其是在函数递归调用的时候。

iex(1)> l = [1, 2, 3, 4]
[1, 2, 3, 4]
iex(2)> [head|tail] = l
[1, 2, 3, 4]
iex(3)> head
1
iex(4)> tail
[2, 3, 4]

列表的操作符

列表可以通过++符号连接两个列表,也可以通过--把列表进行相减。in判断是否属于成员。

iex> [ 1, 2, 3 ] ++ [ 4, 5, 6 ] 
[1, 2, 3, 4, 5, 6]
iex> [1, 2, 3, 4] -- [2, 4] 
[1, 3]
iex> 1 in [1,2,3,4]
true
iex> "wombat" in [1, 2, 3, 4]
false

列表还是元组

看起来|++都可以连接列表,但是在某些应用场景还是有区别的:

iex(1)> l = [1, 2, 3]
[1, 2, 3]
iex(2)> [0] ++ l
[0, 1, 2, 3]
iex(3)> [0|l]
[0, 1, 2, 3]
iex(4)> l ++ [4]
[1, 2, 3, 4]

我们知道,列表是链表,访问第一个元素很快,可是访问列表中其他的元素会很慢。所以使用++的时候在末尾追加列表会很慢。需要访问链表的最后一个元素,这就重建了原先的列表,让原先列表的末尾元素指向那个新元素。

还记得元组么,元组的数据结构是顺序的线性表,元组在内存中是连续存储的。因此可以通过元素的下标访问元组的元素,并且这样的操作速度很快,但是元组在修改或添加元素时开销很大,因为这些操作会在内存中对元组的进行整体复制。

因此,选择列表还是元组,本质上是对顺序线性表和线性链表的选择。

函数式语言

本节只是对列表进行简单的介绍。我们不止一次说过列表的强大,模式匹配配合列表将会是Elixir强大的表现力。此外,我们在介绍字典类型结构的是时候,将会介绍键值列表。一种有键值对的列表。在介绍模块,尤其是Enum模块提供了对列表的操作。

到目前为止,我们希望函数式语言带来不同的编程思想,Think Different。通过对前面的学习介绍,可以对Elixir和函数式编程语言有了比较感性的感觉。可是除了语言的表达操作上与常见的编程语言有所不同,但也没有太大的不同。为了解决这个疑惑,我们将会在下一节介绍所谓的函数式语言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容