Python模块及异常

  • Post author:
  • Post category:python


Python模块

在之前的学习我们给出的例子中有几处出现improt XXX的语句,例如 我们要做深拷贝的时候用的copy.deepcopy(a), 然而我们直接使用这句代码会报错,因为找不到deepcopy()这个函数。那么当我们加上import copy 这句之后就会顺利解决!

这里我们先引入模块的概念,然后在讨论import

模块

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

特点:

  1. 模块中可以定义函数、类和变量,也可以包含可执行的代码
  2. 模块中含有的是相关功能的一组代码
  3. 模块可以使编程人员更有逻辑的组织Python代码
import

当我们写好模块代码之后怎么使用呢?我们想到的自然是引入(import了)

Import的使用格式:

import module1[, module2[,... moduleN]

之前我们引入math,copy等模块 使用的是 import math和import copy

当我们把模块引入之后,怎样使用模块的东西这又是一个问题?

现在来举个以前使math的例子:

import math
print math.fabs(-10)

这是一个取绝对值的例子,从中我们看到在取绝对值的时候用的是fabs(),

这里我们给出 使用import xxx引入xxx模块使用xxx模块中的函数时候的格式:

xxx函数名()
注意:一个模块只会被执行一次,不管你引入对少次!!!
from…import

有时候我们发现,我们只需要某个模块的一部分内容,如果为了使用一个函数把整个模块都导入,从感觉上我们都觉得太浪费!这时候Python给我们提供了解决方法 from…import 语句

From XXX import YYY 语句是引入某个模块的某个函数

当然后面的YYY如果换成*就表示引入XXX模块的所有内容

例如我们引入copy模块:

from copy import *  #引入全部copy模块 
a = 'hello rocky'
b = copy(a) #如果使用import copy 引入 这句或报错 可以自己试一下
print b
print id(a),id(b)  #这是打印a,b的地址 结果是一样的 说明这样的拷贝是浅拷贝

开发中有时候我们只需深拷贝某个对象这时候from…import… 就起到作用了

from copy import deepcopy
a = 'hello rocky'
b = deepcopy(a) 
a+=" Love you"
print a+'============', b
print id(a),id(b) 
这时候如果使用b = copy(a) 那么会报错:NameError: name 'copy' is not defined 因为 copy()函数在deepcopy中找不到 他是copy模块的函数
补充几个函数
  1. globals() 和 locals() 函数

    globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。

    如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。

    如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。

    两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。
  2. reload() 函数

    当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

    因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:

    reload(module_name)

Python 异常处理

异常

异常也是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

一般情况下,在Python无法正常处理程序时就会发生一个异常。

异常是Python对象,表示一个错误。

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

异常处理

捕捉异常可以使用try/except语句。

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在try里捕获它。

以下为简单的try….except…else的语法:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

Eg:
try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()
使用except而不带任何异常类型

格式:

try:
    正常的操作
except:
    发生异常,执行这块代码
else:
    如果没有异常执行这块代码
注意:这种捕获异常的方式是把try中代码可能或发发生的所有的异常统一处理了,只要有异常机会执行except中的代码,没有异常执行else
try-finally

和java中的一致,无论是否有异常,finally代码块都会执行

格式:

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise
Raise

Raise是提供给我们自己触发异常的方法

格式:

raise [Exception [, args [, traceback]]]

Rais 参数的意义:

  1. 语句中 Exception 是异常的类型
  2. 第一个是异常类型 如NameError
  3. 第二个是args ,是我们自己提供的参数
  4. 最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

    注意:异常可以是个字符串,也可以是类和对象。
Eg:
def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行
使用:
try:
    functionName(0)            # 触发异常
except Exception,err:
    print 1,err
else:
    print 2



版权声明:本文为rocky123shine原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。