文章目录
一、异常
异常分类
1语法错误:在静态语言中,如C#,Java中有编译过程,通过编译可以检查出语法错误,编译通过后就可以运行了。而在Python语言是解释性语言,即写完代码,解释器一解释,即程序就运行了,所以Python只有在运行时候才可发现语法错误。
2 语义错误 例如/0
3逻辑错误,与代码无关,即结果不是想要的,只与代码设计有关。
Python中:SyntaxError为语法错误,ZeroDivisionError为除0错误。
异常语法格式
try:
将有可能出错的代码放在这,即try中
except:这种是可以捕获任何异常
print('遇到异常就执行')
try:
将有可能出错的代码放在这,即try中
except 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