Python初学之实用技巧<二>

继续昨天的Python的使用技巧学习:

一、复合语句
Good:
Python代码

    if foo == 'blah':  
   do_something()  
   do_one()  
   do_two()  
   do_three() 

Bad:
Python代码

if foo == 'blah': do_something()  
do_one(); do_two(); do_three()

文档注释(Docstrings) & 注释
文档注释 = 用于解释如何使用代码
文档注释公约:http://www.python.org/dev/peps/pep-0257/
注释 = 为什么 (理由) & 代码如何工作的如:
Python代码

# !!! BUG: ...  
# !!! FIX: This is a hack  
# ??? Why is this here?

注释对于任何语言开发者来说已经最基本的东西了,这里就不详细说了.
二、交换变量
在其它语言的交换变量的做法一般是:
Java代码

    temp = a  
   a = b  
   b = temp 

Python的做法:
Python代码

b, a = a, b 

也许你见到过这样的情况,但是你知道它是如何工作的吗?
◆ 首先,逗号是元组构造语法。
◆ 等号的右边是定义一个元组 (tuple packing).
◆ 其左边为一个目标元组 (tuple unpacking)).
右边的元组根据名称被 unpacked 到左边的无组。
更多关于 unpacked例子:
Python代码

>>> info =['David', 'Pythonista', '+1250']  
>>> name, title, phone = info  
>>> name  
'Davids' 
>>> title  
'Pythonista' 
>>> phone  
'+1250'

在结构化的数据上使用循环:
info 是在上面定义的一个 list . 所以下面的 people 有两个项, 两个项都是分别都拥有三个项的 list.
Python代码

    >>> people = [info, ['Guido', 'BDFL', 'unlisted']]  
   >>> for (name, title, phone) in people:  
   ...     print name, phone  
   ...  
   David +1250 
   Guido unlisted 

以上循环中,people中的两个项(list item),都已经被 unpacked 到 (name, title, phone) 无组中。
可以任意嵌套(只要左右两边的结构一定要能够匹配得上):
Python代码

    >>> david, (gname, gtitle, gphone) = people  
   >>> gname  
   'Guido' 
   >>> gtitle  
   'BDFL' 
   >>> gphone  
   'unlisted' 
   >>> david  
   ['David', 'Pythonista', '+1250'] 

三、更多关于 Tuples
我们看到的是元组通过逗号构造,而不是括号。例如:
Python代码

    >>> 1,  
   (1,) 

Python的解释器会为你显示括号,所以建议你使用括号:
Python代码

    >>> (1,)  
   (1,) 

千万不要忘记逗号!
Python代码

    >>> (1)  
   1 

在只有一个元素的元组,尾随逗号是必须的,在2 + 元素的元组,尾随逗号是可选的。 如果创建一个 0或空元组,一对括号是快捷的语法:
Python代码

    >>> ()  
   ()  
   >>> tuple()  
   () 

一个常见的​​错误当你并不想要一个无组,却无意的添加了一个逗号,很容易造成你在代码中的错误,如:
Python代码

    >>> value = 1,  
   >>> value # is a tuple, not a int  
   (1,) 

所以,当你发现一个元组时,赶紧去找一下那个‘,’号吧。

四、关于 ""
是一个非常有用的功能,但是却很少有人知道。
当你在交互式模式下(如 IDEL)计算一个表达式或调用一个函数后,其结果必然是一个临时名称,
(下划线):
Python代码

    >>> 1 + 1 
   2 
   >>> _  
   2 

在 _ 中存储最后输出的值。
当输出的结果是 None 或没有任何输出时,而 _ 的值并不会改变,仍然保存上一次的值。这就是方便所在。
当然,这只能交互式的模式中使用,在模块中不能支持。
这在交互式模式中是非常有用的,当你在过程中没有保存计算结果 或 你想看最后一步的执行的输出结果:
Python代码

    >>> import math  
   >>> math.pi / 3 
   1.0471975511965976 
   >>> angle = _  
   >>> math.cos(angle)  
   0.50000000000000011 
   >>> _  
   0.50000000000000011