第三章 基本使用

下面我们用例子来介绍Python的基本用法。在例子中,用户输入和系统输出靠有没有提示 (>>>和...)来分别。如果要试这些例子的话,需要键入提示后的所有命令,例子 中没有提示的行是系统的输出。注意只有次提示的行意味着需要键入一个空行,这用于结束 多行命令。

 

3.1 用Python作计算器使用

启动解释程序,等待主提示>>>出现。解释程序可以作为计算器使用。键入一个 表达式,解释程序就可以输出结果。表达式的写法很直观:+,-,*,/, %, **等算符的作用 和其它大多数语言(如Pascal或C)没什么差别,括号可以用来组合。例如:

 

>>> 2+2
 
4
 
>>> # 这是一个注释
... 2+2
4
>>> 2+2  # 和代码在同一行的注释
4
>>> (50-5*6)/4
5
>>> # 整数除法得下面的整数
... 7/3
2
>>> 7/-3
-3
>>>

和C中一样,等于号用来给变量赋值,赋值的结果不显示:

>>> width = 20
>>> height = 5*9
>>> width * height
900
>>>

可以同时给几个变量赋同一个值:

>>> x = y = z = 0  # 把 x, y 和 z赋零
 
>>> x
0
>>> y
0
>>> z
0
>>>

Python完全支持浮点数,混合类型的运算会把整数先转换成浮点数:

>>> 4 * 2.5 / 3.3
3.0303030303
>>> 7.0 / 2
3.5
>>>

Python也提供了复数,方法是用j和J作为虚数单位,如1+1j,3.14e-10j,等等。

3.2. 字符串

  Python除处理数字外还可以处理字符串,字符串用单撇号或双撇号包裹:
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>>

字符串输出格式与输入的样子相同,都是用撇号包裹,撇号和其它特殊字符用用反斜杠转 义。如果字符串中有单撇号而没有双撇号则用双撇号包裹,否则应该用单撇号包裹。后面要 介绍的print语句可以不带撇号或转义输出字符串。

  字符串可以用+号连接起来,用*号重复:

>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'
>>>

字符串可以象在C中那样用下标索引,字符串的第一个字符下标为0。

Python没有单独的字符数据类型,一个字符就是长度为一的字符串。象在Icon语言中那样 ,可以用片段(slice)记号来指定子串,片段即用冒号隔开的两个下标。

>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'
>>>

片段有很好的缺省值:第一下标省略时缺省为零,第二下标省略时缺省为字符串的长度。

>>> word[:2]    # 前两个字符
'He'
>>> word[2:]    # 除前两个字符串外的部分
'lpA'
>>>

注意s[:i] + s[i:] 等于 s 是片段运算的一个有用的恒等式。

>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
 
'HelpA'
>>>

不合理的片段下标可以很好地得到解释:过大的下标被换成字符串长度,上界小于下界时 返回空串。

>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''
>>>

下标允许为负数,这时从右向左数。例如:

>>> word[-1]     # 最后一个字符
'A'
>>> word[-2]     # 倒数第二个字符
'p'
>>> word[-2:]    # 最后两个字符
'pA'
>>> word[:-2]    # 除最后两个字符外的部分
'Hel'
>>>

但要注意的是 -0 实际还是 0,所以它不会从右向左数!

>>> word[-0]     # (因为 -0 等于 0)
'H'
>>>

超出范围的片段下标被截断,但在非片段的情况下不要这样:

>>> word[-100:]
'HelpA'
>>> word[-10]    # 错误
Traceback (innermost last):
  File "<stdin>", line 1
IndexError: string index out of range
 
>>>

记住片段意义的最好方法是把下标看成是字符 之间的点,第一个字符的左边界号码为0。有n个字符的字符串的最后一个字符的右边 界下标为n,例如:

 
 +---+---+---+---+---+ 
 | H | e | l | p | A |
 +---+---+---+---+---+ 
 0   1   2   3   4   5 
-5  -4  -3  -2  -1
 

第一行数字给出字符串中下标0到5的位置,第二行给出相应的负下标。从i到j的片段由在 边界i和j之间的字符组成。

 

对于非负下标,如果下标都在界内,则片段的长度为下标的差。例如,word[1:3] 的长度 为 2。

  内置函数len()返回字符串的长度:

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
>>>

多行的长字符串也可以用行尾反斜杠续行,续行的行首空白不被忽略,如

        hello = "This is a rather long string containing\n\
        several lines of text just as you would do in C.\n\
            Note that whitespace at the beginning of the line is\
         significant.\n"
        print hello

结果为

 

        This is a rather long string containing
        several lines of text just as you would do in C.
            Note that whitespace at the beginning of the line is significant.

对于特别长的字符串(比如包含说明的几段文字),如果用上面的方式每行都用\n\结尾 是很麻烦的,特别是这样无法用象Emacs这样的功能强大的编辑器重新编排。对这种情况,可 以使用三重撇号,例如

        hello = """
 
            This string is bounded by triple double quotes (3 times ").
        Unescaped newlines in the string are retained, though \
        it is still possible\nto use all normal escape sequences.
 
            Whitespace at the beginning of a line is
        significant.  If you need to include three opening quotes
        you have to escape at least one of them, e.g. \""".
 
            This string ends in a newline.
        """

三重撇号字符串也可以用三个单撇号,没有任何语义差别。

多行的字符串常量可以直接连接起来,字符串常量之间用空格分隔则在编译时可以自动连 接起来,这样可以把一个长字符串连接起来而不需要牺牲缩进对齐或性能,不象用加号连接 需要运算,也不象字符串串内的换行其行首空格需要保持。

3.3 列表

Python中有几种复合数据类型,用来把其它值组合到一起。其中最灵活的是列表,可 以写成在方括号之间用逗号隔开的若干值(项)。列表的项不必取同一类型。

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]
>>>

象字符串下标那样,列表下标从0开始,列表可以取片段,可以连接,等等:

>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boe!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boe!']
>>>

与字符串不同的是列表是可变的,可以修改列表的每个元素:

>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>>

也可以给一个片段重新赋值,这甚至可以改变表的大小:

>>> # 替换若干项:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # 去掉若干项:
... a[0:2] = []
>>> a
[123, 1234]
>>> # 插入若干项:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> a[:0] = a     # 在开头插入自身
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>>

内置函数也使用于列表:

>>> len(a)
8
>>>

可以建立嵌套列表(表的元素也是列表),如:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # 列表方法
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']
>>>

注意这个例子中p[1]和q实际是同一个对象!也就是说它们只不过是同一个东西的两个名 字(引用)而已。

3.4 编程初步

Python当然不是只能用来把两个数加到一起,它可以完成很复杂的工作。例如,我们可以 写出Fibonacci序列的开始几个:

>>> # Fibonacci 序列:
... # 两个元素的和定义下一个
... a, b = 0, 1
>>> while b < 10:
...       print b
...       a, b = b, a+b
... 
1
1
2
3
5
8
>>>

这个例子介绍了几个新特色。

第一行包含一个多重赋值: 变量a和b同时得到新值0和1。在最后一行又用了多重赋值, 我们可以看出赋值时先把右边都算出后再进行赋值。

while循环当循环条件(这里即: b < 10)成立时不断执行。在Python中和C中一样,非 零整数值为真值,零为假值。条件也可以是字符串或列表或任何序列,长度为非零的为真, 空序列为假。例子中所用的是一个简单比较。标准的比较算符和C一样:

<, >, ==, <=, >= 和 !=。

循环体是缩进的:缩进是Python用来组合语句的方式。Python目前还不能提供智能自动缩 进,所以你需要自己为每个缩进行键入制表符或空格。实际使用中你可以用文本编辑程序为Python 准备复杂的输入,多数文本编辑程序都有自动缩进的功能。在交互输入复合语句时必修附加 一个空行以指示复合语句的完成(因为解释程序无法猜到哪是语句的最后一行)。print语句 显示后面的表达式值。这和直接写出表达式不同,它可以显示多个表达式和字符串,而且可 以用于程序文件中。显示时字符串没有撇号,各项目之间插入一个空格,所以你可以以精美 的格式显示,如:

>>> i = 256*256
>>> print 'The value of i is', i
The value of i is 65536
>>>

在尾部写一个逗号可以避免最后换行:

>>> a, b = 0, 1
>>> while b < 1000:
...     print b,
...     a, b = b, a+b
... 
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>>

注意如果前一行没有结束的话系统在显示提示之前先换行。

Python还提供了和C语言一样的printf格式的输出方式,这是用%实现的,左边是格式,如:

 
        >>> print 'The value of 1/7 is approximately %5.3f.' % 0.142857
        The value of 1/7 is approximately 0.143.
        >>>

如果有多个需要输出的项百分号右边的项可以是一个序组,如

        >>> print "Name: %-10s  Age: %3d" % ("White", 31)
        Name: White      Age:  31