文章标题
来源:互联网 发布:win10系统优化软件 编辑:程序博客网 时间:2024/06/11 19:31
第八章 异常
8.1 捕捉异常
try:
x = input(“enter a number: “)
except ZeroDivisionError:
print “the second number can not be zero!”
上面的except子句可以有多个,可以捕捉多种类的异常。
8.2 全捕捉
try:
x = input(“enter a number: “)
except:
print “something wrong!”
8.3 没坏事发生时执行一段代码
try:
x = input(“enter a number: “)
except:
print “what is wrong!”
else:
print “that is no wrong things happen”
8.4 finally
finally:子句肯定被执行
8.5 异常和函数
- 产生的异常会随着函数,函数调用,主程序传播,最终会导致栈跟踪。
- 如果不想让异常出现之前被输出,可以用”+”号
如:
try:
print “Occupation: ” + person‘occupation’
第九章 魔方方法,属性和迭代器
9.1 构造方法
- 形式: init()
继承时,构造函数会重写
class Bird: def __init()__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaa...' self.hungry = Fase else: print 'Not hungry'class SongBird(Bird): def __init__(self): self.sound = 'Squawk' def sing(self): print self.sound
当用
S = SongBird()
调用eat()
会出错,因为SongBird
重写了构造函数,而在它的构造函数里没有定义hungry
这个变量。
解决方法:
(1)调用未绑定的超类构造函数方法:class Bird: def __init()__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaa...' self.hungry = Fase else: print 'Not hungry'class SongBird(Bird): def __init__(self): ``` Bird.__init__(self) ``` self.sound = 'Squawk' def sing(self): print self.sound
(2)使用super函数:
class Bird: def __init()__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaa...' self.hungry = Fase else: print 'Not hungry'class SongBird(Bird): def __init__(self): ``` super(SongBird,self).__init__() ``` self.sound = 'Squawk' def sing(self): print self.sound
比较这两种方法:
super
更优,更智能,即使类有多个超类,只需要一次super
,在两个超类继承同一个超类,super
会自动处理。
8.3 成员访问
8.4 property函数(代替set,get方法)
#能将get和set方法隐藏起来,使用时不用考虑是否用get/set实现,直接当属性一样使用__metaclass__= typeclass Rectangle:self.width = 0self.height = 0def setSize(self,size): self.width,self.height = sizedef getSize(self,size):return self.width,self.heightsize = property(getSize,setSize)r = Rectangle()r.width = 5r.height = 10r.size:(5,10)r.size = 50,19r.width:50
8.5 静态方法和类成员方法
__metaclass__=typeclass MyClass:def smeth(): print 'This is a static method'smeth = staticmethod(smeth)def cmeth(cls): print 'This is a class method of',clscmeth=classmethod(cmeth)
加上装饰器后不用实例化:
__metaclass__=type@staticmethodclass MyClass:def smeth(): print 'This is a static method'@classmethoddef cmeth(cls): print 'This is a class method of',cls
8.6 迭代器
要调用next()
方法时,迭代器才返回它的下一个值,要有next()
和iter()
函数:
class Fibs: def __init__(self): self.a = 0 self.b = 0 def next(self): self.a,self.b = self.b,self.a+self.b return self.a def __iter__(self): return self for f in Fibs: print f
结果会一个个打印出b值。
8.7生成器
#递归生成器,nested=[[1,2],3]def flatten(nested): try: for sublist in nested: for element in flatten(sublist): print 'element:',element yield element except TypeError: print "nested:",nested yield nested #运行 flatten(nested) 结果: nested:1 element:1 element:1 nested:2 element:2 element:2 nested:3 element:3
结果解析:运行yield
语句时,函数停止,当时递归时就会返回上一层继续执行上一层的断点。
生成器解决八皇后问题:
#判断冲突函数def conflict(state,nextX):nextY = len(state)for i in range(nextY): if abs(nextX-state[i]) in (0,nextY-i):#当水平距离等于垂直距离或和前一个皇后水平距离为0时冲突 return Truereturn False#解决函数,pos每取一个值计算一种可能def queens(num,state=()):for pos in range(num): if not conflict(state,pos): if len(state)==num-1:#当最后一个递归时返回,返回到最后一层时再次调用 yield (pos,) else: for result in queens(num,state+(pos,)):# yield (pos,)+result
运行:list(queens(4))
结果:[(1, 3, 0, 2), (2, 0, 3, 1)]
运行:len(list(queens(8)))
结果:92
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- poj 图相关之2485Highways
- 手把手教你搭建 Selenuim 自动化环境
- 简单模拟资料管理器
- 谈谈自己对比特币脚本的理解
- Android基础之网络视频播放器
- 文章标题
- 换皮肤?系列工厂/抽象工厂(模式)的实现
- Java阶段性学习重点
- CodeChef MOU2H
- ubuntu下ftp服务器的配置
- css排版和元素分类
- opencv学习笔记(6)----鼠标操作
- 2017年四川省赛 -- G题 2017 【容斥定理】
- 【CUDA开发】 Check failed: error == cudaSuccess (8 vs. 0) invalid device function