Python学习笔记(七)

一、异常

(一)概述

一般情况下,在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试图访问字典里不存在的键
KeyboardInterruptCtrl+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秒以后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值