python(二十二)——python2、3区别,函数map、reduce、sorted,单元测试,远程链接

Python3与Python2区别及相关高阶函数、测试
本文介绍了Python3和Python2在性能、编码、语法等方面的区别,如Python3源码用utf - 8编码,除号运算结果不同等。还讲解了高阶函数map、reduce、filter、sorted的功能及使用示例,阐述了单元测试对函数和类的应用,最后提到远程链接Windows。

目录

 

python3和python2区别

高阶函数map和reduce

高阶函数filter

高阶函数sorted

单元测试

对函数进行单元测试

对类进行单元测试

远程链接Windows


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()

运行结果:

 

远程链接Windows

import telnetlib

def telnetDoSomething(IP,user,passwd,command):
    #链接服务器
    telnet = telnetlib.Telnet(IP)
    #设置调试级别
    telnet.set_debuglevel(2)

    #读取用户信息
    rt = telnet.read_until('Login username:'.encode('utf-8'))
    #写入用户名,'\r\n'是回车
    telnet.write((user+'\r\n').encode('utf-8'))
    # 读取密码信息
    rt = telnet.read_until('Login password:'.encode('utf-8'))
    # 写入密码,'\r\n'是回车
    telnet.write((passwd + '\r\n').encode('utf-8'))
    # 读取验证IP信息
    rt = telnet.read_until('Domain name:'.encode('utf-8'))
    # 写入IP,'\r\n'是回车
    telnet.write((IP + '\r\n').encode('utf-8'))

    #登录成功,写指令
    rt = telnet.read_until('>'.encode('utf-8'))
    telnet.write((command + '\r\n').encode('utf-8'))
    #上面命令执行成功,会继续>
    #失败,一般不会是>
    rt = telnet.read_until('>'.encode('utf-8'))
    #断开链接
    telnet.close()
    return True

if __name__ == '__main__':
    IP = '10.0.142.197'
    user = 'xumingbin'
    passwd = '*********'
    command = 'tasklist'
    telnetDoSomething(IP,user,passwd,command)

 

 

 

一起学习,一起进步 -.- ,如有错误,可以发评论 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空城机

有钱捧个钱场,没钱捧个人场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值