您的位置:首页 > 编程语言 > Python开发

实践杂谈(3)—— Python实用技巧(一)

2014-11-27 06:37 531 查看

1. 异常处理

异常处理(exception handling)是编程中的一项重要技巧,也是容易被人忽视的一项。我们常常会忽视异常处理的重要性:它能使程序变得更具有鲁棒性,减少程序发生严重突发问题的几率,也能使程序更易于调试。尤其是在以下几种情况下,更应该善用异常处理:

进行网络访问时
进行I/O读写时
执行某些复杂、容易造成程序崩溃的程序段时

总之,希望大家看完本文的介绍后,跟博主一起养成使用异常处理技术的好习惯吧。

Python 中使用 try ... except ... 实现异常处理。当 try 程序段中的程序出现异常时,便会开始执行except程序段。以下是一个例子:

try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()


上述例子还有一个 else 程序段,这是当 try 程序段成功执行之后,转去执行的程序段。

在上述例子中我们还能看到,except 后还能够指定特定的异常类型,如:IO错误:IOError;执行错误:RuntimeError等等。若不指定某一异常类型,则默认为所有异常。

除此之外,我们还可以使用 finally 程序段。与 else 等不同的是,该程序段的内容一定会被执行,不论 try 程序段中是否出现了异常。因此可以放置一些必须执行的程序段。

另外,我们还可以主动地触发一次异常事件:使用 raise 命令。比如:

raise RuntimeError('Here!')
为什么我们要自己触发一次异常?这可以用于某些调试场合当中,也可以用于触发一些用户自定义的异常,如下例:

>>> class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)

>>> try:
raise MyError(2*2)
except MyError as e:
print 'My exception occurred, value:', e.value

My exception occurred, value: 4


上述例子中我们还看到如何自定义一个异常事件:定义一个继承于 Exception 的类,十分简单。

最后,简答总结一下Python有关异常的命令:

try:监测其中程序段是否出现异常
except:若 try 中出现异常则执行
else:若 try 中无异常则执行
finally: 不论 try 中是否异常都执行
raise:触发一个异常

Reference:

http://www.tutorialspoint.com/python/python_exceptions.htm

https://docs.python.org/2/tutorial/errors.html

2. 计数器 —— Counter

接下来我们介绍一个非常好用的工具:collections.Counter。
在Python编程当中,我们常常需要统计一个列表当中不同元素的个数。这个任务最直接的办法便是:先用set()得到列表中各个不同的元素,然后再扫描列表统计每个元素的个数。然而,上述步骤未免过于繁琐了,通过collecitions.Counter我们可以轻松完成这个任务。
首先我们需要导入collections模块,之后我们只要使用Counter函数就好了,如下:
>>>import collections

>>>l = ['a', 'b', 'a', 'c', 'b', 'a']
>>>c = collections.Counter(l)
>>>print c

Counter({'a': 3, 'b': 2, 'c': 1})
函数返回值是一个Counter类的对象,可以看到十分轻松的就对列表中的词频进行统计。若你觉得对常见的字典 (dictionary) 类型比较熟悉,可以直接使用dict() 将其转为字典类型,十分方便。
除此之外,Counter类还提供了三个有用的函数:
1. elements():返回一个迭代器,将Counter类对象中的元素按照其个数列出来(若该元素个数小于1,则忽略)。该函数可以结合list()使用得到一个列表,如下例:
>>c = Counter(a=4, b=0, c=1, d=-2)

>>list(c.elements())
['a', 'a', 'a', 'a', 'c']


2. most_common(n):返回 n 个频数最高的元素,若不指定n默认为返回全部元素。

3. subtract([iterable-or-mapping]):从对象中减去某些内容,其中可以是能够迭代的类型(如列表),或者是Counter类,如下例:
>>c1 = Counter(a=3, b=1, c=2)
>>c2 = Counter(a=1, b=2, c=1)
>>c1.subtract(c2)
>>c1
Counter({'a'=1, 'b'=-1, 'c'=1})


Reference:

https://docs.python.org/2/library/collections.html

3. 组合——combinations

在一些算法的实现中,我们常常需要的到一个集合的所有子集,即一个集合的 power set。比如,在实现 Apiori 算法的时候,我们需要找到一个pattern的所有子pattern,以确定其中是否有 not frequent 的pattern。为了实现这个功能,我们有一个非常方便的工具——itertools 模块。该模块中有两个非常有用的函数:combinations(r) 和 permutations(r),分别返回的是长度为
r 的原集合的所有组合和排列。以下举个例子:
>>> import itertools
>>> set = ['a', 'b', 'c', 'd']
>>> itertools.combinations(set, 3)
>>> list(c)
[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: