当前位置 : 主页 > 编程语言 > python >

315道面试题【1】

来源:互联网 收集:自由互联 发布时间:2022-06-18
1、为什么学习Python? 语言本身简洁,优美,功能超级强大 跨平台 非常火爆的社区 很多有名的大公司在用 2、通过什么途径学习的Python? 培训机构 + 自学 3、Python和Java、PHP、C、C#、C++等


1、为什么学习Python?

语言本身简洁,优美,功能超级强大

跨平台

非常火爆的社区

很多有名的大公司在用

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

培训机构 + 自学

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

C,它是现代编程语言的祖师爷,所以非常古老了,在现代应用中使用不多。但由于C是祖师爷,所以绝大部分语言,写法都和C语言差不多。。。常常用作学习其他语言的基础。。而C语言也有其他语言不可替代的用途,现在最主要的应用就是单片机。。。单片机是啥?就是用C语言控制一些简单的电子元件。。。比如电视用的遥控器,其实就是一个单片机。

PHP是用来做网站的,其实从技术角度,属于第一代的后端技术(植入式脚本技术),现在最新的后端技术,已经发展到第三代了(MVC架构),因此从技术上讲,PHP早该过时了,但由于市场需求的存在,所以它依然是做网站后台的主流之一。。就类似于WindowsXP一样,技术上太淘汰了,但市场却依然是主流,普及度依然很高。缺点一大堆,但又个最主要的优势,就是简单。。。MVC虽好,但学习难度远比PHP要高的多。

C++是面向对象的C语言,由于偏底层,所以性能非常高,仅次于C语言,主要用在一个要求高性能的领域。。。这个不好说,因为实际需求上,用处挺杂的,而且也确实不太好学。。因为它把C语言面向过程的那套东西,和JAVA面向对象的那些东西,堆砌到了一起。。也就同时把两种完全不同的思想揉在了一起。。个人的理解是,它就像周星驰电影里的那个“要你命3000”,把苍蝇拍,杀虫剂,手枪,手榴弹,灭鼠灵,用一根麻绳串在一起。。。杀虫可以,灭鼠可以,杀人也可以,堪称无所不能。。。但用起来,真是麻烦死了。。所以对于很多人来说,认可它的地位,承认它的功能,但敬而远之。

JAVA是今天真正意义上的大道正宗,名门正派。。。。丐帮有降龙十八掌,华山派有独孤九剑。。但你却很难说出,少林派有什么武功特别强。。而它又是公认的名门正宗。。。这其实就已经说明问题了,JAVA没有什么特别强的方面,但每个方面都不弱。。整体平均值,便非常高。。JAVA还有一个比较突出的优势,就是它是安卓系统的官方开发语言。。既然说到了少林,就不得不提一下武当。。。那就是微软的官方语言C#。。。.C#和JAVA相比,其实80%都是一样的。。几乎等于学一门,会两门,C#比JAVA稍微简单一些,IDE也好一些,其实比JAVA更适合新手,但由于之前不能跨平台,所以流行度比JAVA低,但确是游戏开发行业的第一大语言。。JAVA与C#基本可以看成一门语言的两种方言。。英式英语和美式英语的差别一样。。说到底还是半斤八两。。。一个是传统应用和安卓系统的第一大语言,一个是WINDOWS系统和游戏开发的第一大语言。。而且学一门会两门,你还要求啥?

Python也是个很有历史的语言,诞生时间和JAVA,C#差不多,但今天却依然非常时髦。。因为它的语法,简洁,优雅,风骚到了极致。。像写信一样写代码。。而又无所不能,JAVA和C#能做到的,Python几乎一样都不少。。。简单易学,尤其受到初学者喜爱。。但Python更像一把双刃剑,优点特别突出,缺点也特别明显,就是特别慢。。。一般认为,Python比JAVA慢25倍到50倍。。还有一门语言叫Ruby,和Python相似,也是语法特别简洁。。但比Python更慢,用途也不如Python。。。基本可以看作华山,丐帮,在某些情况下,可以胜过少林武当。。但整体上比较,还是要差一截。。但即便如此,它的前景也是非常好的。。由于语法简单,更容易被机器解析,所以在人工智能领域非常有前途。比如那个下围棋的Alpha Go,以及中国的北斗卫星定位系统。。都有大量的Python代码在里面。

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

编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。

解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!python是一门解释型语言

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

Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的种Python解释器:

CPython:

当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。

IPython:

IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的

PyPy:

PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。

6、位和字节的关系?

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

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

1 B = 8b (8个bit/ 位) 一个字节(byte)等于8位(bit)

1 kB = 1024 B (kB - kilobajt)

1 MB = 1024 kB (MB - megabajt)

1 GB = 1024 MB (GB - gigabajt)

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

1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。

2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。

3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。

4 不要在一句import中多个库,比如import os, sys不推荐

5 避免不必要的空格。

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

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

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

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

>>> bin(18)
'0b10010'

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

>>> int('011',8)
9

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

>>> oct(30)
'0o36'

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

>>> int('0x12',16)
18

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

>>> hex(87)
'0x57'

10、请编写一个函数实现将IP地址转换成一个整数。

如 10.3.9.12 换规则为:

10 00001010

3 00000011

9 00001001

12 00001100

再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?

def ip(value):
res = value.split('.')
s=''
for i in res:
i = (bin(int(i)).strip('0b'))
if len(i) != 8:
i = i.zfill(8)
s+=i
return int(s,2)

11、python递归的最大层数?

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

12、求结果:

v1 = 1or3

1

v2 = 1and3

3

v3 = 0and2and1

0

v4 = 0and2or1

1

v5 = 0and2or1or4

1

v6 = 0orFlase and1

False

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

ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。

在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。

Unicode能够表示全世界所有的字节

GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

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

通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器译后才能成为机器码。

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

三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值

格式:

[on_true] if [expression] else [on_false]
res = 值1 if 条件 else 值2

16、python2与python3的区别

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个方法?

字符串:

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

列表:

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

元祖:

#元组也是一个list,他和list的区别是元组的元素无法修改
tuple1 = (2,3,4,5,6,4,7)
print(type(tuple1))
print(tuple1[:7])
print(tuple1[:5:-1])

字典:

dict = {‘ob1‘:‘computer‘, ‘ob2‘:‘mouse‘, ‘ob3‘:‘printer‘}
#每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。键是唯一的,字典只认最后一个赋的键值。

D.get(key, 0) #同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常
D.has_key(key) #有该键返回TRUE,否则FALSE
D.keys() #返回字典键的列表
D.values()
D.items()

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

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

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

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

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

24、pass的作用?

  • 空语句
  • 保证格式完整
  • 占位语句

25、*arg和**kwarg作用

  • 函数调用里的*arg和**kwarg:
  • *arg:元组或列表“出现”
  • **kwarg:字典“出没”
  • 分割参数
  • 函数定义时传的*arg /**kwarg:
  • 接收参数
  • 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、求结果:

    v = dict.fromkeys([ 'k1', 'k2'],[])
    v[‘k1’]. append( 666)
    print(v)
    v[‘k1’] = 777
    print(v)

    结果为:

    <<<{'k1': [666], 'k2': [666]}

    31、求结果

    def num():
    return [lambda x:i*x for i in range(4)]

    print([ m(2) for m in num()])

    结果为:

    [6, 6, 6, 6]

    32、列举常见的内置函数?

    33、filter、map、reduce的作用?

    map() 会根据提供的函数对指定序列做映射。

    第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表

    In [11]: for i in map(lambda x:x*x,[1,2,3,4]):
    ...: print(i)
    ...:
    1
    4
    9
    16

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

    In [12]: def is_odd(n):
    ...: return n % 2 == 1

    In [15]: for i in filter(is_odd,[1,2,3]):
    ...: print(i)
    ...:
    1
    3

    reduce() 函数会对参数序列中元素进行累积。

    函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数

    In [19]: from functools import reduce

    In [20]: def add(x,y):
    ...: return x+y
    ...: reduce(add,range(1,101))
    ...:
    Out[20]: 5050

    34、一行代码实现9*9乘法表

    print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))

    35、如何安装第三方模块?以及用过哪些第三方模块?

    在Python中,安装第三方模块,是通过setuptools这个工具完成的。Python有两个封装了setuptools的包管理工具:easy_install和pip。目前官方推荐使用pip

    如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了。

    如果你正在使用Windows,确保安装时勾选了pip和Add python.exe to Path。

    在命令提示符窗口下尝试运行pip,如果Windows提示未找到命令,可以重新运行安装程序添加pip。

    现在,让我们来安装一个第三方库——bs4

    ​​pip install bs4​​

    用过的第三方模块 bs4/pymysql/redis/lxml/tkinter/urllib/requests等

    36、至少列举8个常用模块都有那些?

    Django Flask Scrapy Tkinter Pygame numpy pillow-python pymysql pip

    37、re的match和search区别?

    match只找字符串的开始位置,而search是全盘查找

    38、什么是正则的贪婪匹配?

    1、贪婪匹配

    总是尝试匹配尽可能多的字符

    2、非贪婪匹配

    是尝试匹配尽可能少的字符

    39、求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )

    In [32]: a = [i % 2 for i in range(10)]
    In [33]: a
    Out[33]: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]In [34]: b = (i%2 for i in range(10))

    In [35]: b
    Out[35]: <generator object <genexpr> at 0x000000000552E938>

    40、求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2

    In [48]: 0 or False
    Out[48]: False

    In [49]: 1 or 2
    Out[49]: 1

    In [50]: 1 and 2
    Out[50]: 2

    In [51]: 1 < (2==2)
    Out[51]: False

    In [52]: 1<2==2
    Out[52]: True

    41、def func(a,b=[ ]) 这种写法有什么坑?

    In [55]: def func(a,b=[]):
    ...: b.append(a)
    ...: print(b)
    ...: func(1)
    ...: func(1)
    ...: func(1)
    ...: func(1)
    ...:
    [1]
    [1, 1]
    [1, 1, 1]
    [1, 1, 1, 1]

    函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,第二次执行还是用第一次执行的时候实例化的地址存储,所以三次执行的结果就是 [1, 1, 1] ,想每次执行只输出[1] ,默认参数应该设置为None。

    42、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?

    In [56]: a = '1,2,3'

    In [57]: list(a)
    Out[57]: ['1', ',', '2', ',', '3']

    43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?

    In [65]: a = ['1','2','3']

    In [66]: [ int(i) for i in a]
    Out[66]: [1, 2, 3]

    44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

    a = [1,2,3] 和 b = [(1),(2),(3) ] 都是列表 b = [(1,),(2,),(3,) ] 是列表里面套元组

    45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

    In [74]: [ i*i for i in range(1,11)]
    Out[74]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    46、一行代码实现删除列表中重复的值 ?

    In [75]: a = [1,2,3,4,5,1,2,3,4,5]

    In [76]: set(a)
    Out[76]: {1, 2, 3, 4, 5}

    47、如何在函数中设置一个全局变量 ?

    In [78]: def a():
    ...: global aaa
    ...: aaa = 123

    In [80]: a()
    In [81]: aaa
    Out[81]: 123

    48、logging模块的作用?以及应用场景?

    可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

    print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

    49、请用代码简答实现stack 。

    class Stack(object):
    def __init__(self):
    self.stack = []

    def push(self, value): # 进栈
    self.stack.append(value)

    def pop(self): #出栈
    if self.stack:
    self.stack.pop()
    else:
    raise LookupError(‘stack is empty!)

    def is_empty(self): # 如果栈为空
    return bool(self.stack)

    def top(self):
    #取出目前stack中最新的元素
    return self.stack[-1]

    50、常用字符串格式化哪几种?

    第一种:

    In [88]: "hello %s"%('word')
    Out[88]: 'hello word'

    第二种:

    In [89]: 'hellow {}'.format('word')
    Out[89]: 'hellow word'

    51、简述 生成器、迭代器、可迭代对象 以及应用场景?

    52、用Python实现一个二分查找的函数。

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]

    def binary_search(dataset,find_num):
    if len(dataset) > 1:
    mid = int(len(dataset) / 2)
    if dataset[mid] == find_num: # find it
    print("找到数字", dataset[mid])
    elif dataset[mid] > find_num: # 找的数在mid左面
    print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
    return binary_search(dataset[0:mid], find_num)
    else: # 找的数在mid右面
    print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
    return binary_search(dataset[mid + 1:], find_num)
    else:
    if dataset[0] == find_num: # find it
    print("找到数字啦", dataset[0])
    else:
    print("没的分了,要找的数字[%s]不在列表里" % find_num)

    binary_search(data,20)

    53、谈谈你对闭包的理解?

    在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

    一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

    def outer(a):
    b = 10
    def inner():
    print(a+b)
    return inner

    54、os和sys模块的作用?

    sys模块主要是用于提供对python解释器相关的操作

    OS模块是Python标准库中的一个用于访问操作系统功能的模块,使用OS模块中提供的接口,可以实现跨平台访问

    55、如何生成一个随机数?

    random模块

    如:​​random.random()​​

    56、如何使用python删除一个文件?

    ​​os.remove(path)​​

    57、谈谈你对面向对象的理解?

    面向对象就是将一些零散的具有相同功能的属性方法通过类封装起来,实现模块化

    58、Python面向对象中的继承有什么特点?

  • 在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
  • 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
  • Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
    ​​​​

  • 59、面向对象深度优先和广度优先是什么?

    pass

    60、面向对象中super的作用?

    • super不是一个关键字,也是不是有函数,他是一个类
    • super()的作用不是查找父类,而是找MRO列表的上一个类
    • super()和父类没有任何实质性的关系,只是有时候能调用到父类而已。
    • 在单继承的情况下,super()永远调用的是父类/父对象
    • super()多用于菱形继承
      格式:
      ​​super().方法() #python3的格式​​

    61、是否使用过functools中的函数?其作用是什么?

    functools用于高阶函数:指那些作用于函数或者返回其他函数的函数。通常情况下,只要是可以被当做函数调用的对象就是这个模块的目标。

    62、列举面向对象中带双下划线的特殊方法,如:​new​、​init​

    ​​__init__​​初始化魔术对象,当一个对象被实例化是自动触发

    ​​__new__​​ 当一个对象被实例化前自动触发,通过传递参数判断对象是否被创建或其他

    ​​__del__​​当一个对象没有任何引用是被触发,回收内存

    ​​__call__​​将对象当作函数调用时触发

    63、如何判断是函数还是方法?

    函数:

    函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用。

    方法:

    方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。

    64、静态方法和类方法区别?

    实例方法,类方法,静态方法都可以通过实例或者类调用,只不过实例方法通过类调用时需要传递实例的引用(python 3可以传递任意对象,其他版本会报错)。

    三种方法从不同层次上来对方法进行了描述:实例方法针对的是实例,类方法针对的是类,他们都可以继承和重新定义,而静态方法则不能继承,可以认为是全局函数。

    65、列举面向对象中的特殊成员以及应用场景

    魔术方法 用于在某一时刻调用时

    66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数

    for x in range(1,5):
    for z in range(1,5):
    if i!=x and i!=z and x!=z:
    print(i,x,z)

    67、什么是反射?以及应用场景?

    本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

    68、metaclass作用?以及应用场景?

    元类就是创建类这种对象的东西

    69、用尽量多的方法实现单例模式。

    class Earth(object):
    __instance=None #定义一个类属性做判断

    def __new__(cls):

    if cls.__instance==None:
    #如果__instance为空证明是第一次创建实例
    #通过父类的__new__(cls)创建实例
    cls.__instance==object.__new__(cls)
    return cls.__instance
    else:
    #返回上一个对象的引用
    return cls.__instance

    a = Earth()
    print(id(a))
    b = Earth()

    70、装饰器的写法以及应用场景。

    装饰器是一个工厂函数,接受一个函数作为参数,然后返回一个新函数,其闭包中包含被装饰的函数。有了装饰器,可以提取大量函数中与本身功能无关的类似代码 ( 这块在Flask中用于定义路由的@app.route,就是一个很好的例子),达到代码重用的目的。可应用于插入日志、性能测试、事务处理等方面。

    def deco(func):
    def warpper(*args, **kwargs):
    print(‘start‘)
    func(*args, **kwargs)
    print(‘end‘)
    return warpper

    @deco
    def myfunc(parameter):
    print("run with %s" % parameter)

    myfunc("something")

    71、异常处理写法以及如何主动跑出异常(应用场景)

    try:
    pirnt('123')
    except:
    print('456')

    通过​​raise 异常对象​​主动抛出异常

    72、什么是面向对象的mro

    Method Realtion Order 用来制作一个继承关系的列表

    MRO列表的制作原则:

    1.子类永远在父类的前面

    2.如果继承了多个父类,那么按照()中的顺序在列表中摆放

    3.如果多个类同时继承了一个父类,孙子类中只会选取第一个父类中的父类的该方法

    73、isinstance作用以及应用场景?

    检测一个数据是否由指定的类型创建

    74、写代码并实现:

    给定一个由编码器组成的数组,返回两个数字的索引,使它们加起来成为一个特定的目标。你可以假设每一个输入都会

    只有一个解决方案,您可能不会使用相同的元素两次。

    例子:

    给定nums =[2,7,11,15],目标= 9,

    因为nums[0] + nums[1] = 2+ 7= 9,

    返回[0,1]

    In [102]: def nums(lists,n):^M
    ...: if isinstance(lists,list):^M
    ...: for i in range(len(lists)):^M
    ...: for v in lists:^M
    ...: if lists[i]+v == n:^M
    ...: print(i,lists.index(v))^M
    ...: break
    ...: nums([1,2,3,4,5],9)
    ...:
    3 4
    4 3

    75、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?

    可以处理数组、对象

    定制datetime类型

    In [107]: import json

    In [108]: class ComplexEncoder(json.JSONEncoder):
    ...: def default(self, obj):
    ...: if isinstance(obj, datetime):
    ...: return obj.strftime('%Y-%m-%d %H:%M:%S')
    ...: elif isinstance(obj, date):
    ...: return obj.strftime('%Y-%m-%d')
    ...: else:
    ...: return json.JSONEncoder.default(self, obj)
    ...:

    In [109]: json.dumps({'now':datetime.now()},cls=ComplexEncoder)
    Out[109]: '{"now": "2018-07-10 18:12:31"}'

    76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?

    ​​json.dumps(jsonData,ensure_ascii=False);​​

    77、什么是断言?应用场景?

    在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助

    python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

    78、有用过with statement吗?它的好处是什么?

    with语句的作用是通过某种方式简化异常处理

    自动管理文件关闭

    79、使用代码实现查看列举目录下的所有文件。

    import os

    In [119]: for i in os.listdir():
    ...: print(i)
    ...:

    80、简述 yield和yield from关键字。

    yield 的作用就是把一个函数变成一个生成器, 带有yield的函数不再是一个普通的函数。python解释器会将其视为一个generator



    上一篇:scrapy之发送POST请求
    下一篇:没有了
    网友评论