python核心编程第二版第十章学习笔记

一.错误和异常
1.错误
    从软件方面来说, 错误是 语法 或是 逻辑 上的 . 语法错误指示软件的结构上有错误, 导致不能被解释器解释或编译器无法编译. 这些错误必须在程 序执行前纠正. 当程序的语法正确后, 剩下的就是逻辑错误了. 逻辑错误可能是由于不完整或是不合法的输入 所致在其他情况下, 还可能是逻辑无法生成, 计算, 或是输出结果需要的过程无法执行. 这些错 误通常分别被称为域错误和范围错误.
2.异常
    对异常的最好描述是:  它是因为程序出现了错误而在正常控制流以外采取的行为.  这个行为又 分为两个阶段: 首先是 引起异常发生的错误,  然后是 检测(和采取可能的措施)阶段.
    第一个阶段是在发生了一个异常条件(有时候也叫做例外的条件)后发生的. 只要检测到错误 并且意识到异常条件, 解释器会引发一个异常. 引发也可以叫做触发, 引发或者生成. 解释器通 过它通知当前控制流有错误发生. Python 也允许程序员自己引发异常. 无论是 Python 解释器还是 程序员引发的, 异常就是错误发生的信号. 当前流将被打断, 用来处理这个错误并采取相应的操作. 这就是第二阶段.
二.Python 中的异常
 所有错误, 无论是语意上的还是逻辑上的, 都是由于和 Python 解释器不相容导致的, 其后果就是引发异常.
三.检测和处理异常
异常可以通过 try 语句来检测. 任何在 try 语句块里的代码都会被监测, 检查有无异常发 生.
try 语句有两种主要形式: try-except 和 try-finally .
特点:这两个语句是互斥的, 也就是说你只能使用其中的一种. 一个 try 语句可以对应一个或多个 except 子句, 但只能对应一个finally 子句, 或是一个 try-except-finally 复合语句.
1.try-except语句
  try-except语句 检测异常和处理异常。
核心笔记: 忽略代码, 继续执行, 和向上移交
    try 语句块中异常发生点后的剩余语句永远不会到达(所以也永远不会执行). 一旦一个异常被 引发, 就必须决定控制流下一步到达的位置. 剩余代码将被忽略, 解释器将搜索处理器, 一旦找到, 就开始执行处理器中的代码. 如果没有找到合适的处理器, 那么异常就向上移交给调用者去处理, 这意味着堆栈框架立即回 到之前的那个. 如果在上层调用者也没找到对应处理器, 该异常会继续被向上移交, 直到找到合适 处理器. 如果到达最顶层仍然没有找到对应处理器, 那么就认为这个异常是未处理的, Python 解释 器会显示出跟踪返回消息, 然后退出.
2.带有多个 except 的 try 语句
这种格式的 except 语句指定检测名为 Exception 的异常. 你可以把多个 except 语句连接 在一起, 处理一个 try 块中可能发生的多种异常, 如下所示:

except Exception1[, reason1]:
    suite_for_exception_Exception1
except Exception2[, reason2]:
    suite_for_exception_Exception2

我们还可以在一个 except 子句里处理多个异常. except 语句在处理多个异常时要求异常被放 在一个元组里:


except (Exception1, Exception2)[, reason]:
    suite_for_Exception1_and_Exception2

核心风格: 不要处理并忽略所有错误
    Python 提供给程序员的 try-except 语句是为了更好地跟踪潜在的错误并在代码里准备好处 理异常的逻辑. 这样的机制在其他语言(例如 C ) 是很难实现的. 它的目的是减少程序出错的次数 并在出错后仍能保证程序正常执行. 作为一种工具而言, 只有正确得当地使用它, 才能使其发挥作 用.
一个不正确的使用方法就是把它作为一个大绷带"绑定"到一大片代码上. 也就是说把一大段程 序(如果还不是整个程序源代码的话)放入一个 try 块中, 再用一个通用的 except 语句 "过滤" 掉任何致命的错误, 忽略它们.

# this is really bad code
try:
    large_block_of_code # bandage of large piece of code
except Exception: # same as except:
    pass # blind eye ignoring all errors

    很明显, 错误无法避免, try-except 的作用是提供一个可以提示错误或处理错误的机制, 而不 是一个错误过滤器. 上边这样的结构会忽略许多错误, 这样的用法是缺乏工程实践的表现, 我们 不赞同这样做.
    底线: 避免把大片的代码装入 try-except 中然后使用 pass 忽略掉错误. 你可以捕获特定 的异常并忽略它们, 或是捕获所有异常并采取特定的动作. 不要捕获所有异常,然后忽略掉它们.
3.try-except-else语句
try-except 语句段, else的功能和你所见过的其他else 没有太多的不同:在try 范围中没有异常被检测到时,执行else 子 句.
4 .try-except(else可选)-finally语句
finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码.你可以将finally 仅仅配合 try 一起使用,也可以和try-except(else 也是可选的)一起使用.
5.try-finally 语句
    这个try-finally 语句和try-except 区别在于它不是用来捕捉异常的.作为替代,它常常用来维持一致的行为而无论异常是否发生.我们 得知无论try 中是否有异常触发,finally 代码段都会被执行.
当在try 范围中产生一个异常时,(这里)会立即跳转到finally 语句段.当finally 中的所有代 码都执行完毕后,会继续向上一层引发异常.
    反对这种写法的一个理由是:在很多情况下,异常处理器需要做一些扫尾工作,而如果你在异常 处理之前,用finally 语句块中释放了某些资源,你就不能再去做这项工作了.简单的说,finally 语句 块并不是如你所想的是"最终的(final)"了.
    一个最终的注意点:如果finally 中的代码引发了另一个异常或由于return,break,continue 语 法而终止,原来的异常将丢失而且无法重新引发.

ccfile = None
try:
    try:
        ccfile = open('carddata.txt', 'r')
        txns = ccfile.readlines()
    except IOError:
        log.write('no txns this month\n')
finally:
    if ccfile:
        ccfile.close()
程序分析:1.若文件打开失败,将错误信息写在日志里,然后关闭文件。
          2.若文件打开成功,读取文件,然后关闭。
这种读取文件的方式,安全可靠。
6. with 语句
类似try-except-finally , with 语句也是用来简化代码的,这与用try-except 和try-finally 所想达到的目的前后呼应.try-except 和try-finally 的一种特定的配合用法是保证共享的资源的 唯一分配,并在任务结束的时候释放它.比如文件(数据,日志,数据库等等),线程资源,简单同步,数 据库连接,等等. with 语句的目标就是应用在这种场景.
with 语句的目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关 代码统统去掉, 而不是像 try-except-finally 那样仅仅简化代码使之易用. with 语法的基本用法 看上去如下:
with context_expr [as var]:
    with_suite
你不能对 Python 的任意符号使用with 语句.它仅能工作于支持上下文管理协议(context management protocol)的对象.这显然意味着只有内建了"上下文管理"的对象可以和with 一起工作.

with open('/etc/passwd', 'r') as f:
     for eachLine in f:
# ...do stuff with eachLine or f...

这个代码片段干了什么呢...嗯,这是Python,因而你很可能的已经猜到了.它会完成准备工作, 比如试图打开一个文件,如果一切正常,把文件对象赋值给f.然后用迭代器遍历文件中的每一行,当 完成时,关闭文件.无论的在这一段代码的开始,中间,还是结束时发生异常,会执行清理的代码,此外文件仍会被自动的关闭.
四.触发异常
Python 提供了一种机制让程序员明确的触发异 常:这就是raise 语句.
raise 语句
1.抛出一个指定的异常
try:
     try :
          raise   IOError
     except   IOError:
          print  ( "inner exception")
          raise   # <same as raise IOError>
except   IOError:
     print ("outter exception")
结果:
inner   exception
outter   exception
首先被内层IOError异常捕获,打印“inner exception”, 然后把相同的异常再抛出,被外层的except捕获,打印"outter exception"
2.自定义一个异常类
自定义一个MyException类,继承Exception。

1
2
3
4
class   MyException(Exception):
     def   __init__( self ,message):
         Exception.__init__( self )
         self .message = message   




如果输入的数字小于10,就引发一个MyException异常:

1
2
3
4
5
6
a = input ( "please input a num:" )
if   a< 10 :
     try :
         raise   MyException( "my excepition is raised " )
     except   MyException,e:
         print   e.message




  
运行结果:
please input a num:1
my excepition is raised
五、python 所有的标准异常类:

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

六.断言
    在写程序的时候,我们总希望出现错误的时候有准确的错误提示,特别是自己不是百分百确定程序 正确的时候, Python给我们提供了一种自己定义错误的语句:assert expression1,expression2 这就是我们所说的断言。
断言的意义:在表达式expression1为假的时候,结束程序,抛出断言类错误 (AssertionError: expresssion2)

a = 10
assert   type ( a )== str , 'a is the int of type'

Traceback (most recent call last):
  File "E:/IDIE/10/10-3.py", line 2, in <module>
    assert type(a)==str,' is the int of type'
AssertionError: a is the int of type
当a为字符串类型时,就不会出现错误提示,并且没有输出 AssertionError 异常和其他的异常一样可以用try-except 语句块捕捉。
七.异常和sys 模块
try :
     float ( '123qbd' )
except :
     import   sys
     e=sys.exc_info()
     print (e)
for   each   in   e:
print (each)
输出:


(<class 'ValueError'>, ValueError("could not convert string to float: '123qbd'",), <traceback object at 0x018E2C88>)
<class 'ValueError'>
could not convert string to float: '123qbd'
<traceback object at 0x018E2C88>

从上面的例子中,可以得到下面的信息
我们从sys.exc_info()得到的元组中是:
��   exc_type: 异常类
��   exc_value: 异常类的实例
��   exc_traceback: 追踪(traceback)对象
八.
try :                                             try :
          obj= open ( 'carddata.txt' )                obj= open ( 'carddata.txt' )
    except   IOError :                                 print ( 'i am happy')
              print ( 1 )                                 except   IOError :  
   else:                                                   print(1)
              print('i am happy')

这两个程序 所实现的功能是相同
九.cmath 模块、math模块
cmath.sqrt(num)   num可以是负数,而math模块的sqrt函数的参数只能是正数

math.ceil(number)         返回数的上入整数,如math.ceil(4.1) 返回 5
math.floor(number)       返回数的下舍整数,如math.floor(4.9)返回 4
math.e                   返回对数中的e值,math.e返回常量值 2.718281828459045
math.pi                 返回圆周率PI的值,math.pi 返回常量值 3.141592653589793 math.e
math.exp(x)               返回e的x次幂,如math.exp(1) 返回2.718281828459045
math.log(x[,base])       如math.log(math.e)返回1.0,math.log(100,10)返回2.0
math.log10(x)             返回以10为基数的x的对数,如math.log10(100)返回 2.0
math.degrees(x)         将弧度转换为角度,如math.degrees(math.tan(1.0)) ,返回30.0
math.sin(x)             返回正弦值,如math.sin(math.pi/2) 返回1.0 sin(x)返回正弦值,如math.sin(math.pi/2) 返回1.0
math.cos(x)             返回余弦值,如math.cos(math.pi) 返回-1.0
math.tan(x)             返回正切值,如math.degrees(math.tan(1.0)) ,返回30.0
13. str . rfind ( str ,   beg = 0   end = len ( string ))
str -- 查找的字符串 str -- 查找的字符串
beg -- 开始查找的位置,默认为 0
end -- 结束查找位置,默认为字符串的长度。

14. 当没有显式地返回元素或者如果返回None 时, python 会返回一个 None.那么调用 者接收的就是python 返回的那个对象,且对象的类型仍然相同。如果函数返回多个对象,python 把 他们聚集起来并以一个元组返回。是的,尽管我们声称python 比诸如c 那样只允许一个返回值的语 言灵活的多,但是老实说,python 也遵循了相同的传统。只是让程序员误以为可以返回多个对象。

15. def net_conn(host, port):
          net_conn_suite
不按照函数声明中的参数顺 序输入,但是要输入相应的参数名,如下例:
net_conn(port=8080, host='chino')

16. 这些参数包括标准的位置参数和关键字参数,所以在python 中允
许的函数调用的完整语法为:
func(positional_args, keyword_args,
*tuple_grp_nonkw_args, **dict_grp_kw_args)

16.random模块
1.random.random()
 #用于生成一个0到1的
随机浮点数:0<= n < 1.0
2. random.uniform(a,b) 
#用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a <b,则生成的随机数n: a <= n <= b。如果 a >b, 则 b <= n <= a。
3.random.randint(a,b)
#用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
4. random.randrange([start], stop[, step])
 #从指定范围内,按指定基数递增的集合中 获取一个随机数。
random.randrange(10, 30, 2),结果相当于从[10, 12, 14, 16, ... 26, 28]序列中获取一个随机数。random.randrange(10, 30, 2)在结果上与 random.choice(range(10, 30, 2))等效
5. random.choice(sequence)
#参数sequence表示一个有序类型。从序列中获取一个随机元素.sequence在 python 不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。
6.random.shuffle(x[, random])
#用于将一个列表中的元素打乱,即将列表内的元素随机排列。
7.random.sample(sequence, k)
#从指定序列中随机获取指定长度的片断并随机排列。sample函数不会修改原有序列。

17. from   operator   import   add,sub
num=[ 5 , 6 ]
print (sub(*num))
print(add(*num))
输出:-1
              11

18. def helloSomeone(who):                                    #函数声明标题行
'returns a salutory string customized with the input' #函数体
return "Hello " + str(who)  
和其他高级语言类似,Python 也不允许在函数未声明之前,对其进行引用或者调用.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值