Python 基础6 异常 exception

异常(基础) exception:
    异常 是与正常相对的情况;
  什么是错误?
    错误是指由于逻辑或语法等导致一个程序无法正常执行的问题;
  特点:
    有此错误是无法预知的;
  什么是异常:
    异常是指程序出错时标识的一种状态;
    当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态;
  作用:
    用作信号,通知上层调用者有错误需要处理;

try语句:
    两种语法:
      try - except 语句
      try - finally 语句

try - except语句语法:

 1     try:
 2         可能触发异常的语句
 3     except 错误类型1 [as 变量1]:
 4         异常处理语句1
 5     except 错误类型2 [as 变量2]:
 6         异常处理语句2
 7     except (错误类型3,错误类型4)[as 变量3]:
 8         异常处理语句3
 9     .........
10     except:
11         异常处理语句other
12     else:
13         末发生异常执行语句
14     finally:
15         最终语句

  try - except 语句作用:

    偿式捕获异常,将程序转为正常状态并继续 执行;

try - finally语句语法:

    try:
           可能触发异常的语句
    finally:
           一定要执行的最终语句
      说明 :
        1.finally子句 不可以省略
        2. 一定不存在 except子句
  try - finally语句作用:
      通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行;
    注: try - finally 语句不会改变程序的状态(正常/异常)
ValueError: 
错误类型    说明
ZeroDivisionError         除(或取模)零 (所有数据类型)
ValueError             传入无效的参数
AssertionError           断言语句失败
StopIteration           迭代器没有更多的值
IndexError             序列中没有此索引(index)
IndentationError          缩进错误
OSError                输入/输出操作失败
ImportError            导入模块/对象失败
NameError              未声明/初始化对象 (没有属性)
AttributeError            对象没有这个属性
BaseException             所有异常的基类
SystemExit                解释器请求退出
KeyboardInterrupt         用户中断执行(通常是输入^C)
Exception                 常规错误的基类
GeneratorExit             生成器(generator)发生异常来通知退出
StandardError             所有的内建标准异常的基类
ArithmeticError           所有数值计算错误的基类
FloatingPointError        浮点计算错误
OverflowError            数值运算超出最大限制
EOFError              没有内建输入,到达EOF 标记
EnvironmentError          操作系统错误的基类
OSError                 操作系统错误
WindowsError            系统调用失败
LookupError             无效数据查询的基类
KeyError                映射中没有这个键
MemoryError             内存溢出错误(对于Python 解释器不是致命的)
UnboundLocalError        访问未初始化的本地变量
ReferenceError            弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError            一般的运行时错误
NotImplementedError      尚未实现的方法
SyntaxError Python      语法错误
TabError                Tab 和空格混用
SystemError            一般的解释器系统错误
TypeError              对类型无效的操作
UnicodeError            Unicode 相关的错误
UnicodeDecodeError      Unicode 解码时的错误
UnicodeEncodeError      Unicode 编码时错误
UnicodeTranslateError    Unicode 转换时错误
以下为警告类型 Warning   警告的基类 DeprecationWarning 关于被弃用的特征的警告 FutureWarning 关于构造将来语义会有改变的警告 OverflowWarning 旧的关于自动提升为长整型(long)的警告 PendingDeprecationWarning 关于特性将会被废弃的警告 RuntimeWarning 可疑的运行时行为(runtime behavior)的警告 SyntaxWarning 可疑的语法的警告 UserWarning 用户代码生成的警告

raise 语句
    作用:触发一个错误,让程序进入异常状态
  raise语法:
    raise 异常类型
    或
    raise 异常对象

示例.raise.py
#练习 写一个函数 get_age()用来获取一个人的年龄信息
#此函数 规则用户只能输入1-140之间的整数,如果用户输入其它
#的数则直接 触发ValueError类型的错误!

def get_age():
    n = input('请输入年龄:')
    if 140 >= int(n) >= 1:
        return int(n)
    raise ValueError('用户输入数不是1-140之间的数')

try:
    age = get_age()
    print('用户输入的年龄是:',age)
except ValueError as ValueError:
    print('用户输入数不是1-140的整数!!,获取年龄失败')

assert语句(断言语句):
    语法:
      assert 真值表达式, 错误数据(通常是字符串);
    作用:
      当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态;
    等同于:
      if 真值表达式 == False:
        raise AssertionError(错误数据)

示例见:
# 练习:
# 获取输入学生的成绩(0~100)如题不是0到100则返回错误;
def get_score():
    s = input('请输入学生成绩(0~100):')
    score = int(s)
    #用assert语句来断言score是否在0~100之间
    assert 0 <= score <= 100,'用户输入的整数不在0~100之间'
    return score
try:
    score = get_score()
    print('您输入的成绩:', score)
except ValueError:
    print('输入的成绩无法转换为整数')
except AssertionError as err:
    print('发生了断言错误,原因是:', err)
异常小结:
     语句:
    try - except    捕获异常,偿试接收异常通知;
    try - finally    执行一定要执行的语句;
    raise        发送异常通知,将程序转为异常状态,进入异常流程;
    assert        根据条件来触发AssertionError断言类型的异常;
    with 语句以后再学

为什么要用异常处理机制:
  在程序调用层数较深时,向主调函数传递错误信息需要层层return返回比较麻烦,所以用异常处理机制来解决此类问题;

# 练习:
# 获取输入学生的成绩(0~100)如题不是0到100则返回0;

def get_score():
    s = input('请输入学生成绩(0~100):')
    try:
        score = int(s)
    except:
        return 0

    if 0 <= score <= 100:
        return score

    return 0

score = get_score()
print('您输入的成绩:', score)



#练习 写一个函数 get_age()用来获取一个人的年龄信息
#此函数 规则用户只能输入1-140之间的整数,如果用户输入其它
#的数则直接 触发ValueError类型的错误!

def get_age():
    n = input('请输入年龄:')
    if 140 >= int(n) >= 1:
        return int(n)
    raise ValueError('用户输入数不是1-140之间的数')

try:
    age = get_age()
    print('用户输入的年龄是:',age)
except ValueError as ValueError:
    print('用户输入数不是1-140的整数!!,获取年龄失败')




# 练习:
# 获取输入学生的成绩(0~100)如题不是0到100则返回错误;

def get_score():
    s = input('请输入学生成绩(0~100):')
    score = int(s)
    #用assert语句来断言score是否在0~100之间
    assert 0 <= score <= 100,'用户输入的整数不在0~100之间'
    return score

try:
    score = get_score()
    print('您输入的成绩:', score)
except ValueError:
    print('输入的成绩无法转换为整数')
except AssertionError as err:
    print('发生了断言错误,原因是:', err)


#


#exception_sample.py
def f1():
    print('开始建房子打地基')
    print('完成打地基工作')
    return '地基完成'

def f2():
    print('开发建设地上部分')
    print('完成地上部分')
    return '地面完成'

def f3():
    '''建地基'''
    r1 = f1()
    #建地上部分
    r2 = f2()
    return r1 + r2

def built_house():
    '''接项目的人'''
    return f3()

h = built_house() #建房子的函数,此函数应当返回一个房子的对象

print(h)




# #练习
# 1.一个球从100米高空落下,每次落地后反弹高度为原高度的一半,再落下,写程序
#   a. 算出皮球在第10次落地后反弹多高
#   b. 打印出皮球共经历了多少米路程

# 2. 分解质因数,输入一个正整数,分解成质因数
# 如输入:90,则打印:
#   90 = 2 * 3 * 3 * 5
#   质因娄是指最小能被原数整除的素数(不包含1)

#  3. 写同课异构打印杨辉三角(只打印6层)
#       1
#      1 1
#     1 2 1
#    1 3 3 1
#   1 4 6 4 1
# 1 5 10 10 5 1


# h/2 h/4 8 16 32 64 128 256 512 1024
#1. a
h = 100
def get_height(n):
    return  h / 2 ** n

print('1. a 皮球第10次落地后的反弹高度为%-12.10f米' % get_height(10))        #注意%f格式
# 方法二
def get_last_height(h,n):
    for _ in range(n):
        h /= 2
    return h
get_last_height(100,10)

#方法三
def get_last_height1(h, n):
    if n == 0:
        return 100
    return get_last_height1(h, n - 1) / 2

get_last_height1(100, 10)

#1.b

def get_sum_height(n):
    s = 0
    for k in range(1, n + 1):
        s += h / 2 ** k
    return s


print('1. b.皮球共经历了%d米路程' % get_sum_height(10))

# b方法二
def get_distance(h,times):
    s = 0
    for _ in range(times):
        s += h + h / 2
        h /= 2
    return s

get_distance(100, 10)






#2.将数分解质因数

def is_prime(x):
    '''判断x是否为质数,如果是返回True,否则返回False'''
    if x < 2:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    return True

def fenjie_number(n):
    '''此函数分解一个数n为最小质数和商的列表,返回['最小质数','商']'''
    #使用列表推导式,计算出小于等于n的质数列表
    L = [x for x in filter(is_prime, range(2, n))]
    for k in L:
        if n % k == 0:
            return [k, (n // k)]

def check_listNum(n):
    '''根据用户输入的数,赋值给列表;再对列表中的元素判断是否为质数,如果不是质数对该元素做分解'''
    L = [n]
    for k in L:
        if not is_prime(k):
            #判断不是质数,调用分解数函数,返回新列表对原列表做加运算
            L += fenjie_number(k)
            #从原列表中删除之前判断不是质数的数
            L.remove(k)
    return L


def main():
    n = int(input('请输入正整数:'))
    print(n, ' = ', ' * '.join([str(x) for x in  check_listNum(n)]))

# if __name__ == '__main__':
    # main()
# 方法二:递归

n = int(input('请输入正整数:'))

def is_prime1(x):
    if x < 2:
        return False
    for i in range(x):
        if x % i == 0:
            return False
    return True

def get_yinshu_list(n):
    L = []    #存放质因数
    x = n
    while not is_prime1(x):        #先判断给的整数是否为质数,如果为质数无需分解直接加入列表,return列表
        for i in range(2, x):    #用循环从2开始
            if x % i == 0 and is_prime1(i):    #当被i整数,再判断i是否为质数,是则把i加入到整数质因数列表,
                L.append(i)
                x = int(x / i)        #变换x的值,已经被分解一次,需要判断商,是否还可分解
                break
    L.append(x)
    return L

get_yinshu_list(90)







#  3. 写同课异构打印杨辉三角(只打印6层)
#       1
#      1 1
#     1 2 1
#    1 3 3 1
#   1 4 6 4 1
# 1 5 10 10 5 1

#yanghui.py

def get_yanghui_list(n):    #n代表层数
    '''此函数用于返回每层的列表的列表'''
    layers = []    #用于存储每一行的数据[[1],[1,1],[1,2,1]...]
    L = [1]
    for __ in range(n):    #循环,每次加入layers中一行
        layers.append(L)    #先把第一行加入
        #算出下一行,再用L重新绑定
        one_line = [1]    #最左边的1
        #算出中间的数字
        for i in range(len(L) -1):
            one_line.append(L[i] + L[i + 1])
        one_line.append(1)    #加入最右边的1
        L = one_line #让L绑定新的一行,再循环
    return layers

print(get_yanghui_list(6))
原文地址:https://www.cnblogs.com/pineliao/p/12100863.html