为什么要有名字,为什么要有类型?_代码之髓书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 代码之髓 > 为什么要有名字,为什么要有类型?
Architect 代码之髓 的书评 发表时间:2015-05-02 20:05:32

为什么要有名字,为什么要有类型?

为什么要取名:
最初是“给3456号的数值加一”后来人们觉得应该给内容或者位置取一个容易理解的名字。相比于“取出ISBN编号是978-123-4857-293的书”,“取出《Python程序设计》这本书”更人性化一点。

while语句是让反复执行的if的判断更加简洁。for语句的出现是让while语句变得更简洁,

为什么要有类型:
因为不同形式的数据的存储形式不同,拿简单的数字来说吧,有定点数和浮点数,定点数的存储的二进制形式如果看作是浮点数那就相差极大。所以要定义类型,不同类型的数据之间做运算也很复杂。

如果是整型,x/2的小数点后面的数据就应该舍去。但是对于浮点型,不舍去。Python中x/y是不舍去的运算,而x//y设计成舍去的。

静态变量和动态变量:动态类型在LISP中应用,Python中也借鉴了。把类型的信息和数值看作整体的方式叫做动态类型。
Python中不管是整数还是浮点数还是字符串,都看作是pyObject对待,开始部分都是一样的。

实数:
使用次数+值的类型[浮点数]+值[浮点数值]
字符串:
使用次数+值的类型[字符串]+大小+散列值+状态+第0个字符+第1个字符...

各种各样的容器:
在不同的语言中,容器的名称不同,性质各异。比如,C语言中的数组、LISP中的列表、Python语言中的元组以及Ruby语言中的数组。即使是名字相同,在不同语言中表达的意思也可能不一样。比如,LISP语言和Haskell语言中的列表,与Java语言和Python语言中的列表在内部构造上完全不同。不同语言中名称的差异是导致混乱的根源。LISP中的列表指链表,有时候单说列表指的就是链表。而Java语言中的列表(java.util.List)则是一种有能放入多个元素的功能的接口。java.util.LinkedList<E>就变成一种链表,这和LISP语言中的列表概念就比较接近了。元组也是表示能放入多个元素的东西,但Python语言中的元组和Haskell语言中的元组的共通点就很少。Python语言中的元组是不可变更的列表,而Haskell语言中的列表本来就是不可变更的。Haskell语言中的元组是可以存放不同类型数值的列表,而Python语言中的列表本来就可以存放不同类型的数值。Ruby语言中的数组(array)是“数组类”,具有C语言数组没有的很多功能,反而更加接近Python语言中的列表的概念。

数组和链表
如果同一个容器放入相同的三个数据A、B、C,数组中,三者是顺序存放的。链表(Linked List)中存放A的数据的下一个箱子还存放有下一个值在何处的信息。存放C的数据的下一个箱子存放的是0,表示没有下一个值了。

乍一看,链表这种数据存放的方式要消耗两倍于数组的内存。但是长处也是很明显的,如果要在A和B中插入数据Z,数组必须把整个数据复制一遍,这对于数据量相当大的数据比如100000个元素,工作量就相当大了。

但是对于链表,只需要把A的下一个箱子的位置指向Z数据的地方,这样就结束了。

链表的长处和短处:
对于插入和删除数据,链表的计算量是O(1),读作常数的数量级,或者常数时间,即如果处理的数据量n翻倍,计算所花费的时间不变;而数组是O(n),即n的数量级,也称线性时间,如果数据量n翻倍,计算所花费的时间也翻倍。
链表也有短处。数组中存放方式是固定的,因此容易找到第n个元素,找相应的数组,在哪儿开头,相应的加上元素的下标,就是对应元素的位置,计算量是O(1);链表中的元素可以放置在任意喜欢的位置,因此必须从头找起,找每个元素,指向下一个元素,这样计算量是O(n)

字典:
数组是整数和值的对应,当问到第10个数值是多少时,它能告知第10个数值是3.
字典是字符串(或者其他类型)与数值的对应,被问到“age”对应值是多少,告知“age”值是31.这里的字符串被称为字典的键。例子是对于一个人,有这么一些信息,name=Taro, age=31, score=80 ...

对于字符串与值的对应有多种实现形式,常用的方法是散列表和树。例子,有三个小孩,Ichiro, Hanako and Jiro, age: 5, 4, and 3.
散列表:
通过散列函数,将字符串和一个数值对应,这个数值表示了字符串对应的值(age)所在的位置。再把数值(age)放在相应的位置。
树:
                left right Ichiro 5
               ↙ ↘
left right Hanako 4 left right Jiro 3

以Ichiro为根,放入其值,再判断Hanako,在其左边,left的空格指向Hanako,再追加Jiro元素,右边的空格指向Jiro,如果还有其他元素,放在Hanako的下面或者Jiro下面。

树的优势:
数组找一个元素,要么第一个,或者最后一个,平均期望是n/2, 复杂度O(n)
而树要做到两遍平衡,就能实现二分查找,复杂度O(log n) 二叉树或者红黑树的平衡也是个研究问题。
散列表的优势:
只需要把字符串转化为数组的位置信息,再在该位置读取出这个值,复杂度O(1)
散列表需要时间数量级最小。内存方面看,数组方法占用内存最小,散列表需要很大的数组,内存占用最大。

没有万能的容器,需要权衡复杂度(处理数据量的时间)和内存和数据量的大小。

字符:
莫斯码、ASCII码、乱七八糟各种码。统一在于Unicode
编辑器比如Vim和Emacs,用记号实现声明该文件的打开方式,称为魔幻注释符:
# -*- coding: Unicode UTF-8 -*-

字符串:字符并列的结果
C语言不知道自身的长度,其他Pascal、Java、Ruby和Python几种语言都能知道自身的长度,C语言字符串是最原始的字符串。
C语言表示该字符串的结束,使用NUL字符,是一种与0对应的字符,C中用表示。可能会产生奇怪的错误。"abcefg"只显示前三个字符abc,而设定内存为3的字符串char放入“abc”因为没有后面的,在输出的时候,会和后面的字符串纠结在一块输出。

并行处理:同时使用音乐,浏览器和字符处理软件。
在一个CPU的情况下如何并行:极短的时间内,交替处理任务。交替的两种方法:
协作式多任务模式:
在合适的节点自发地进行交替。有可能某个处理一直找不到合适的节点进行任务切换而持续地进行,导致其他处理无法等到执行的机会。Windows3.1和Mac OS 9都是协作式多任务系统。以后就改进了
抢占式多任务模式:
有一个比其他程序都有优势的程序任务管理器,在一定时间后强制中断正在进行的处理,以便允许其他程序的执行,能在人们察觉不到的中断时间比如20毫秒或0.02秒实现交替。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读