程序员入伙书——简单数据

一边写一边问读者对这个系列教材的感觉。组里的小姑娘说,读下来,照着做,目前理解上没问题。不过她也说,她的室友是学新闻的,对编程不感兴趣,读这些文章时,反映“读不太懂”。她又说,直到现在还上开胃菜,进度有点慢,希望尽快吃到正餐。

好,正餐来了。

在《程序在干什么?》一章,我说过程序最基本的功能是计算——如果没有计算,我们也不需要计算机了。计算机的运算和人类的数学不同。人类的数学可以设置未知数,然后用推导方法把这个未知数的实际值逼出来。计算机的每一步运算,参与者都是已知的,只是有些参与运算的值永远不变,有些一会儿装三个苹果,一会儿装一百个大象。永远不变的被称为“常量”,可能改变的被称为“变量”。

以下我要说到的规则,仅保证对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
评论关闭