Python学习笔记7

2018-09-03  本文已影响0人  MetaT1an

异常处理
包和模块

异常处理

解决异常

try:
    # 可能出现异常的代码
    # 有异常就会抛出,不会再执行剩下的 try后面的代码
except xxxError as xxx:
    # 出现异常后,而且被捕捉到的代码
    # except可以写多个,用来捕捉多个不同的异常
else:
    # 异常未被捕捉到所执行的代码(可以省略)
finally:
    # 不管有没有异常都会执行的代码
tyr:
    1 / 0
    print(val)
except (ZeroDivisionError, NameError) as e:
    print(e)
else
    print("fine like this")

# 执行结果:division by zero
# 如果不清楚异常的具体名字,可以写 Exception进行替代
# 在主要代码的执行前后分别添加一些操作
# 实现了 __enter__(), __exit__()两个函数的类产生的对象就是上下文管理器
class Test:
    def __enter__(self):
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        # exc_type: 异常类型
        # exc_val:  异常的值
        # exc_tb:   异常追踪信息
        # 函数有返回值,True表示异常已经处理,False表示异常还未处理
        print(exc_val)
        return True

with Test() as x:   # as 后面表示对象的__enter__()方法执行后的返回值
    1 / 0           # 产生的异常信息将对号入座传入__exit__()的函数参数中
    
# 执行结果: division by zero

# -----------------------------------------------------
# 通过 contexlib模块,通过生成器快速产生一个上下文管理器
import contexlib

# yield之前的代码相当于 __enter__()中的代码,但是返回结果要通过 yield来返回
# yield之后的代码相当于 __exit__()中的代码
@contexlib.contexmanager
def test():
    print(1)
    yield "x here"
    print(2)
    
with test() as x:
    print(3)
    print(x)
    
# 执行结果:
1
3
x here
2
with open("./xx.txt", "r") as f:
    f.readlines()
    
with open("a.jpg", "rb") as f1, open("b.jpg", "wb") as f2:
    content = f1.read()
    f2.write(content)
# 通过 raise语句手动抛出异常
# 自己设计
def set_age(age):
    if age <= 0 or age > 150:
        raise ValueError("value error")
    print("age is %d" % age)

# 给别人调用
try:
    set_age(-18)
except ValueError as e:
    print(e)
# 自定义的异常要直接或间接继承自:BaseException
class MyException(Exception):

包和模块

基本概念

包和模块的作用

包和模块分类

包和模块的一般操作

# 就是创建一个 .py文件
n1 = 1
n2 = 2
n3 = 3

def test():
    pass

__all__ = ["n1", "n2", "test"]  # 指定了可以导入到别的模块中的资源
# -------------------------------
# 1.常规导入,导入了所有资源

import module

module.val      # 访问变量
module.func()   # 调用函数

# 模块在其他的包中
import p.module
p.module.val

# 一次导入多个模块
import p.module, module, module_2

# 给模块起别名
import p.module as m
m.val
m.func()

# -------------------------------
# 2.from语句导入,只导入部分资源

# 从包中导入模块
from p import module
module.val

from p import module1, module2
from p import module1 as m1, module2 as m2

from p.sub_p import m   # 正确写法
from p import sub_p.m   # 错误写法

# 从模块中导入资源
from module import val, func
print(val)      # 直接使用
func()

from p.mudule import val    # True
from p import module.val    # False

from p import *     # 导入了 p包下的所有模块,受到 __init__.py文件中__all__变量的约束
from module import *    # 导入了 module下的所有资源,受到模块中 __all__变量的约束

# 使用 * 进行导入,容易产生同名冲突

导入操作的本质

模块检索路径

# 直接修改 sys.path
import sys

sys.path.append("xx/xx/xx")     # 添加自定义的一个路径,单次执行有效

import xxx      # xxx是位于自定义路径下的一个模块

# 直接修改 PYTHONPATH, 因为 sys.path包括了 PYTHONPATH
# 在 shell中有效,在 IDE中又要另外添加
# 作用持久

导入模块的场景

# 在需要使用的范围内进行导入,其他范围无法使用,多用于函数
def cal(r):
    
    import math
    return math.pi * r * r

erea = cal(2)
# 对于两个功能相似的模块,想优先导入其中一个,若不存在,再导入另外一个
try:
    import module_1 as m
except ModuleNotFoundError:
    import module_2 as m
    
m.func()
# 绝对导入
# 参照sys.path路径进行模块检索的导入方式

import module
from module import func

# 相对导入
# 用 . 和 .. 来代替绝对路径进行模块的检索

from . import module    # 参考的路径是该模块被绝对导入时加载的路径

第三方包和模块的安装

包管理项目
三方包和模块的发布形式
安装方式
其他问题
easy_install
pip
上一篇下一篇

猜你喜欢

热点阅读