python学习笔记(十九)python2与python3的区别、函数map、reduce、sorted,单元测试,

python3和python2区别

高阶函数map和reduce

高阶函数filter

高阶函数sorted

单元测试

对函数进行单元测试

对类进行单元测试


python3和python2区别

性能:python3起始比python2效率低,但python3有极大的优化空间,效率正在追赶

编码:python3源码使用utf-8编码,使得变量更加广阔

在python2中可以使用<>代表不等于,在python3中使用!=

python3中加入as和with关键字,还要True,False,None

python2中使用除号(/)会自动取整,而python3中使用除号(/)会取小数,必须使用 //

python2中有print语句,而python3中是print()函数

python3去除raw_input,加入了input()函数

新的super(),在python3中可以不给super()传参数

在python2中,即使比较类型不匹配也能执行,比如2<'4',会返回True。在python3中改变了顺序操作符的行为,例如x<y,而当x和y的类型不匹配时,会抛出TypeError而不是返回bool值

python2字符串以8bit字符串存储,在python3中以16bit Unicode字符串存储,并且字符串只有str一种类型

在python3中所有的异常都是从BaseException继承,并删除了StardardError

python2 :
try:
    ......
except Exception,e:
    ......

python3:
try:
    ......
except Exception as e:
    ......

在python2中有一个自带的类型file去处理文件,python3中没有file类

高阶函数map和reduce

最早提出在Google的mapreduce文章上

map()把数据分散出去进行解析,会生成一个列表

reduce()数据收集进行处理,会处理这个列表

python内置了map()和reduce()函数

例子:使用map()

#map()
#原型 map(fn,lsd)
#fn是函数   lsd是序列
#功能:将传入的函数依次作用在序列的每一个元素,并把结果作为新的Iterator返回

#将单个字符转成对应的字面量整数
def chr2int(chr):
    return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[chr]

list1 = ['2','1','6','5']
#map处理后的列表是惰性列表
res = map(chr2int,list1)
print(res)
#将惰性列表转换成列表
print(list(res))

运行结果:

例子:ruduce()的简单使用

from functools import reduce
#reduce(fn,lsd)
#fn是函数   lsd是序列
#功能:一个函数作用在序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素累计运算
#reduce(f,[a,b,c,d])
#f(f(f(a,b),c),d)

#求一个序列的和
list = [1,2,3,4,5,6]
#1 + 2
#1 + 2 + 3
#1 + 2 + 3 + 4
#1 + 2 + 3 + 4 + 5
#1 + 2 + 3 + 4 + 5 + 6
def sum(x,y):
    return x + y
all = reduce(sum,list)
print(all)

运行结果:

高阶函数filter

原型:filter(fn,lsd)

fn为函数,lsd为序列

功能:用于过滤序列,把传入的函数依次作用于序列的每个元素,根据返回的是True还是False,来决定是否保留该元素

例子:保留序列里的奇数

#保留序列的奇数
list1 = [1,2,3,4,5,6,7,8,9]
def isjishu(num):
    #偶数保留
    if num%2 != 0:
        return True
    #奇数剔除
    return False
l = filter(isjishu,list1)
print(list(l))

运行结果:

高阶函数sorted

排序:冒泡排序,选择排序 快速排序,插入排序,计数器排序

相对来说,冒泡排序,选择排序的效率低于快速排序,插入排序,计数器排序

sorted可以对序列进行排序,对字符串进行排序时,比较的是ASCLL码值

例子:

#排序
list1 = [4,8,6,-4,9,1,3,7,-8]
#sorted默认升序排序
list2 = sorted(list1)
print(list2)
#按列表绝对值排序,key可以接受函数来实现自定义排序规则
list3 = sorted(list1,key=abs)
print(list3)
#降序排序
list4 = sorted(list1,reverse=True)
print(list4)

运行结果:

单元测试

一般开发都要有测试人员。

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

结果:

  1. 单元测试.通过,说明函数功能正常;
  2. 单元测试不通过,说明函数出现bug,要么输入条件有误

对函数进行单元测试

例子:一个x+y的加法函数测试

第一次是成功的加法,第二次对加法函数进行了修改

import unittest
# from 对函数进行单元测试 import 函数
def sum(x,y):
    return x + y 

class Test(unittest.TestCase):
    def setUp(self):
        print('开始测试时自动调用')
    def tearDown(self):
        print('结束测试时自动调用')

    #为了测试sum
    def test_sum(self):
        self.assertEqual(sum(1,2),3,'加法有误')

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

运行结果:

修改加法函数:

def sum(x,y):
    return x + y + 1

运行结果:

对类进行单元测试

先定义一个Person类

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def getAge(self):
        return self.age

对这个类进行测试

import unittest
# from 对函数进行单元测试 import 函数
from Person import Person

class Test(unittest.TestCase):
    def setUp(self):
        print('开始测试时自动调用')
    def tearDown(self):
        print('结束测试时自动调用')
    #为了测试sum
    def test_init(self):
        per = Person('tom', 20)
        self.assertEqual(per.name,'tom','属性赋值有误')
    def test_getAge(self):
        per = Person('tom', 20)
        self.assertEqual(per.getAge(),per.age,'getAge函数有误')

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

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值