Python学习笔记(七)

╄→гoц情女王★ 提交于 2019-11-27 03:43:24

一、异常

(一)概述

一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

(二)异常处理

1、 格式

try:
    <statements>        #运行try语句块,并试图捕获异常
except <name1>:
    <statements>        #如果name1异常发现,那么执行该语句块。
except (name2, name3):
    <statements>        #如果元组内的任意异常发生,那么捕获它
except <name4> as <variable>:
    <statements>        #如果name4异常发生,那么进入该语句块,并把异常实例命名为variable
except:
    <statements>        #发生了以上所有列出的异常之外的异常
else:
    <statements>            #如果没有异常发生,那么执行该语句块
finally:
    <statement>         #无论是否有异常发生,均会执行该语句块。

2、关键字

  1. try:
    可能出现异常的代码块
  2. except:

except 异常名:
捕获到指定异常

except (异常名1,异常名2,…):
捕获多个异常

except:
捕获所有异常

  1. as

我们在捕获这个异常之后假如需要访问它的一些属性,这个时候就可以使用as关键字

try:
    raise MyError(2*2)
except MyError as e:
    print('My exception occurred, value:', e.value)
  1. else:
    没有发生异常时执行
  2. finally
    无论是否发生异常都会执行

(三)抛出异常

raise语句用来手动抛出一个异常
格式:raise [exceptionType[,argument][,traceback]]

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)   # 执行到这一句聚会抛出这个异常
        # 触发异常后,后面的代码就不会再执行
    print("异常后不会执行啦!")

functionName(0)
def testRaise(number):
    if number < 1:
        raise ValueError('Invalid value') #或者 raise ValueError,'Invalid value'
 
testRaise(0)

常用错误异常

异常名 含义
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError 语法错误
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

(四)用户自定义异常

可以通过创建一个新的异常类拥有自己的异常,异常应该是通过直接或间接的方式继承自Exception类。

class MyError(Exception):
	def __init__(self, msg):
		self.msg = msg
	
	def __str__(self):
		return self.msg
 
try:
	raise MyError('类型错误')
except MyError as e:
	print('My exception occurred', e.msg)
 

二、单元测试

(一)概述

单元测试用来对一个函数,一个类或者一个模块来进行一个正确性的校验工作。

(二)基本使用

1、使用步骤

1、定义一个类继承unittest.TestCase
2、调用单元测试方法
3、调用unittest.main() 执行测试代码

注意:
      单元测试的函数名一般默认以Test_开头
      setUp函数:放一些初始化的内容相当于__init__函数
      tearDown函数:放对象销毁时的内容相当于__del__函数

class Test(unittest.TestCase):
    def setUp(self):
        print('开始测试时,自动调用')
    def tearDown(self):
        print('结束时,自动调用')
    def test_mysum(self):
        self.assertEqual(add(1,2),3)
if__name == "__main__"
    unittest.main()

(三)测试方法

方法名 作用
assertEqual(值,表达式) 是否相等
assertAlmostEqual() 是否约等于
assertTrue() 是否为真
assertIn() 是否包含
assertIs() 是否为同引用
assertIsNone() 是否为空
assertIsInstance() 是否某类型实例
assertGreater() 是否大于

三、数值格式化

(一)正常表示

f = "数值:{}".format(a)
print(f)

(二)浮点表示

f = "数值:{:f}".format(a)
print(f)
f1 = f"数值:{a:f}"
print(f1)

(三)带上符号

1、正数带上正号

f2 = f"数值:{a:+f}"
print(f2)

2、负数带上负号(正数不会发生改变)

f3 = f"数值:{b:-f}"
print(f3)

(四)位数显示

f = f"数值:{a:,f}"
print(f)

(五)保留位数

f = f"数值:{a:,.2f}"
print(f)

四、随机数

使用时需要导入random模块

常用方法

方法名 作用
random.choice(序列名) 序列(列表,元组,range)中随机选一个值
random.sample(序列名, 个数) 获取指定数目的序列
random.shuffle(序列名) 打乱序列,返回值为空,原序列改变
random.randint(最小值,最大值) 生成范围内的随机整数,两边界都包括
random.random() 生成0~1的小数
random.getrandbits(位数) 生成指定bit位数的随机数

五、日期与时间(datetime)

(一)date

1、构造函数
datetime.date(年, 月, 日)

2、常用属性和方法

  • 属性
    today.year:获取年
    today.month:获取月
    today.day:获取日
  • 方法
    today = datetime.date.today():当前日期
    today.weekday():从0开始的星期
    today.isoweekday():标准星期

(二)time

1、构造函数
t = datetime.time(时,分,秒)

2、常用属性

  • t.hour:时
  • t.minute:分
  • t.second:秒

(三)datetime

1、构造函数
dt = datetime.datetime(年,月,日,时,分,秒,微秒)

2、常用属性和方法

  • 属性
    dt.year
    dt.month
    dt.day
    dt.hour
    dt.minute
    dt.second
    dt.microsecond:微秒
  • 方法
    time = datetime.date.now():当前日期和时间

(四)常量

  1. datetime.MAXYEAR:最大年份(9999)
  2. datetime.MINYEAR:最小年份(1)

(五)格式转换

1、字符串转日期时间
datetime.datetime.strptime("时间字符串", “格式”)

2、日期转字符串
datetime.datetime.strftime("格式")

3、格式占位符

名称 作用
%Y 四位年份
%y 二位年份
%m 二位月份
%d 二位日期
%H 二位小时
%M 二位分钟
%S 二位秒数
%f 微秒
%w 星期数(0~6)
s = "2018-8-11"
dt = datetime.datetime.strptime(s, "%Y-%m-%d")
print(dt)

now = datetime.datetime.now()
print(now.strftime("%y-%m-%d"))

(六)timedelta时间跨度处理

两个datetime对象之差为datetime.timedetla对象

1、常用参数

  • days
  • hour:小时
  • seconds:秒
now = datetime.datetime.now()
print(now)
print(now + datetime.timedelta(days=100))  # 100天以后
print(now + datetime.timedelta(seconds=-29)) # 29分钟前
print(now + datetime.timedelta(minutes=100)) # 100秒以后
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!