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参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

 

posted @ 2018-02-14 18:44  A-a  阅读(178)  评论(0)    收藏  举报