python面试315题(1--->30题)

2018-07-16 02:49:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

1、为什么学习Python?

  1.  
    语言本身简洁,优美,功能超级强大
  2.  
    跨平台
  3.  
    非常火爆的社区
  4.  
    很多有名的大公司在用

2、通过什么途径学习的Python?

培训机构 + 自学

3、Python和Java、PHP、C、C#、C++等其他语言的对比?

  1.  
    C,它是现代编程语言的祖师爷,所以非常古老了,在现代应用中使用不多。但由于C是祖师爷,所以绝大部分语言,写法都和C语言差不多。。。常常用作学习其他语言的基础。。而C语言也有其他语言不可替代的用途,现在最主要的应用就是单片机。。。单片机是啥?就是用C语言控制一些简单的电子元件。。。比如电视用的遥控器,其实就是一个单片机。
  2.  
     
  1.  
    PHP是用来做网站的,其实从技术角度,属于第一代的后端技术(植入式脚本技术),现在最新的后端技术,已经发展到第三代了(MVC架构),因此从技术上讲,PHP早该过时了,但由于市场需求的存在,所以它依然是做网站后台的主流之一。。就类似于WindowsXP一样,技术上太淘汰了,但市场却依然是主流,普及度依然很高。缺点一大堆,但又个最主要的优势,就是简单。。。MVC虽好,但学习难度远比PHP要高的多。
  2.  
     
  1.  
    C++是面向对象的C语言,由于偏底层,所以性能非常高,仅次于C语言,主要用在一个要求高性能的领域。。。这个不好说,因为实际需求上,用处挺杂的,而且也确实不太好学。。因为它把C语言面向过程的那套东西,和JAVA面向对象的那些东西,堆砌到了一起。。也就同时把两种完全不同的思想揉在了一起。。个人的理解是,它就像周星驰电影里的那个“要你命3000”,把苍蝇拍,杀虫剂,手枪,手榴弹,灭鼠灵,用一根麻绳串在一起。。。杀虫可以,灭鼠可以,杀人也可以,堪称无所不能。。。但用起来,真是麻烦死了。。所以对于很多人来说,认可它的地位,承认它的功能,但敬而远之。
  2.  
     
  1.  
    JAVA是今天真正意义上的大道正宗,名门正派。。。。丐帮有降龙十八掌,华山派有独孤九剑。。但你却很难说出,少林派有什么武功特别强。。而它又是公认的名门正宗。。。这其实就已经说明问题了,JAVA没有什么特别强的方面,但每个方面都不弱。。整体平均值,便非常高。。JAVA还有一个比较突出的优势,就是它是安卓系统的官方开发语言。。既然说到了少林,就不得不提一下武当。。。那就是微软的官方语言C#。。。.C#和JAVA相比,其实80%都是一样的。。几乎等于学一门,会两门,C#比JAVA稍微简单一些,IDE也好一些,其实比JAVA更适合新手,但由于之前不能跨平台,所以流行度比JAVA低,但确是游戏开发行业的第一大语言。。JAVA与C#基本可以看成一门语言的两种方言。。英式英语和美式英语的差别一样。。说到底还是半斤八两。。。一个是传统应用和安卓系统的第一大语言,一个是WINDOWS系统和游戏开发的第一大语言。。而且学一门会两门,你还要求啥?
  2.  
     
Python也是个很有历史的语言,诞生时间和JAVA,C#差不多,但今天却依然非常时髦。。因为它的语法,简洁,优雅,风骚到了极致。。像写信一样写代码。。而又无所不能,JAVA和C#能做到的,Python几乎一样都不少。。。简单易学,尤其受到初学者喜爱。。但Python更像一把双刃剑,优点特别突出,缺点也特别明显,就是特别慢。。。一般认为,Python比JAVA慢25倍到50倍。。还有一门语言叫Ruby,和Python相似,也是语法特别简洁。。但比Python更慢,用途也不如Python。。。基本可以看作华山,丐帮,在某些情况下,可以胜过少林武当。。但整体上比较,还是要差一截。。但即便如此,它的前景也是非常好的。。由于语法简单,更容易被机器解析,所以在人工智能领域非常有前途。比如那个下围棋的Alpha Go,以及中国的北斗卫星定位系统。。都有大量的Python代码在里面。

4、简述解释型和编译型编程语言?

  1.  
    编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
  2.  
     
  3.  
    解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!python是一门解释型语言

5、Python解释器种类以及特点?

  1.  
    Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的种Python解释器:
  2.  
    CPython:
  3.  
    当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
  4.  
    IPython:
  5.  
    IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的
  6.  
    PyPy:
  7.  
    PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。

6、位和字节的关系?

位(bit),数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位,是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。

7、b、B、KB、MB、GB 的关系?

  1.  
    1 B = 8b (8个bit/ 位) 一个字节(byte)等于8位(bit)
  2.  
    1 kB = 1024 B (kB - kilobajt)
  3.  
    1 MB = 1024 kB (MB - megabajt)
  4.  
    1 GB = 1024 MB (GB - gigabajt)

 

8、请至少列举5个 PEP8 规范(越多越好)。

  1.  
    1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
  2.  
    2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
  3.  
    3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
  4.  
    4 不要在一句import中多个库,比如import os, sys不推荐。
  5.  
    5 避免不必要的空格。

 

9、通过代码实现如下转换:

 

 

· 二进制转换成十进制:v = “0b1111011”

  1.  
    >>> int('0b1111011',2)
  2.  
    123

· 十进制转换成二进制:v = 18

  1.  
    >>> bin(18)
  2.  
    '0b10010'

· 八进制转换成十进制:v = “011”

  1.  
    >>> int('011',8)
  2.  
    9

· 十进制转换成八进制:v = 30

  1.  
    >>> oct(30)
  2.  
    '0o36'

· 十六进制转换成十进制:v = “0x12”

  1.  
    >>> int('0x12',16)
  2.  
    18

· 十进制转换成十六进制:v = 87

  1.  
    >>> hex(87)
  2.  
    '0x57'
10、请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
  1.  
    def ip(value):
  2.  
    res = value.split('.')
  3.  
    s=''
  4.  
    for i in res:
  5.  
    i = (bin(int(i)).strip('0b'))
  6.  
    if len(i) != 8:
  7.  
    i = i.zfill(8)
  8.  
    s+=i
  9.  
    return int(s,2)

11、python递归的最大层数?

python默认递归最大的层数是998 不过这个值是可以通过sys.setrecursionlimit(1000)来设置

12、求结果:

 

 

 

v1 = 1or3

1

v2 = 1and3

3

v3 = 0and2and1

0

v4 = 0and2or1

0 and 2 or 1

v5 = 0and2or1or4

1
v6 = 0orFlase and1
False 

13、ascii、unicode、utf-8、gbk 区别?

  1.  
    ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。
  2.  
    在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。
  3.  
    Unicode能够表示全世界所有的字节
  4.  
    GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。
  5.  
    UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

14、字节码和机器码的区别?

  1.  
    通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。
  2.  
    字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

15、三元运算规则以及应用场景?

  1.  
    三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
  2.  
    格式:[on_true] if [expression] else [on_false]
  3.  
    res = 值1 if 条件 else 值2



16.

315道面试题【16】

python2与python3的区别

(1)Print

在 Python 2 中, print 被视为一个语句而不是一个函数,这是一个典型的容易弄混的地方,因为在 Python 中的许多操作都需要括号内的参数来执行。如果在 Python 2 中你想要你的控制台输出 ”hellow word”,你应该写下这样的 print 语句:

print "hellow word"
在使用 Python 3 时,print()会被显式地视为一个函数,因此要输出上面相同的字符串,你可以使用这种非常简单且易于使用的函数语法
print("hellow word")
这种改变使得 Python 的语法更加一致,并且在不同的 print 函数之间进行切换更加容易。就方便性而言,print()语法也与 Python 2.7 向后兼容,因此您的 Python 3 print()函数可以在任一版本中运行。

(2)整数的除法

在 Python 2 中,您键入的任何不带小数的数字,将被视为整数的编程类型。虽然乍看起来这似乎是一个简单的处理编程类型的方法,但有时候当你试图除以整数以期望获得一个带小数位的答案(称为浮点数),如:

5 / 2 = 2.5

然而,在 Python 2 中,整数是强类型的,并且不会变成带小数位的浮点数,即使这样做具有直观上的意义。

当除法/符号的任一侧的两个数字是整数时,Python 2进行底除法,使得对于商x,返回的数字是小于或等于x的最大整数。这意味着当你写下 5 / 2 来对这两个数字相除时,Python 2.7 将返回最大的小于或等于 2.5 的整数,在这种情形下:

  1.  
    a = 5 / 2
  2.  
    print a
  3.  
    #a=2

为解决这个问题,你可以在 5.0 / 2.0 中添加小数位,以得到预期的答案 2.5。

在 Python 3 中,整数除法变得更直观,如

  1.  
    a = 5 / 2
  2.  
    print(a)
  3.  
    #a=2.5
你也可以使用 5.0 / 2.0 返回 2.5,但是如果你想做底层划分,你应该使用 “//” 这样的 Python 3 语法,像这样:
  1.  
    b = 5 // 2
  2.  
    print(b)
  3.  
    #b=2

在 Python 3 中的这种修改使得整数除法更为直观,并且它的特点是不能向后兼容 Python 2.7。

(3)支持 Unicode

当编程语言处理字符串类型时,也就是一个字符序列,它们可以用几种不同的方式来做,以便计算机将数字转换为字母和其他符号。

Python 2 默认使用 ASCII 字母表,因此当您输入“Hello word!”时, Python 2 将以 ASCII 格式处理字符串。被限定为在多种扩展形式上的数百个字符,用ASCII 进行字符编码并不是一种非常灵活的方法,特别是使用非英语字符时。

要使用更通用和更强大的Unicode字符编码,这种编码支持超过128,000个跨越现今和历史的脚本和符号集的字符,你必须输入
u“Hello,word!” #前缀 u 代表 Unicode。
Python 3 默认使用 Unicode,这节省了程序员多余的开发时间,并且您可以轻松地在程序中直接键入和显示更多的字符。因为 Unicode 支持更强大的语言字符多样性以及 emoji 的显示,所以将它作为默认字符编码来使用,能确保全球的移动设备在您的开发项目中都能得到支持。

(4)后续发展

Python 3 和 Python 2 之间的最大区别不是语法上的,而是事实上 Python 2.7 将在 2020 年失去后续的支持,Python 3 将继续开发更多的功能和修复更多的错误。

最近的发展包括格式化的字符串,类创建的简单定制,和用一种更干净的句法方式来处理矩阵乘法。

Python 3 的后续开发意味着,开发人员可以对问题被及时解决抱有信心,并且随着时间的推移更多的功能将被添加进来,程序也会变得更加有效。

 
 

17、用一行代码实现数值交换:a = 1 b = 2

a,b = b,a

18、Python3和Python2中 int 和 long的区别?

int(符号整数):通常被称为是整数或整数,没有小数点的正或负整数

long(长整数):无限大小的整数,这样写整数和一个大写或小写的L。

 

19、xrange和range的区别?

1.range和xrange都是在循环中使用,输出结果一样。

2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。

3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。

注意:Python 3.x已经去掉xrange,全部用range代替。

 

20、文件操作时:xreadlines和readlines的区别?

二者使用时相同,但返回类型不同,xreadlines返回的是一个生成器,readlines返回的是list

 

21、列举布尔值为False的常见值?

0 , [ ] , " , ( ) , { } 

 

22、字符串、列表、元组、字典每个常用的5个方法?

字符串:

  1.  
    words = ‘today is a wonderfulday‘
  2.  
    print(words.strip(‘today‘))#如果strip方法指定一个值的话,那么会去掉这两个值
  3.  
    print(words.count(‘a‘))#统计字符串出现的次数
  4.  
    print(words.index(‘is‘))#找下标
  5.  
    print(words.index(‘z‘))#找下标如果元素不找不到的话,会报错
  6.  
    print(words.find(‘z‘))#找下标,如果元素找不到的话,返回-1

列表:

  1.  
    sample_list = [‘a‘,1,(‘a‘,‘b‘)] #创建列表
  2.  
    sample_list = [‘a‘,‘b‘,0,1,3] # Python 列表操作
  3.  
    value_start = sample_list[0] #得到列表中的某一个值
  4.  
    end_value = sample_list[-1] #得到列表中的某一个值
  5.  
    del sample_list[0] #删除列表的第一个值
  6.  
    sample_list[0:0] = [‘sample value‘] #在列表中插入一个值

元祖:

  1.  
    #元组也是一个list,他和list的区别是元组的元素无法修改
  2.  
    tuple1 = (2,3,4,5,6,4,7)
  3.  
    print(type(tuple1))
  4.  
    print(tuple1[:7])
  5.  
    print(tuple1[:5:-1])
字典
  1.  
    dict = {‘ob1‘:‘computer‘, ‘ob2‘:‘mouse‘, ‘ob3‘:‘printer‘}
  2.  
    #每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。键是唯一的,字典只认最后一个赋的键值。
  3.  
     
  4.  
    D.get(key, 0) #同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常
  5.  
    D.has_key(key) #有该键返回TRUE,否则FALSE
  6.  
    D.keys() #返回字典键的列表
  7.  
    D.values()
  8.  
    D.items()

23、lambda表达式格式以及应用场景?

lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。

lambda就是用来定义一个匿名函数的,如果还要给他绑定一个名字的话,就会显得有点画蛇添足,通常是直接使用lambda函数。如下所示:

  1.  
    # 需求:将列表中的元素按照绝对值大小进行升序排列
  2.  
    list1 = [3,5,-4,-1,0,-2,-6]
  3.  
    print(sorted(list1, key=lambda x: abs(x))) #[0, -1, -2, 3, -4, 5, -6]

24、pass的作用?

1、空语句 

2、保证格式完整

3、占位语句

 

25、*arg和**kwarg作用

所以从以上的示例可以看到*arg和**kwarg的作用为:

1、函数调用里的*arg和**kwarg:

(1)*arg:元组或列表“出现”
         **kwarg:字典“出没”

(2)分割参数

2、函数定义时传的*arg /**kwarg:

(1)接收参数

26、is和==的区别

==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等

is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。

 

27、简述Python的深浅拷贝以及应用场景?

字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层。所以对于只有一层的数据集合来说深浅拷贝的意义是一样的,比如字符串,数字,还有仅仅一层的字典、列表、元祖等.

应用场景:比如在CMDB系统中,我们定义了一个报警模版call给所有的服务器使用,此时有一批特殊应用的服务器需要不通的报警参数,我们既不想单独新建模版来一个一个添加报警参数,又不想修改默认模版而影响其他机器的报警阈值。此时我们就需要用深拷贝来完成。

 

28、Python垃圾回收机制?

Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。通过“分代回收”(generation collection)以空间换取时间来进一步提高垃圾回收的效率。

 

29、Python的可变类型和不可变类型?

可变:列表、字典

对于可变类型,无论创建多少个可变类型,只要值相同,都不指向同个内存地址(除非进行复制操作,那么他们将会指向同一个地址)。

不可变:数字、字符串、元祖  

对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。

 

30、求结果:

  1.  
    v = dict.fromkeys([ 'k1', 'k2'],[])
  2.  
    v[‘k1’]. append( 666)
  3.  
    print(v)
  4.  
    v[‘k1’] = 777
  5.  
    print(v)
  6.  
     
结果为:
<<<{'k1': [666], 'k2': [666]}
 
 
 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Docker与FastDFS的安装命令及使用

下一篇:装饰器路由具体实现梳理