Python模块
在之前的学习我们给出的例子中有几处出现improt XXX的语句,例如 我们要做深拷贝的时候用的copy.deepcopy(a), 然而我们直接使用这句代码会报错,因为找不到deepcopy()这个函数。那么当我们加上import copy 这句之后就会顺利解决!
这里我们先引入模块的概念,然后在讨论import
模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
特点:
- 模块中可以定义函数、类和变量,也可以包含可执行的代码
- 模块中含有的是相关功能的一组代码
- 模块可以使编程人员更有逻辑的组织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模块的函数
补充几个函数
-
globals() 和 locals() 函数
globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。 -
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 参数的意义:
- 语句中 Exception 是异常的类型
- 第一个是异常类型 如NameError
- 第二个是args ,是我们自己提供的参数
-
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
注意:异常可以是个字符串,也可以是类和对象。
Eg:
def functionName( level ):
if level < 1:
raise Exception("Invalid level!", level)
# 触发异常后,后面的代码就不会再执行
使用:
try:
functionName(0) # 触发异常
except Exception,err:
print 1,err
else:
print 2