一. 指派游戏
先来回顾一下,昨天的内容
1. import 一个模块相当于执行这个py文件
2.模块不会被重复导入
3.导入的模块存到sysmodules里
4.导入模块的之后发生了什么:
先看看模块在不在sys.modules里,如果不在:
生成一个属于模块的命名空间
执行py文件
创建一个与py文件同名变量来引用这个空间中的名字
把导入的这个模块放到sys.modules里
5.from ...import....
6. 绝对导入和相对导入
7.软件开发规范
抽牌
from collections import namedtuple Card = namedtuple('Card', ['rand', 'suit']) # 定义2个属性,牌面和花色 class FranchDeck: ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 列表推导式+列表,组合成13张牌 suits = ['红心', '方板', '梅花', '黑桃'] # 4种花色 def __init__(self): self._cards = [Card(rank, suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] # 取出52张牌,返回一个列表。 # [Card(rand='2', suit='红心'),Card(rand='2', suit='方板')...] def __len__(self): return len(self._cards) # 获取列表长度 def __getitem__(self, item): return self._cards[item] # 取一张牌 deck = FranchDeck() print(deck[0]) # 取第一张牌 from random import choice print(choice(deck)) # 随机选择一张牌 print(choice(deck))
上面的代码是靠__len__和__getitem__实现抽牌,每次拿到的牌是不一样的。
描述一张牌
from collections import namedtuple Card = namedtuple('Card',['rand','suit']) #定义2个属性,牌面和花色 print(Card('2','红心'))
from collections import namedtuple Card = namedtuple('Card', ['rand', 'suit']) # 定义2个属性,牌面和花色 class FranchDeck: ranks = [str(n) for n in range(2, 11)] + list('JQKA') suits = ['红心', '方板', '梅花', '黑桃'] def __init__(self): self._cards = [Card(rank, suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self): return len(self._cards) def __getitem__(self, item): return self._cards[item] def __setitem__(self, key, value): self._cards[key] = value deck = FranchDeck() # print(deck[0]) #抽第一张牌 from random import choice # print(choice(deck)) # print(choice(deck)) from random import shuffle shuffle(deck) # 打乱次序,洗牌 # print(deck[:5]) # 抽5张牌 print(deck[:]) # ,每次52张牌是不一样的。
二,异常和错误
程序中难免 出现错误,而错误分成两分钟
1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
if name = 10 #2.逻辑错误 num = 0 100/num
这个蓝色链接信息,是Pycharm做的,它可以跳转到指定的代码位置
ZeroDivisionError是python解释器报的
什么是异常
异常就是程序运行时发生错误的信号,在python种,错误错发的异常如下
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下
python中的异常种类
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
触发IndexError
1
2
|
l = [ 'egon' , 'aa' ] l[ 3 ] |
触发KeyError
1
2
|
dic = { 'name' : 'egon' } dic[ 'age' ] |
触发ValueError
1
2
|
s = 'hello' int (s) |
常用异常
三、异常处理
什么是异常?
异常发生之后,异常之后的代码就不执行了
什么是异常处理
python解释器检测到错误,触发异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
为什么要进行异常处理?
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。
所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性
如何进行异常处理?
首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正
一、使用if判断式
正常的代码
1
2
|
num1 = input ( '>>: ' ) #输入一个字符串试试 int (num1) |
执行就报错了
什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。
一般情况下,在python无法正常处理程序时候就会发生一个异常,异常是python对象。表示一个错误。
当python脚本发生异常我们需要捕获处理它,否则程序会终止执行。
try: print("%d" % (5 / 0)) except ZeroDivisionError: print("除数不能为零") else: print("没有报错") print("这是异常之后的代码") #如果没有上面的异常处理,下面的代码是不会执行的 for i in range(10): print(i)
捕捉异常:
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try的工作原理
当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可
以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
1. 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的
except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异
常)。
2. 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的
try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
3. 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的
话),然后控制流通过整个try语句。
例
打开一个文件,在该文件中的写入内容,且并未发生异常:
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
结果:
# python test.py
内容写入文件成功
# cat testfile # 查看写入的内容
这是一个测试文件,用于测试异常!!
例
打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
在执行代码前为了测试方便,先去掉 testfile 文件的写权限
再执行以上代码:
$ python test.py #注意这里用的是普通用户
Error: 没有找到文件或读取文件失败
使用except不带任何异常类型
你可以不带任何异常类型使用except,如下实例:
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序
识别出具体的异常信息。因为它捕获所有的异常。
二,python为每一种异常制定了一个类型,然后提供了一种特定的语法结构用来进行异常处理。
part1 基本语法:
try: 被检测的代码块 except 异常类型: try 中一旦检测到异常,就执行这个位置的逻辑
f = open('a.txt') g = (line.strip() for line in f) for line in g: print(line) else: f.close()
如果文件不存在,提示报错
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
ArithmeticError AssertionError AttributeError BaseException BufferError BytesWarning DeprecationWarning EnvironmentError EOFError Exception FloatingPointError FutureWarning GeneratorExit ImportError ImportWarning IndentationError IndexError IOError KeyboardInterrupt KeyError LookupError MemoryError NameError NotImplementedError OSError OverflowError PendingDeprecationWarning ReferenceError RuntimeError RuntimeWarning StandardError StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError