程序员入伙书——简单数据
- 2012年12月22日
- 发布在 infotech . on my mind
- 留下评论
一边写一边问读者对这个系列教材的感觉。组里的小姑娘说,读下来,照着做,目前理解上没问题。不过她也说,她的室友是学新闻的,对编程不感兴趣,读这些文章时,反映“读不太懂”。她又说,直到现在还上开胃菜,进度有点慢,希望尽快吃到正餐。
好,正餐来了。
在《程序在干什么?》一章,我说过程序最基本的功能是计算——如果没有计算,我们也不需要计算机了。计算机的运算和人类的数学不同。人类的数学可以设置未知数,然后用推导方法把这个未知数的实际值逼出来。计算机的每一步运算,参与者都是已知的,只是有些参与运算的值永远不变,有些一会儿装三个苹果,一会儿装一百个大象。永远不变的被称为“常量”,可能改变的被称为“变量”。
以下我要说到的规则,仅保证对Python语言有效,其他语言虽然会很相似,但可能有自己的特色法则。
常量
有基本的两种常量:数字和字符串。快捷地描述它们的区别:数字是数学,字符串是语文。
数字很直接,0、-3.5、2012、378.2452,这些数学上看着顺眼的,都是Python语言里合法的数字。另外有些不太顺眼的数字,例如.3和5.,Python也宽宏大量地认为它们是合法的数字,.3意思就是0.3,而5.意思就是5.0。有些巨大的数字或者极小的数字,用科学计数法表达更为便捷的,如1.5×109或者3.0×10-32,Python不会让你辛辛苦苦埋头去数0,而是可以分别表示为1.5E9和3.0E-32,这里的E可以小写。指数前也可以加正负号。
对于完全的整数,Python允许用十进制、二进制、八进制或者十六进制来表达。例如你在Python Shell的>>>提示符下输入0b00111101,0o75或0x3d,Python Shell都会以十进制复述这个数字的值:61。前缀0b表示二进制(Binary),0o表示八进制(Octal),0x表示十六进制(Hexadecimal)。为了再次验证这个规则,你可以试着输入0b102和0o328,看看Python Shell的反应:“SyntaxError: invalid syntax”——“非法语法”对吧?二进制里不可能出现2,八进制也不允许出现8,就好比十进制的最大的单个整数是9一样。你可能会说,十进制有10啊!……汗……请你再想想。虽然这些前缀用大小写都是合法的,我建议使用小写,原因:0o032放在一起,大家还能看出来后面的字符是个o,而写在一起的0O032就容易看花眼了。
综上所述,下面这些都是合法的数字:
31234 9.20 -7058.43 +1.0328E-10 0b10010010 0o34625 0x6D4F
字符串更加直接,凡是以一对单引号或者双引号括起来的,都是字符串。例如:
'hello, world' "I'm okay, sir." "" 'I don\'t know.' "334"
单引号和双引号的区别是?事实上没有区别,只是有时字符串里有双引号,有时有单引号,于是Python就用了这么个狡猾的办法,括单引号时用双引号,括双引号时用单引号,以免看到第二个引号时,字符串被以为提前结束了。如果单引号和双引号都有呢?方法是在引号前面放个反斜杠(\),意思是告诉Python,我后面的这个引号,是字符串的一部分,而不是用来括住字符串的包装纸啊。上面的第四个例子就是这样的,为了让don’t里的那个单引号被认为是一个普通字符,我们在它前面加了个\。第二行的做法就简单易读些,用双引号一括,万事大吉了。
如果\本身也是字符串的一部分呢?办法是在它前面再加个\,它就老实了。所以如果你的字符串的内容是’\’,而你又偏偏喜欢用单引号来括住它们,写起来就可能成为’\’\\\”——拜托您老,还是用双引号吧。
字符串可以完全为空,例如上头的第三行的例子。请注意,引号本身并不是字符串的一部分,它只是表明被它们包围的内容是一个字符串而已。依此作用,334和上头的第五行的例子”334″在本质上有重大区别。334是个数字,而”334″是一串文字。实验如下:
>>> 334 * 3 # 计算 334 x 3 1002 >>> "334" * 3 # 把三个 334 连接在一起 '334334334' >>>
变量
常量是永远不变的,3就是3,不可能被改变成别的东西。变量则是一个标签,这个标签所贴的箱子,即可以装五个橘子,也可以装三十头长颈鹿。这个标签必须以英文字母(大小写)或者下划线(_)开头,后面跟不限长度的英文字母、或数字、或下划线。凡不符合这个规则的,例如出现了空格或标点符号,都不是合法的变量名。以下例子是合法的变量名:
alpha _underlined_variable_ airbus330 Day_2_Night I_am_an_identifier_Dont_you_think_so
如果你在Python Shell下输入这些变量名,一定会被Python大声地抗议。你可能会疑惑,不是说这些是合法的变量名么?对,它们是合法的变量名,可Python不知道它们现在等于什么。这也是我们在文章开头看到的,程序不允许未知数参与运算。为了让这些变量有资格参与运算,可以用等于号(=)为变量赋一个值。赋值(Assign),就是开一个空箱子,贴上变量名这个标签,然后把“五个橘子”或“三十头长颈鹿”装进去的过程。将来你想拿变量参与运算,就是按标签找到箱子,打开看一眼:哦,三十头长颈鹿。注意,你看一眼箱子里的长颈鹿,它们不会被你看没了。它们一直老老实实地呆在箱子里,不管你看多少次,直到你在同一个箱子里放“一百头大象”或者“一只蚂蚁”,把它们冲掉为止。为了用程序来证明:
>>> foo = 3 # 给变量foo赋值3 >>> foo # 看看 3 >>> foo # 不放心,再看看 3 >>> foo = 'i like it' # 往foo里放个字符串 >>> foo # 看,以前的3被字符串覆盖了! 'i like it' >>>
变量名是区分大小写的,A和a指的是完全不同的两样东西。
>>> a = 3 >>> A Traceback (most recent call last): File "", line 1, in A NameError: name 'A' is not defined >>> a 3 >>>
保留字
读过前几个章节的同学会问:我留意到以前的例子里有for, if, while这些词,如果变量起这些名字,会不会把Python弄糊涂?答案是:会的,你真聪明!为了不让Python晕菜,一些单词是作为Python的语言结构的一部分,被Python保留,不允许拿来给变量起名的。这些词被称为“关键字”、“保留字”(Keyword)。很多其它的语言也有各自的保留字。
Python的保留字列表可以通过在>>>提示符下输入help(“keywords”)来获得,这样你就不用经常回来看这张表了。目前你不需要明白这张表里每个关键字的含义,我以后会慢慢介绍。
False | def | if | raise |
None | del | import | return |
True | elif | in | try |
and | else | is | while |
as | except | lambda | with |
assert | finally | nonlocal | yield |
break | for | not | |
class | from | or | |
continue | global | pass |