1.import与from … import
1.1 When to use import
1) 如果模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突。
1.2 When to use from…import
1). 如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用from module import。
2). 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用from module import。
2.2 Good example
2.2.1 Good example about when to use import
1). 当需要使用的模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突。具体的例子如下图2.1所示:
>import os
>import sys
>os._name_
'os'
>sys._name_
'sys'
2.2.2 Good example about when to use from…import
1). 当要使用的模块需要经常访问模块的属性和方法,且不想不停地敲入模块名,使用 from module import来简化程序。具体的例子如下图2.2所示:
>from sys import argv,platform,stdin,stdout,stderr
>print argv[0],'and platform is',platform,'\n'
and platform is win32
2). 当要使用的模块只需要访问模块的某些固定属性和方法,而不想使用其他的,则可以使用 from module import。具体的例子如下图2.3所示:
>form os import getcwd
>print getcwd()
c:\Python2.6
1.1. Bad example
2.3.1 Bad example about using import
1). 当使用的模块中,所需要使用的属性或方法时固定的,则可以直接使用from module import的方式来简化代码。具体的不好应用如图2.4所示:
>import sys
>print sys.argv[0]
print sys.stderr
<idlelib.rpc.RPCProxy object at Ox01201530>
>print sys.stdin
<idlelib.rpc.RPCProxy object at Ox012015F0>
>print sys.stdout
<idlelib.rpc.RPCProxy object at Ox01201510>
3. try … except
1). 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
1). 在程序中可以通过创建新的异常类来命名自己的异常。异常类通常应该直接或间接的从Exception类派生。
3.2.1 Good example about using exception
1). 当使用try… except来捕捉异常时,需要将所有的异常按照子类在上,父类在下的方式捕捉异常。否则如果有异常时,父类将会直接截取该异常,子类将无法捕获该异常。具体的应用如图3.1所示:
try:
dataList=['a','b','c']
data=dataList[3]
print data
except IndexError:
print 'IndexError for the detail exception'
except:
print 'The mail exception'
3.2.2 Good example about user-defined exception
1). 自定义的异常类通常会直接或间接的从Exception类派生。具体的定义应用如图3.2所示:
class MyError(IndexError):
def _init_(self,value):
self.value=value
def _str_(self):
retirm re[r(self.value)
3.3. Bad example
3.3.1 Bad example about using exception
1). 当使用try… except来捕捉异常时,如果父类放置于子类之上,父类将会直接截取该异常,子类将无法捕获该异常。具体的不好如图3.3所示:
1. List object
1.1. Guideline
4.1.1 Define list
1). 使用”[ ]”来定义一个list,且任意一个非空list的第一个元素总是list[0]。list 中的元素不必唯一。
2). 负数索引从list的尾部开始向前计数来存取元素。任何一个非空的list最 后一个元素总是 list[-1],其中负数取元素的方法是:list[-n] == list[len(li) - n]。
3). Slice:指定2个索引得到list的子集。从左向右阅读 list,第一个slice索引指定了您想要的第一个元素,第二个slice 索引指定了第一个您不想要的元素。返回的值为在其间的每个元素,且返回值仍是一个list。当第一个slice索引指定为0或者第二个slice索引是list的长度时,可以省略。如果将两个slice索引全部省略,这将包括list的所有元素,但是这并不是原先的list,而是该list的一个拷贝。
4.1.2 Add element to list
1). append 向list的末尾直接追加单个元素,即使添加元素为一个list,在所添加的list中仍然为一个元素。
2). insert 是将单个元素插入到list中。数值参数是插入点的索引。
3). extend 用来连接list,数值参数是要使用一个list参数进行调用。所加的list参数将扩展原有的list,无返回值。
4.1.3 Search in list
1). index在list中查找一个值的首次出现并返回索引值。如果在list中没有找到值,Python会引发一个异常。
2). 要判断一个值是否在list内,使用in。如果值存在,返回True,否则返为False。
4.1.4 Delete element in list
1). Remove会删除中list一个值的首次出现无返回值,如果在list中没有找到值,Python 会引发一个异常。
2). Pop会删除list的最后一个元素,然后返回删除元素的值。
4.1.5 How to use list’s operators
1). Lists可以用”+”运算符连接起来。list=list+otherlist相当于list.extend(otherlist)。但“+”运算符把一个新list连接后的list作为值返回,而extend只修改存在的list。所以对于大型list来说,extend的执行速度要快一些。
2). “*”运算符可以作为一个重复器作用于list。list = [1, 2] * 3 等同于list= [1, 2] + [1, 2] + [1, 2],即将三个list连接成一个。
3). “+=”运算符也作用于list中。list += ['two'] 等同于list.extend(['two'])。
1.2. Good example
4.2.1 Good example about using list
1). 在使用extend用来连接list,数值参数是要使用一个list参数进行调用。所加的list参数将扩展原有的list,具体的应用如图4.1所示:
2). 在使用”+”来连接两个list时,如果所相加的list比较大时,应选择extend的来执行对两个list的操作,具体应用如图4.2所示:
4.3. Bad example
4.3.1 Bad example about using list
1). 在连接两个list时,如果所相加的list比较大,则不要使用”+”来操作这两个list。具体的不好的应用如图4.3所示:
5. Self
5.1. Guideline
5.1.1 When to use self
1). self是类方法的一个位置参数,它就是类的实例对象自己。在定义一个类的方法时,每个方法的第一个参量都为self,这是对象实例的常规Python名(它与java中的this对象或c++中的this指针具有相同的作用)。在调用该方法时,不需要引入它,直接赋值给其他的参数。
1.2. Good example
5.2.1 Good example about using self
1). 当定义一个类的方法时,self为必须的参数,且为第一个参量。在调用该方法时,首先声明该方法的类的对象,再通过该对象来调用该方法。具体的例子如下图5.1所示:
5.3. Bad example
5.3.1 Bad example about using self
1). 当定义一个类的方法时,如果self未在参数中,该方法创建成功,但是调用该方法时报错。如果self不为第一个参量,该方法创建成功,但是调用该方法时报错。具体的不好应用如图5.2所示:
6. And-or
6.1. Guideline
6.1.1 When to use and-or
1). 在Python中,and 和 or 执行布尔逻辑演算,但是它们并不返回布尔值;而是返回它们实际进行比较的值之一。在Python和C#中这两个操作符都是用来进行逻辑操作的,在C#中返回值是true/false,但在Python中and or 却返回一个实际的值。
2). and操作符的取值规律是在单一表达式中除了0,’’,[],(),{},None被当成false,其它的对象一律为true,如果在整个表达式中所有的true,则返回最后一个;如果表达式中有任一个false,则返回第一个为false的内容。
3). or操作符的取值规律是在如果所有的值均为true,则返回第一个元素;如果表达式里即有true,又有false,则返回从左到右的第一个true值;如果所有的值均为false,则返回最后一个false值。
1.2. Good example
6.2.1 Good example about using and-or
1). 在Python中,and和 or执行布尔逻辑演算,返回的是它们实际进行比较的值之一。and操作符的取值为如果在整个表达式中所有的true,则返回最后一个;如果表达式中有任一个false,则返回第一个为false的内容。or操作符的取值为如果所有的值均为true,则返回第一个元素,如果表达式里即有true,又有false,则返回从左到右的第一个true值;如果所有的值均为false,则返回最后一个false值。数字也为表达式。具体的例子如下图6.1所示:
6.3. Bad example
6.3.1 Bad example about using and-or
1). 1 and a or b 表达式中,如果 a 是一个空字符串,在 Python 的布尔上下文中空字符串被认为是假的,1 and '' 的演算值为 '',最后 '' or b的演算值为 b。这个值并不是你想要的结果a。and-or 技巧,bool and a or b 表达式,当 a 在布尔上下文中的值为假时,不会像 C 语言表达式 bool ? a : b 那样工作。具体的不好应用如图6.2所示: