Python基础知识学习-第9天

18-异常处理及测试

1 异常处理
1.1 try…except
有时候我们写程序的时候,会出现一些错误或异常,导致程序终止。例如,做除法时,除数为0,会引起一个ZeroDivisionError。
例子:

a = 5
b = 0
c = a / b
print('done')

输出:

Traceback (most recent call last):
  File "A:/pycharm/python_workspace/demo/main.py", line 3, in <module>
    c = a / b
ZeroDivisionError: division by zero

我们发现程序因为ZeroDivisionError而中断了,语句print (‘done’) 没有运行。为了处理异常,我们使用try…except,更改代码:

a = 5
b = 0
try:
    c = a / b
    print(c)
except ZeroDivisionError as e:
    print(e)
print('done')
>>>division by zero
>>>done

这样程序就不会因为异常而中断,从而print (‘done’)语句正常执行。
我们把可能发生错误的语句放在try模块里,用except来处理异常。except可以处理一个专门的异常,也可以处理一组圆括号中的异常,如果except后没有指定异常,则默认处理所有的异常。每一个try,都必须至少有一个except

处理一组异常可以这样写(其中e代表异常的实例):

a = 5
b = 0
try:
    c = a / b
    print(c)
except (IOError ,ZeroDivisionError) as e:
    print(e)
print('done')
>>>division by zero
>>>done

try …except…else 语句,当没有异常发生时,else中的语句将会被执行。
例子:

a = 5
b = 0
try:
    c = b / a
    print(c)
except (IOError ,ZeroDivisionError) as e:
    print(e)
else:
    print('no error')
print('done')

输出:

0.0
no error
done

1.2 raise 引发一个异常

例子:如果输入的数据不是整数,则引发一个ValueError

input_value = int(input('请输入一个整数:'))
if type(input_value) != type(1):
    raise ValueError
else:
    print(input_value)

输出:

请输入一个整数:1.1
Traceback (most recent call last):
  File "A:/pycharm/python_workspace/demo/main.py", line 1, in <module>
    input_value = int(input('请输入一个整数:'))
ValueError: invalid literal for int() with base 10: '1.1'

1.3 try …finally
无论异常是否发生,在程序结束前,finally中的语句都会被执行:

a = 5
b = 0
try:
    c = a / b
    print(c)
finally:
    print('always excute')

输出:

Traceback (most recent call last):
always excute
  File "A:/pycharm/python_workspace/demo/main.py", line 4, in <module>
    c = a / b
ZeroDivisionError: division by zero

虽然有异常发生,但在程序终止前,finally中的语句也能正常执行。finally语句也可以和except语句一起使用:

a = 5
b = 0
try:
    c = a / b
    print(c)
except:
    print('error')
finally:
    print('always excute')
>>>error
>>>always excute

1.4 python所有的标准异常类:

2 测试
创建一个main.py文件,写入以下内容:

def get_formatted_name(first, last):
    full_name = '{} {}'.format(first, last)
    return full_name.title()

print(get_formatted_name('tom', 'lee'))
>>>Tom Lee

再创建一个test_name_function.py文件:

import unittest
from main import get_formatted_name

class NameTestCase(unittest.TestCase):
    def test_title_name(self):
        formatted_name = get_formatted_name('tom', 'lee')
        self.assertEqual(formatted_name, 'Tom Lee')

if __name__ == '__main__':
    unittest.main()

输出:

Testing started at 15:25 ...
A:\anaconda\anaconda\python.exe "A:\pycharm\PyCharm 2019.1.3\helpers\pycharm\_jb_pytest_runner.py" --path A:/pycharm/python_workspace/demo/test_name_function.py
Launching pytest with arguments A:/pycharm/python_workspace/demo/test_name_function.py in A:\pycharm\python_workspace\demo
============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: A:\pycharm\python_workspace\demo
plugins: arraydiff-0.3, doctestplus-0.3.0, openfiles-0.3.2, remotedata-0.3.1collected 1 item

test_name_function.py .                                                  [100%]

========================== 1 passed in 0.02 seconds ===========================

Process finished with exit code 0

如果故意出错:

import unittest
from main import get_formatted_name

class NameTestCase(unittest.TestCase):
    def test_title_name(self):
        formatted_name = get_formatted_name('tom', 'lee')
        self.assertEqual(formatted_name, 'Tom Leee')

if __name__ == '__main__':
    unittest.main()

输出:

Tom Leee != Tom Lee

Expected :Tom Lee
Actual   :Tom Leee

测试例子2:

class Coder():
    def __init__(self, name):
        self.name = name
        self.skills = []

    def mastering_skill(self, skill):
        self.skills.append(skill)

    def show_skill(self):
        print('掌握的技能:')
        for i in self.skills:
            print(i)

c = Coder('Tom')
c.mastering_skill('Python')
c.mastering_skill('C#')
c.show_skill()

输出:

掌握的技能:
Python
C#

19_3.常用的断言方法

实例:

import unittest

person = {'name':'mike', 'age':'20'}
numbers = [1, 2, 3, 4]
s = 'asdfghj'

class test_assert(unittest.TestCase):
    def test_assert_method(self):
        # self.assertEqual('mike', person.get('name'))
        # self.assertTrue('a' in s)
        # self.assertIn(1, numbers)
        # self.assertAlmostEqual(3.3, 1.1 + 2.2)
        # self.assertIs(True + 1, 2)
        # self.assertIsNone(person.get('Name', None))
        # self.assertIsInstance(numbers[0], int)
        self.assertGreater(7, numbers[1])

if __name__ == '__main__':
    unittest.main()

19_4.类与测试装置

实例。先编写一个计算器:

class Calculator():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

if __name__ == '__main__':
    c = Calculator(5, 3)
    print(c.add())

写一个测试文件:

import unittest
from demo1.calculator import Calculator

class CalculatorTest(unittest.TestCase):
    def test_add(self):
        c = Calculator(5, 3)
        self.assertEqual(8, c.add())

    def test_subtract(self):
        c = Calculator(8, 4)
        self.assertEqual(4, c.subtract())

if __name__ == '__main__':
    unittest.main()

但是这样需要多次实例化对象,很麻烦,可以如下改进:

import unittest
from demo1.calculator import Calculator

class CalculatorTest(unittest.TestCase):
    def setUp(self):
        self.c = Calculator(5, 3)

    def test_add(self):
        # c = Calculator(5, 3)
        self.assertEqual(8, self.c.add())

    def test_subtract(self):
        # c = Calculator(8, 4)
        self.assertEqual(2, self.c.subtract())

if __name__ == '__main__':
    unittest.main()

20_1.小数格式化、取证与四舍五入

格式化显示的两种方式:

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

输出:

数值a:111
数值a:111

如何以浮点型显示:

a = 111
# 以浮点型显示
# 大括号里面放一个冒号,冒号前写上要显示的变量名,后面写上f,表示float格式
print(f'数值a:{a:f}')
# 大括号里面放一个冒号,后面写上f,表示float格式
print('数值a:{:f}'.format(a))

输出:

数值a:111.000000
数值a:111.000000

带加号显示:

a = 111
# 以浮点型显示
# f前写上加号,表示正数以带加号显示
print(f'数值a:{a:+f}')
print('数值a:{:+f}'.format(a))

输出

数值a:+111.000000
数值a:+111.000000
a = 123456789.098765
# 以浮点型显示
# f前写上逗号,整数部位每隔三位以逗号相隔
print(f'数值a:{a:,f}')
print('数值a:{:,f}'.format(a))

输出:

数值a:123,456,789.098765
数值a:123,456,789.098765
a = 123456789.098765
# 以浮点型显示
# f前写上小数点加数字,表示保留几位小数(四舍五入)
print(f'数值a:{a:.2f}')
print('数值a:{:.3f}'.format(a))

输出:

数值a:123456789.10
数值a:123456789.099
a = 0.12345
# 以浮点型显示
# 百分号显示
print(f'数值a:{a:.2%}')
print('数值a:{:.3%}'.format(a))

输出:

数值a:12.35%
数值a:12.345%

20_2.random随机处理

import random
lst = list(range(1, 11))
print(lst)
# random.choice() 在给定序列中随机选择一个
print(random.choice(lst))

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
3
import random
lst = list(range(1, 11))
print(lst)
# random.sample(obj, num) 在给定序列中随机选择指定数量的值
print(random.sample(lst, 3))

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[5, 2, 10]
import random
lst = list(range(1, 11))
print(lst)
# random.shuffle(obj) 打乱指定序列的顺序
random.shuffle(lst)
print(lst)

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 5, 8, 2, 4, 1, 10, 3, 6, 9]
import random
# random.randint(num_1, num_2) 返回介于num_1和num_2只间的一个随机整数(包括num_1和num_2)
print(random.randint(1, 11))
>>>1
import random
# random.random() 返回介于0和1之间的随机浮点数
print(random.random())
>>>0.5517955986002777

20_3.日起与时间常用操作

import datetime
# 得到今天的年月日
today = datetime.date.today()
print('今天年月日是:{}'.format(today))
print('今天的年份是:{}'.format(today.year))
print('今天的月份是:{}'.format(today.month))
print('今天的日期是:{}'.format(today.day))
print('今天是星期:{}'.format(today.weekday()))
print('今天的年份是:{}'.format(today.year))

输出:

今天年月日是:2020-02-10
今天的年份是:2020
今天的月份是:2
今天的日期是:10
今天是星期:0
import datetime
birthday = datetime.date(1994, 1, 20)
print(birthday.year)
print(birthday.month)

输出:

1994
1
import datetime
t = datetime.time(12, 10, 20)
print('时间是:{}'.format(t.hour))
print('分钟是:{}'.format(t.minute))
print('秒数是:{}'.format(t.second))

输出:

时间是:12
分钟是:10
秒数是:20
# 得到现在的时间
import datetime
now = datetime.datetime.now()
print('现在的时间是:{}'.format(now))

字符串和日期时间的相互转换

# 字符串转化为日期时间
import datetime
s = '2020-2-10'
time = datetime.datetime.strptime(s, '%Y-%m-%d')
print('日期是:{}'.format(time))
>>>日期是:2020-02-10 00:00:00
# 日期时间转化为字符串
import datetime
# 得到现在的时间
now = datetime.datetime.now()
print('now的类型为:{}'.format(type(now)))
print('现在的时间是:{}'.format(now))
txt = now.strftime('%Y-%m-%d')
print('txt的类型是:{}'.format(type(txt)))
print('转化后为:{}'.format(txt))

输出:

now的类型为:<class 'datetime.datetime'>
现在的时间是:2020-02-10 14:46:59.042349
txt的类型是:<class 'str'>
转化后为:2020-02-10

20_4.timedelta时间跨度处理

import datetime
d = datetime.datetime(2020, 2, 10, 16, 4, 23)
birthdate = datetime.datetime(1994, 1, 20, 3, 30, 30)
print(d - birthdate)
>>>9517 days, 12:33:53
import datetime
d = datetime.datetime(2020, 2, 10, 16, 4, 23)
birthdate = datetime.datetime(1994, 1, 20, 3, 30, 30)
# 求出两个日期之间的时间跨度
diff = d - birthdate
print(diff.days)
print(diff.seconds)
print(diff.total_seconds())

输出:

9517
45233
822314033.0
import datetime
# 在已知日期上加上一段时间
d = datetime.datetime(2020, 2, 10, 16, 4, 23)
print(d + datetime.timedelta(days = 100))
>>>2020-05-20 16:04:23
发布了23 篇原创文章 · 获赞 0 · 访问量 412

猜你喜欢

转载自blog.csdn.net/Mr_Wang0120/article/details/104209790