1.1 数字

现在更多人把计算机叫作电脑,英文是Computer。只要提到它,普遍都会想到它能够比较快地做加减乘除,甚至乘方、开方等各种数学运算。

有一篇名为《计算机前世》的文章(参见:http://www.flickering.cn),这样讲到:

先来看看计算机(Computer)这个词是怎么来的。英文学得好的小伙伴看到Computer,第一反应是:“compute-er”,应该是个什么样的人吧,对,“做计算的人”。叮咚!恭喜你答对了。最先被命名为Computer的确实是人。也就是说,电子计算机(与早期的机械计算机)被赋予这个名字是因为他们执行的是被分配到的人的工作。“计算机”原来是工作岗位,它被用来定义一个工种,其任务是执行计算,诸如导航表、潮汐图表、天文历书和行星的位置要求等的重复计算,从事这个工作的人就是Computer,而且大多是女神。

原文还附有如图1-1所示的图片。

所以,以后要用第三人称来称呼Computer,请用She(她)。现在你明白为什么程序员中那么多“他”了吧,因为Computer是“她”。

1.1 数字 - 图1图1-1 从事Computer工作的人

1.1.1 数字

在Python中,对数的规定比较简单,达到了小学数学水平即可理解。

首先,进入到Python的交互模式中,不管是什么操作系统,相信你总能找到那个交互模式。然后模仿下面的操作:

  1. >>> 3
  2. 3
  3. >>> 3333333333333333333333333333333333333333
  4. 3333333333333333333333333333333333333333L
  5. >>> 3.222222
  6. 3.222222

在交互模式下,如果输入3,就显示了3,这样的数称为整数,这个称呼和小学数学一样。

当输入一个比较大的整数时,Python会自动将这个大整数进行转换,转换的结果是一个“长整数”类型,为了表示它,会在其末尾显示一个L。由于这个操作是Python自动完成的,所以在现在的Python中,没有单独将“长整数”作为一个类型。

3.222222在数学里面称为小数,这里依然可以这么称呼,不过就像很多编程语言一样,习惯称之为“浮点数”。至于这个名称的由来,也是有点说道的,有兴趣可以搜索一下。

上述举例中都无符号(或者说是非负数),如果要表示负数,跟数学中的表示方法一样,前面填上负号即可。

值得注意的是,我们这里说的都是十进制的数。

除了十进制,还有二进制、八进制、十六进制都是在编程中可能用到的,这些知识不作为本书讲解的内容,读者要了解,可以寻找相关书籍,或者去网上搜索。

每个数字在Python中都是一个对象,比如前面输入的3就是一个对象。每个对象,在内存中都有自己的一个地址,这就是它的身份。

  1. >>> id(3)
  2. 140574872
  3. >>> id(3.222222)
  4. 140612356
  5. >>> id(3.0)
  6. 140612356
  7. >>>

用内建函数id()可以查看每个对象的内存地址,即身份。

内建函数,英文为built-in Function,读者根据名字也能猜个八九不离十了。不错,就是Python中已经定义好的内部函数。

以上三个不同的数字是三个不同的对象,具有三个不同的内存地址。特别要注意,在数学上,3和3.0是相等的,但是在这里,它们是不同的对象。

用id()得到的内存地址是只读的,不能修改。

了解了“身份”,再来看“类型”,也有一个内建函数供使用,即type()。

  1. >>> type(3)
  2. <type 'int'>
  3. >>> type(3.0)
  4. <type 'float'>
  5. >>> type(3.222222)
  6. <type 'float'>

<type‘int’>说明3是整数类型(Interger);<type‘float’>则告诉我们该对象是浮点型(Floating point real number)。与id()的结果类似,type()得到的结果也是只读的。

至于对象的值,在这里就是对象本身了。

看来对象也不难理解。

请保持自信,继续。

1.1.2 变量

仅仅写出“3、4、5”是远远不够的,在编程中,经常要用到“变量”和“数”(严格来讲是对象)建立起对应关系。例如:

  1. >>> x = 5
  2. >>> x
  3. 5
  4. >>> x = 6
  5. >>> x
  6. 6

在这个例子中,x=5就是在变量x和数5之间建立了对应关系,接着又建立了x与6之间的对应关系。我们可以看到,x先“是”5,后来“是”6。

在Python中,有这样一句话是非常重要的:对象有类型,变量无类型。怎么理解呢?

对象的类型,可以使用type()来查看,前面已经演示了。

当在Python中写入了5、6,Computer就自动在其内存中某个地方建立了这两个对象,就好比建造了两个雕塑,一个形状似5,一个形状似6,这两个对象的类型就是Int.

那个x就好比是一个标签,当x=5时,就是将x这个标签拴在了5上,通过这个x,就顺延看到了5,于是在交互模式中,“>>>x”输出的结果就是5,给人的感觉似乎是x就是5,而事实是x这个标签贴在5上面。同样的道理,当x=6时,标签就换位置了,贴到6上面。

所以,这个标签x没有类型之说,它不仅可以贴在整数类型的对象上,还能贴在其他类型的对象上,比如后面会介绍到的str(字符串)类型的对象等。

Python中变量的这个特点(即可以四处乱贴的标签)非常重要,它没有类型。

1.1.3 简单的四则运算

读者可以在交互模式中复习一下小学数学中的四则运算,并且报告给你小学数学老师,他(她)当初煞费苦心的教育成果在这里得到了应用。

  1. >>> 2+5
  2. 7
  3. >>> 5-2
  4. 3
  5. >>> 10/2
  6. 5
  7. >>> 5*2
  8. 10
  9. >>> 10/5+1
  10. 3
  11. >>> 2*3-4
  12. 2

上面的运算中,分别涉及四个运算符号:加(+)、减(-)、乘(*)、除(/)

另外,我相信读者已经发现了一个重要的公理:

计算机中的四则运算和小学数学中学习过的四则运算规则是一样的

要不怎么说人是高等动物呢,自己发明的东西,一定要继承自己已经掌握的知识,别跟自己的历史过不去。伟大的科学家们,在当初设计计算机的时候就想到我们现在学习的需要了,一定不能让后世子孙再学新的运算规则,就用小学数学里面的好了。感谢那些科学家先驱者,泽被后世。

下面计算3个算术题,看看结果是什么:

  1. 4 + 2
  2. 4.0 + 2
  3. 4.0 + 2.0

你可能愤怒了,这么简单的题目,就不要劳驾计算机了,太浪费了。

别着急,还是要运算一下,然后看看结果有没有不一样,要仔细观察哦。

  1. >>> 4+2
  2. 6
  3. >>> 4.0+2
  4. 6.0
  5. >>> 4.0+2.0
  6. 6.0

不一样的地方是:第一个公式结果是6,这是一个整数;后面两个是6.0,这是浮点数。

计算机做一些四则运算是不在话下的,但是,有一个问题请务必注意:在数学中,整数是可以无限大的,但是在计算机中,整数不能无限大。

因此,就会有某种情况出现,就是参与运算的数或者运算结果超过了计算机中最大的数了,这种问题称之为“整数溢出问题”。

1.1.4 整数溢出问题

在网上能够找到很多专门讨论“整数溢出”问题的文章。

在某些高级编程语言中,整数溢出是必须正视的,但是,在Python里面就无需忧愁了,原因就是Python为我们解决了这个问题,它支持“无限精度”的整数,所以,不用考虑整数溢出的问题,Int类型与任意精度的Long整数类可以无缝转换,超过Int范围的情况都将转换成Long类型。

体验一下大整数:

  1. >>> 123456789870987654321122343445567678890098876*1233455667789990099876543332387665443345566
  2. 152278477193527562870044352587576277277562328362032444339019158937017801601677976183816L

多么幸运呀,Python做了如此精妙的安排,免除了麻烦,所以选择学习Python就是珍惜光阴。

你还可以在交互模式下计算2的1000次幂,计算方法是:

  1. >>> 2 ** 1000

看看结果是什么?你会感到惊喜的。

上面计算结果的数字最后有一个L,表示这个数是一个长整数,你不用管它,反正是Python为我们搞定了大整数问题。