Python笔记之第九天--异常-测试-日期-随机数处理-小数格式

一、异常

异常分类

1语法错误:在静态语言中,如C#,Java中有编译过程,通过编译可以检查出语法错误,编译通过后就可以运行了。而在Python语言是解释性语言,即写完代码,解释器一解释,即程序就运行了,所以Python只有在运行时候才可发现语法错误。
2 语义错误 例如/0
3逻辑错误,与代码无关,即结果不是想要的,只与代码设计有关。
Python中:SyntaxError为语法错误,ZeroDivisionError为除0错误。

异常语法格式

try:
将有可能出错的代码放在这,即tryexcept:这种是可以捕获任何异常
  print'遇到异常就执行'
try:
将有可能出错的代码放在这,即tryexcept ZeroDivisionError:#这种是可以捕获具体的除0异常
print('不能除0')

例如1:

try:
    x=5/0
except ZeroDivisionError:
    print('只捕获除0异常')
except#只要不是除0异常的其他异常,都在这可以捕获到
 	print'遇到异常就执行')
``
测试结果:

```python
只捕获除0异常

例如2:
#因为Python中每一个异常都是一个类,即一些异常信息都是依附实例的,所以
要想得到这个异常的详细信息,可以这样做,如下:

try:
    x=5/0
except ZeroDivisionError as e:#只要捕获到异常就交给临时变量e
    print('只捕获除0异常',e)#可以打印e来获取异常信息。

例如3:
捕获不到任何异常,执行else语句

try:
    x=5/2
except ZeroDivisionError as e:#只要捕获到异常就交给临时变量e
    print('只捕获除0异常',e)
else:#没有捕获到任何异常就执行这个
    print('没有任何异常')

测试结果:

没有任何异常

例如4
捕获属性异常

class person:
    def __init__(self,name):
        self.name=name
p=person('tom')
try:
    print(p.age)#捕获到属性异常,因为没有年龄这个属性
except AttributeError as b:
    print("属性异常",b)

具体有哪些异常

IndentationError#缩进问题
BaseException#基类异常
ArithmeticError#算术异常
BufferError#缓冲异常
AssertionError#断言异常
AttributeError#属性异常
EOFError#文件有关异常
IndexError#索引异常
KeyError#键异常

finally

文件句柄:理解为正在操作文件的一个接口或上下文。

注:不管有没有异常,最终都要执行的语句,放finally下边。
例如1:

f=open('data.txt','w')#注文件这句话放在try外边,否则放在try里边,即成局部了,即finally就收不到f这个句柄了
try:
    f.read()
except:
    print('文件读取遇到错误')
finally:#不管文件是否遇到异常时,有可能文件还在打开,所以在程序终止时,都应该让文件句柄f关闭。
    f.close()

测试结果:

文件读取遇到错误

例如2:操作数据库时,不管是否发生错误,最后也要关闭。

手动抛出异常

场景:

def  method():
    raise NotImplemented('该方法的代码还未实现')
    #NotImplemented称:未实现,遇到不支持的类型时,我常常会抛出 raise NotImplementedError
method()

测试结果:

Traceback (most recent call last):
  File "D:/python_pycharm/01/异常.py", line 38, in <module>
    method()
  File "D:/python_pycharm/01/异常.py", line 36, in method
    raise NotImplemented('该方法的代码还未实现')
TypeError: 'NotImplementedType' object is not callable

异常总结:
在这里插入图片描述

二、测试(主要是了解断言的函数有哪些才是关键,其他都是模板套路)

实例1:
#测试写的函数是否正确

def  get_format_name(first,last):
    full_name="{} {}".format(first,last)
    return full_name.title()#title可以将字符串的第一个字母变大写。即将所有单词都是以大写字母开始
print(get_format_name('tom','lee'))

写测试文件,实际开发时我们可以写一个单独的测试文件夹test,即Directory
此处所建测试文件名为:test_name

import  unittest#导入测试包
from 异常 import  get_format_name#导入要测试的函数
#在测试模块中,Python已经为我们提供了一个基类TestCase即unittest.TestCase
#定义一个类
class NameTest(unittest.TestCase):#并继承一下测试基类
    #定义一个测试方法,一般这个方法都以test_开头,因为有语法要求。
    def test_name(self):
        formate=get_format_name('tom','lee')
        #如何知道测试是否正确呢?
        #因为继承了unittest.TestCase,所以可以用他的方法测试
        self.assertEqual( formate,'Tom Lee')#用这个函数来告诉你断言结果是否正确,让他判断一下formated是否等于Tom Lee
    #这会返回True或False 判断formated是否等于Tom Lee,若等于即为ok
if __name__=='__main__':#当前文件为主文件,或正在运行这个文件,即执行下边的代码
    unittest.main()#测试模块下边有这个main函数就会帮助我们执行测试了

测试结果:为ok即可以了。
实例2:
测试一个类是否正确

class coder:
    def __init__(self,name):
        self.name=name
        self.skills=[]
    #写个函数,将掌握的技能加进去列表中
    def  master_skills(self,skill):
        self.skills.append(skill)
    #写个函数,展示技能
    def  show_skills(self):
        print('掌握技能')
        for  i  in   self.skills:
            print('-',i)
c=coder('tom')
c.master_skills('c#')
c.master_skills('py')
c.show_skills()

测试案例单独写个文件其中代码为:

import  unittest#导入测试包
from 异常 import  coder#导入要测试的函数
#在测试模块中,Python已经为我们提供了一个基类TestCase即unittest.TestCase

class codertest(unittest.TestCase):#并继承一下测试基类
    #定义一个测试方法,一般这个方法都以test_开头,因为有语法要求。

    # 测试一下某一个技能是否在它的列表中
    def test_skill_in(self):
        c = coder('tom')
        c.master_skills('c#')
        c.master_skills('python')
        self.assertIn('python',c.skills)#判断一下python是否在它的技能列表中。
        #也可以测试其他属性的东西,这里只是个例子,当然所要用的断言函数可能就不一样了

        #因为继承了unittest.TestCase,所以可以用他的方法测试

if __name__=='__main__':#当前文件为主文件,或正在运行这个文件,即执行下边的代码
    unittest.main()#测试模块下边有这个main函数就会帮助我们执行测试了

测试结果为ok,说明想要测试的东西通过了。

简便方法:setUp初始化函数

import  unittest#导入测试包
from 异常 import  coder


class codertest(unittest.TestCase):

    # 在测试类时,经常需要实例化操作,如实例化好多具体对象麻烦,而测试模块中有一个函数,setup即初始化函数
    def  setUp(self):
        self.c = coder('tom')  # 将实例化放在初始这
        self.c.skills = ['python','c#']  # 将掌握的技能提前准备好

        # 测试一下某一个技能Python是否在它的列表中,此时可以直接测试了,如某一个技能是否在技能列表中。

    def test_skill_in(self):
        self.assertIn('python', self.c.skills)


if __name__=='__main__':#当前文件为主文件,或正在运行这个文件,即执行下边的代码
    unittest.main()#测试模块下边有这个main函数就会帮助我们执行测试了

测试结果为ok,说明想要测试的东西通过了。

三、小数格式化与取整、四舍五入

注:数值格式化,实际开发中将特定字符融入到字符串中,格式化表现又有哪些细节需要处理及表现的地方

#声明3个数
a=520
b=1234567890.123456
c=-1234567.654321
#数字在字符串中的呈现
#1
'数值:{}'.format(a)#占位符,传a去呈现
print('数值:{}'.format(a))
#在python3可以简化为:
f'数值:{a}'#此处f并不是浮点型,而是format格式化的意思。
print(f'数值:{a}')
#以上两种呈现方式一样。



#2若明确想在占位符位置出现一个浮点型,可以这样写
print('数值:{:f}'.format(a))#冒号前边为实际值a,冒号后边可以加上f,表示以浮点型显示
#测试结果:数值:520.000000
#也可以这样写:
print(f'数值:{a:f}')#将对象a以f浮点型格式显示,数值:520.000000



#3显示正负数
print(f'数值:{a:-f}')#因为a就是正数,所以加-不起作用。为520.000000
print(f'数值:{c:-f}')#c为负数,所以可以将-显示,数值:-1234567.654321
print(f'数值:{a:+f}')#这个显示正数,如+520.000000



#4将b显示浮点型
print(f'数值:{b:f}')#数值:1234567890.123456
#若想以千分位隔显示,即每三个数用一个逗号隔开
print(f'数值:{b:,f}')#在占位符加个,结果:数值:1,234,567,890.123456
#指定精度,小数后保留两位
print(f'数值:{b:,.2f}')#结果数值:1,234,567,890.12,切记注意:占位符中的格式说明符,如逗号,精度,f之间不要有空格
print(f'数值:{b:,.4f}')#数值:1,234,567,890.1235,发现后面小数位保留用到了四舍五入。




#5给一个x与y
x=18
y=23
print('{:.2f}'.format(x/y))#结果为0.78
#若以百分比显示,且保留两位小数
print('{:.2%}'.format(x/y))#78.26%



#6关于小数位的处理
import math
math.trunc(b)#不管小数位为几,纯粹去掉小数位,为:1234567890
print(math.trunc(b))



#7总是向下取整总是会往下取整,即floor
math.floor(b)
print(math.floor(b))#1234567890
print(math.floor(1.25))#结果为1
print(math.floor(1.56))#结果为1

#8总是向上取整总是会往上取整,即ceil
print(math.ceil(123.01))#结果为124
print(math.ceil(123.5))#结果为124


#9有个内置的全局函数,有个四舍五入函数round
round(b,4)#将b保留4位小数
print(round(b,4))#1234567890.1235

四、random随机处理

总括:
在这里插入图片描述

#生成一个列表
lis=list (range(1,11))
print(lis)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#要想得到随机数值,可以导入标准模块,这里边有一些方法可以帮我们做一些操作。



import   random
#1从特定序列中找出一个随机值
random.choice(lis)
print(random.choice(lis))


 
#2 从特定序列找出特定数量的随机值
random.sample(lis,3)#从序列lis中找到3个随机值放在一个序列中,如这个返回一个列表
print(random.sample(lis,3))#如[7, 1, 2],这个方法可以打印,说明有返回值。



 #3将一个序列中的值改变,因为列表本身可以改变,所以我们可以将列表lis中的值打乱,如下:
random.shuffle(lis)#因为这个方法返回结果为空,所以直接打印为空
print(random.shuffle(lis))#因为这个方法返回结果为空,所以直接打印为空,即None
#因此必须看原列表是否顺序打乱,如下:
print(lis)#测试结果:[9, 5, 10, 8, 7, 6, 4, 3, 1, 2]
#random.shuffle()即类似可将扑克牌进行洗牌操作。




#4有时我只是想获得一个值,如获得一个随机的整型
random.randint(1,10)#在1-10之间随机取一个值,包括10




#5随机取一个浮点型,但是都是在小于1的浮点型,但是精度高
random.random()
print(random.random())#如0.19453408807237849



#5若想生成一个指定bit位数的随机数
random.getrandbits(5)
print(random.getrandbits(5))#5bit,即最大为31,最小为1

四、日期与时间

Python内置了日期时间包datetime模块

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: lenovo.py
@time: 2019/12/25
@desc: 
"""
#日期与时间包,datetime模块下边的两个对象一个date可获取年月日,t一个time获取时分秒
import datetime



#1在Python中所表示的最大年份9999,即datetime模块下有个常量MAXYEAR
datetime.MAXYEAR
print(datetime.MAXYEAR)



#2表示的最小年份为1
datetime.MINYEAR
print(datetime.MINYEAR)



#3表示获取今天的日期,模块datetime下边有个date日期类,其中有个方法为today()
today=datetime.date.today()
print(today)



#4表示出今天的日期后还可以获得单独属性
#获得年属性,year后边未加括号,所以是属性或字段
print(today.year)

#获得月属性,month后边未加括号,所以是属性或字段
print(today.month)

#获得日属性,day后边未加括号,所以是属性或字段
print(today.day)

#获得星期,不过这个属性从0-6开始
print(today.weekday())

#国际标准的星期从1-7
print(today.isoweekday())



#5若想自己构造一个日期,指定一下生日
birthday=datetime.date(2015,1,3)
print(birthday)
#自己构造的日期也可以分别获取各个属性字段如:
print(birthday.year)
print(birthday.month)
print(birthday.day)


#6只需要时分秒即时间
t=datetime.time(15,20,30)
print(t)
#同样也可以fb获取时,分,秒各个属性
print(t.hour)
print(t.minute)
print(t.second)




#7获取日期与时间都要。
#datetime模块下的datetime类有个方法now(),可以获取日期与时间了
now=datetime.datetime.now()
print(now)#2019-12-25 15:02:48.065047结果中最后为微妙
#也可以分别获取各个字段
print(now.year)#获取年
print(now.day)#获取那一天
print(now.second)#获取秒
print(now.microsecond)#获取微妙



#8自己构造一个日期与时间都有的
t=datetime.datetime(1992,2,5,8,20,50)
print(t)
#同样我们也可以获取各个字段,方法同上




#9将字符串与日期时间的转换
s='2018-3-12'#定义一个字符串
#将字符串转换为真实日期时间进行计算,通过strftime()方法。
t=datetime.datetime.strptime(s,'%Y-%m-%d')#s为要转换的字符串,后边通过占位符明确指出年月日的结构
print(t)


#10反过来,将日期转换为字符串。
#例如将当前时间,转换为字符串并用/分隔
t=now.strftime('%Y/%m/%d')
print(t)

字符串日期转换时的格式转换

字符串型日期转换为正式的日期的方法以及占位符如下:
注:%w小写w为星期数占位符,不过是从星期0到星期六
注:%后边的大小写必须按规定,否则如%Y若不大写,小写就是两位的年份,而不是四位年份。
在这里插入图片描述

日期与时间的计算,即时间差处理。

主要用datetime模块下的一个对象类timedelta

#1 datetime.timedelta所以为以后的时间差处理带来了方便
#构造两个日期
t=datetime.datetime(2018,3,5,22,44)
d=datetime.datetime(2016,5,2,19,33,44)
b=t-d
print(type(b))#发现b类型就是<class 'datetime.timedelta'>
print(b)#结果为672 days, 3:10:16化成秒就是11416秒
#注:b中包含timedelta两个字段,为下边两个:
print(b.days)#672天,即t与d的仅考虑日期相差672天
print(b.seconds)#11416s,即t与d的仅考虑时分秒相差11416秒
print(b.total_seconds())#得到t与d相差的总共秒数,包括672天*24*3600+11416秒



#2在构造一个时间
o=datetime.datetime(2018,8,8,20,8)
#这个时间加上100天的时间
#print(o+100)#单独加上100不认识
#用过timedelta来构造
print(o+datetime.timedelta(days=100))#结果为:2018-11-16 20:08:00
#已知一个时间,往前推100天
res=o+datetime.timedelta(days=-100)#往前推100天,即减100天2018-04-30 20:08:00
print(res)
print(res.hour)#小时为20
#日期加3000秒
print(o+datetime.timedelta(seconds=3000))#2018-08-08 20:58:00



#3实际中可以一次性导入 datetime模块下的常见的类型这样就用起来方便了。
from datetime import  date,datetime,time,timedelta

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值