2.14
1.python2 和Python3 有那些显著的区别http://www.runoob.com/python/python-2x-3x.html
1.print函数 2.Unicode Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。 现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。 由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的: >>> 中国 = 'china' >>>print(中国) china 3.除法运算 对于'/': python 2.x中:整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 python 3.x中:对于整数之间的相除,结果也会是浮点数。 对于'//': python 2.x和python 3.x中是一致的。 4.异常处理: 在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。 捕获异常的语法由 except exc, var 改为 except exc as var。 使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。 1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。 2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。 在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。 5.不等运算符 Python 2.x中不等于有两种写法 != 和 <> Python 3.x中去掉了<>, 只有!=一种写法 6.去掉了repr表达式`` Python 2.x 中反引号``相当于repr函数的作用 Python 3.x 中去掉了``这种写法,只允许使用repr函数 7.多个模块被改名 StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 Python 2.6已经支援新的io模组。 httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。 取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。 8.数据类型 1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long 2)新增了bytes类型,对应于2.X版本的八位串 3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。
2.简述 ascii、unicode、utf-8、gbk 的关系
ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符, Unicode是为了统一世界各国语言的不用,统一用2个bytes代表一个字符,可以表达2**16=65556个,称为万国语言,特点:速度快,但浪费空间, 可以用在内存处理中,兼容了utf-8,gbk,ASCII, utf-8 为了改变Unicode的这种缺点,规定1个英文字符用1个字节表示,1个中文字符用3个字节表示,特点;节省空间,速度慢,用在硬盘数据传输,网络数据传输,相比硬盘和网络速度,体现不出来的, gbk 是中文的字符编码,用2个字节代表一个字符,
3.请描述with的用法,如果自己的类需要支持with语句,应该如何书写http://blog.csdn.net/bitcarmanlee/article/details/52745676
# 紧跟with后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给as后面的变量。 # 当with后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__()方法。 #with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。 #with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__() 方法,执行完语句体之后会执行__exit__() 方法。
4.Python中如何判断一个对象是可调用对象?那些对象是可调用的?如何定义一个类,让其本身就是可调用对象
#Python中如何判断一个对象是可调用对象?那些对象是可调用的? #判断: # 1.使用内置的callable函数,用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定不可调用。 #2.判断对象类型是否是FunctionType # type(func) is FunctionType # # 或者 # isinstance(func, FunctionType) #3.判断对象是否实现 __call__ 方法 #所以通过类型去判断Python对象是否可调用,需要同时判断是函数(FunctionType)还是方法(MethodType),或者类是否实现__call__方法。 #函数是可调用的,一个对象实现了__call__方法是可以调用的 #如何定义一个类,让其本身就是可调用对象 #让其实现__call__方法那么该类实例化的对象就是可调用的
5.什么是装饰器?写一个装饰器打印输出方法执行的时间
#装饰器的本质就是一个闭包函数,在不改变原函数的调用方式和源代码的情况下,在这个函数前后加上扩展功能 import time def wrapepr(fun): def inner(*args,**kwargs): start=time.time() fun() end=time.time() print('执行时间%s'%(end-start)) return inner @wrapepr def aa(): time.sleep(1) print('aa.....') aa()
6.什么是进程,线程,协程?
进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。
线程:程序执行流的最小操作,每个进程有一个地址空间,而且默认就有一个控制线程,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
协程:是单线程下的并发,又称微线程,纤程协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的,
7.用python实现99乘法表,两种方法
# for i in range(1,10): # for j in range(1,i+1): # print('%s*%s=%s'%(i,j,i*j),end=' ') # print('\n') i=0 j=0 while i <9: i+=1 while j <9: j += 1 print(j, "x", i, "=", i * j, "\t", end="") if i==j: print("") j=0 break
8.在数组中找到具有最大和的连续子数组,至少包含一个数字
def function(lists): max_sum = lists[0] pre_sum = 0 for i in lists: if pre_sum < 0: pre_sum = i else: pre_sum += i if pre_sum > max_sum: max_sum = pre_sum return max_sum def main(): lists = [6, -3, 1, -2, 7, -15, 1, 2, 2] print(function(lists)) if __name__ == "__main__": main()
9.如何在Python中拷贝一个对象,并说说他们的区别http://www.cnblogs.com/ctztake/p/8194275.html
#赋值:只是创建一个变量,该变量指向原来内存地址 #浅拷贝:,在内存中只额外创建第一层数据 copy.copy() #深拷贝:在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化) copy.deepcopy()
10.如何判断一个变量是不是字符串
a='aaa' print(type(a)==str) print(isinstance(a,str))
11.list和tuple有什么不同
#1.list是可变数据类型,不能做字典的key,tuple是不可变数据类型,可以当做字典的key #2.list具有添加,删除,修改的方法,tuple没有 #3.定义tuple时如果只有一个元素,那么元素后面得加,(1,)
12.xrange和range有什么不同
#1. range函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。 #xrange用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。 #2.要生成很大的数字序列的时候,用xrange会比range性能优很多 #3.range会直接生成一个list对象,而xrange则不会直接生成一个list,而是每次调用返回其中的一个值
13.'123'如何变成['1','2','3'],['1','2','3']如何变成'123'
l=[] for i in '123': l.append(i) print(l) s=''.join(l) print(s)
14,[36,5,12,9,21]怎么排序?
l=[36,5,12,9,21] #方法一 print(sorted(l)) #方法二 l.sort() print(l)
15,is和== 的区别?
#==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等 #is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同
16,如何生成[1,4,9,16,25,36,49,64,81,100],尽量用一行实现
#方式一 print([i*i for i in range(1,11)]) #方式二 print(list(map(lambda x:x*x,range(1,11))))
17生成器是什么,有什么作用,请写一个生成器
#生成器本质还是迭代器,是一种一边循环一边计算的机制 # 生成器函数:只要函数中有yield关键字,那么这个函数就是生成器函数 #生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 #作用:1.节省内存空间,用多少拿多少 # 2.yield实现在单线程的情况下实现并发运算的效果 yield关键字还可以保存状态,yield语句一次返回一个结果,在每个结果中间, # 挂起函数的状态,以便下次重它离开的地方继续执行 def f(): a=1 yield a b=2 yield b fun=f() print(fun) print(next(fun)) print(next(fun)) #在写就报错了
18,map(str,[1,2,3,45,6,7])输出什么?
print(map(str,[1,2,3,45,6,7]))#<map object at 0x0000025A2639B278> print(list(map(str,[1,2,3,45,6,7])))#['1','2','3','45','6','7']
19

def log(fun): def inner(*args,**kwargs): print('call %s()'%fun.__name__) fun() return inner @log def now(): print('2018-2-14') now()
20.请简单解释python中的staticmethod(静态方法)和classmethod(类方法)
#普通方法 默认有一个self对象传进来,并且只能被对象调用——绑定到对象 #类方法 默认有一个cls传进来表示本类,并且可以被类和对象(不推荐)调用——绑定到类 #静态方法 没有默认参数,并且可以被类和对象(不推荐)调用——非绑定 # 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。 # 而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
浙公网安备 33010602011771号