目录
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)
运行结果:
单元测试
一般开发都要有测试人员。
单元测试作用:用来对一个函数,一个类或者一个模块来进行正确性校验工作
结果:
- 单元测试.通过,说明函数功能正常;
- 单元测试不通过,说明函数出现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()
运行结果: