python 面试题及答案解析

这里有2020年最新的Python最常见的180道面试题解析。

当你发现这些题你差不多都能回答上来,那说明你的水平已经可以去面试工作了。

网上有网友搜集了 180 道 2019 年最新的 Python 面试题解析,让你最短时间内掌握核心知识点,一举通过Python 面试!

1.列出 5 个常用 Python 标准库?

re:正则表达式

os:提供了一些操作系统的函数

sys:命令行参数

datetime:日期和时间

math:数学运算

2.Python 内建数据类型有哪些?

整数:int、浮点数:float 、布尔类型:bool  、元组:tuple 、列表:list  、字典:dict

3.简述 with 方法打开处理文件帮我们做了什么?

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open

写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close

(当然还有其他自定义功能,有兴趣可以研究with方法源码)

4.列出 Python 中可变数据类型和不可变数据类型,为什么?

不可变:数值,字符串,元组

不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

可变:列表,字典,集合

可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

5.Python 获取当前日期?

import datetime

datetime.datetime.now().strftime("%Y-%m-%d")

6.统计字符串每个单词出现的次数

说明单词具有唯一性,在python中的数据类型中,字典的key是唯一的,集合也是不可重复的,我们就可以用这2种方式处理

方式一:

str="djfksjdljfskdjks"
result={}
for i in str:
    result[i]=str.count(i)
print(result)

方式二:

from collections import Counter
str="djfksjdljfskdjks"
result =Counter(str)
print(result)

7.用 python 删除文件和用 linux 命令删除文件方法

python:

import os

path = "F:/test.txt"

if os.path.exists(path):

     os.remove(path)

else:

     print("该文件不存在")

删除目录:os.rmdir(path)

linux:

删除文件:rm -f filename

删除目录:rmdir dir

8.写一段自定义异常代码

class CalcError(Exception):
    pass
class MyError(CalcError):
    def __init__(self,numA,numB):
        #初始化用户输入的数据
        self.numA=numA
        self.numB=numB
    def __str__(self):
        #返回异常的描述
        return '只接受整数!'
def Cal(a,b):
    try:
        if type(a)!=int or type(b)!=int:
            raise MyError(a,b)
    except Exception as e:
        print(e)
    else:
        c=a+b
        return c
x = Cal(33.3,66)
print (x)

9.举例说明异常模块中 try except else finally 的相关意义

try:
    x= int(input("请输入一个整数:"))   ---执行代码
except ValueError:
    print("请输入一个正确的类型数据")--发生异常时执行的代码
    raise--抛出异常
else:
    print(x)--没有异常时执行的代码
finally:
    print("我一定会执行的~")--有没有异常都要执行的代码

10.遇到 bug 如何处理

淡定从容,客观分析

语言特性

1.谈谈对 Python 和其他语言的区别

python是解释型语言,一边解释一边执行,java是编译成。class文件再通过jvm解释执行,

语法简洁优美,比如变量,java中要声明才能使用,python可以直接使用,

Python属于解释型语言,当程序运行时,是一行一行的解释,并运行,所以调式代码很方便,开发效率高,
Python定位是任其自由发展、优雅、明确、简单,所以在每个领域都有建树,所有它有着非常强大的第三方库,
特点:
语法简洁优美,功能强大,标准库与第三方库都非常强大,而且应用领域也非常广
可移植性,可扩展性,可嵌入性
缺点:
  运行速度慢,

- 解释型
    - python/php
- 编译型
    - c/java/c#
        
- Python弱类型

 (1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)

(2)与php相比:python标准包直接提供了工具,并且相对于PHP代码更易于维护;

(3)Python与c相比:

Python 和 C Python这门语言是由C开发而来

  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
  对于速度:Python的运行速度相较与C,绝逼是慢了

但是运行速度慢

2.简述解释型和编译型编程语言

计算机是不能直接运行高级语言的,所以就需要转换为计算机能识别的机器码,有那种方式,

编译:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序编译型语言,执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran。

解释:解释型语言:可以直接运行,一边执行一边解释,解释型语言,执行速度慢、效率低;依赖解释器、跨平台性好。如Java、python.

3.Python 的解释器种类以及相关特点?

CPython:c语言开发的 使用最广的解释器

IPython:基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样

PyPy:目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率

JPython:运行在Java上的解释器 直接把python代码编译成Java字节码执行

IronPython:运行在微软 .NET 平台上的解释器,把python编译成. NET 的字节码

4.说说你知道的Python3 和 Python2 之间的区别?

1、性能方面

python3.x起始比python2.x效率低,但是python3.x有很大的优化空间,效率正在追赶

2、编码方面

python3.x原码文件默认使用utf-8,使得命名更加广泛。

python3.x

>>> 中国 = 'china'
>>> print(中国)
'china'
>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

python2.x

>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'

所以使用python2.x的时候需要在文件的头部添加

#-*-coding:utf-8-*-
str = "我爱北京天安门"
print(str)
>>> 我爱北京天安门

3、语法

3.1 print函数

print语句没有了,取而代之的是print()函数

python2.x中这两种打印是等价的

print "fish"
print ("fish")#注意print后面有个空格

python3.x中打印

print("fish")

3.2 除法运算

python中的除法比较其他语言显得非常的高端,有套复杂的规则,python中的除法
有//和/

首先来说/除法:与其他语言类似,在python2.x中它只计算整数部分,小数部分忽略掉
浮点数除法会得到浮点数的结果

python2.x中的“/”

>>> 1/2
0
>>> 1.0/2.0
0.5

python3.x中的“/”

>>> 1/2
0.5

3.3 异常处理

在python3.x中处理异常也轻微的改变了,在python3中我们使用as作为关键字

#3.x
try:
    ...
except exc as var:
    ....
    
#2.x
try:
    ...
except exc, var:
    ...

 

10.继承

class A:
     def __init__(self):
         print("A")
​
class B(A):
     pass
​
​
class C(A):
    def __init__(self):
        print("C")
​
class D(B,C):
    pass
​
d1 = D()

Python2 结果为 A,Python3 结果为 C。

python2 的继承顺序是 D -> B -> A -> C 深度优先 python3 的继承顺序是 D -> B -> C -> A 广度优先

5.Python3 和 Python2 中 int 和 long 区别?

Python3:Python3中int类型的范围是动态长度的,正整数或者负整数,不限大小,可以当long型用,用sys.getsizeof()可以看int占了几位.

Python2:Python2中long类型的范围是无限大小.

python2中有long类型
python3中没有long类型,只有int类型

6.xrange 和 range 的区别?

1.range和xrange都是在循环中使用,输出结果一样。
2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。
3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。

python2 有range和xrange,python3中只有range,且是个生成器

编码规范

7.什么是 PEP8?

PEP8是一个编程规范,内容是一些关于如何让你的程序更具可读性的建议

接下来你可以从中选择几条说说:

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

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

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

4 模块导入的顺序:按标准、三方和自己编写顺序依次导入,之间空一行。

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

6 避免不必要的空格

7 注释必须要有

8 函数命名要遵循规范

10 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。

11 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
12 异常中try的代码尽可能少。

8.了解 Python 之禅么?

python的交互界面输入import this,回车,会发现返回了一些代码规范,让python的使用者在编码时要谨记这些

翻译如下:

•优美胜于丑陋(Python 以编写优美的代码为目标)
•明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
•简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
•复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
•扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
•间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
•可读性很重要(优美的代码是可读的)
•即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
•不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
•当存在多种可能,不要尝试去猜测
•而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
•虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
•做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
•如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
•命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

9.了解 docstring 么?

什么是Python Docstring

和Java类似,Python也通过注释形式的Docstring给程序、类、函数等建立文档。通过Docstring建立的文档不仅对人来说有更好的可读性,也能够让IDE等工具自动识别使用函数、类、变量等的一些限制,从而帮助我们更好地理解程序。

Python Docstring 的三种风格

总的来说,Python Docstring有三种主要风格,分别是

reST风格:""

param a:

type a:

""

Google风格和Numpy风格:

10.了解类型注解么?

  • 参数注解示例:
def add(x:int,y:int=5)->int #:int 标识了参数应该出现的类型。为参数注解。->int 标注返回值为int类型
    """ 
        加法函数
    :param x: int类型
    :param y: int类型
    :return:  int类型
    """ #使用三引号可以为函数添加说明文档。
    return x+y
  • 类型注解示例(变量注解)
y:list = [1,2,3,4]  #这里的:list 为y变量的类型注解

11.例举你知道 Python 对象的命名规范,例如方法或者类等

原文:https://www.cnblogs.com/liuyanhang/p/11344038.html

module_name,  模块

package_name,  包

ClassName,  类

method_name,  方法

ExceptionName,   异常

function_name,  函数

GLOBAL_VAR_NAME, 全局变量

instance_var_name,  实例

function_parameter_name,   参数

local_var_name.  本变量

12.Python 中的注释有几种?

单行注释#,多行注释:'''   '''   或者"""   """

13.如何优雅的给一个函数加注释?

docstring+类型注解

14.如何给变量加注释?

15.Python 代码缩进中是否支持 Tab 键和空格混用。

不支持

16.是否可以在一句 import 中导入多个库?

可以是可以,但是不推荐。因为一次导入多个模块可读性不是很好,所以一行导入一个模块会比较好。同样的尽量少用 from modulename import *,因为判断某个函数或者属性的来源有些困难,不方便调试,可读性也降低了。

17.在给 Py 文件命名的时候需要注意什么?

不要和标准库的名字重名了,比如import os,文件名叫os.py就会报错

系统搜索模块的优先顺序:程序主目录-》系统环境变量定义的路径-》标准库目录

18.例举几个规范 Python 代码风格的工具

pep8  pylint

数据类型

字符串

19.列举 Python 中的基本数据类型?

数值(整数,浮点数,复数),布尔型,字符串,元组,列表,字典,集合

20.如何区别可变数据类型和不可变数据类型

可变数据类型:当该数据类型对应变量的值发生变化时,对应内存地址并没有开辟新的内存,而是在原来的内存值上进行修改,列表,字典集合都是可变类型

不可变数据类型:当该数据类型对应变量的值发生变化时,原来内存中的值不变,而是会开辟一块新的内存,变量指向新的内存地址,整型,浮点型,布尔型,元组,字符串都是不可变类型

21.将"hello world"转换为首字母大写"Hello World"

str="hello world"

print(str.title())

22.如何检测字符串中只含有数字?

isdigit(),如果都是数值就返回True,否则返回false

23.将字符串"ilovechina"进行反转

str=“ilovechina”

print(str[::-1])

24.Python 中的字符串格式化方式你知道哪些?

一、使用%

复制代码

%s     字符串
%c     字符
%d     十进制(整数)
%i     整数
%u    无符号整数
%o     八进制整数
%x    十六进制整数
%X     十六进制整数大写
%e     浮点数格式1 
%E     浮点数格式2 
%f     浮点数格式3 
%g    浮点数格式4 
%G    浮点数格式5 
%%     文字% 
print("我叫%s,今年%d岁了" % ("小李", 20))
我叫小李,今年20岁了

二、通过{}替代%

1、正常使用

>>> print("我叫{},今年{}岁了".format("小李", 20))
我叫小李,今年20岁了

2、还可以通过在括号里填写数字,修改格式化的顺序

>>> print("我叫{1},今年{0}岁了".format("小李", 20))
我叫20,今年小李岁了

3、通过key取变量

>>> print("我叫{name},今年{age}岁了".format(name="小李", age=20))
我叫小李,今年20岁了

4、传入对象

>>> class Person:
...     def __init__(self,name,age):
...
...             self.name,self.age = name,age
...     def __str__(self):
...
...             return '我叫{self.name}, 今年{self.age}岁了'.format(self=self)
>>> str(Person('小李',20))
'我叫小李, 今年20岁了'

5、通过下标

>>> person=['小李',20]
>>> '我叫{0[0]}, 今年{0[1]}岁了'.format(person)
'我叫小李, 今年20岁了'

6、填充与对齐  

格式限定符,语法是{}中带:号

填充常跟对齐一起使用

^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

>>> '{:>8}'.format('189')
'     189'
>>> '{:>8}'.format('189')
'     189'
>>> '{:0>8}'.format('189')
'00000189'
>>> '{:a>8}'.format('189')
'aaaaa189'

7、精度与类型f

>>> '{:.2f}'.format(321.33345)
'321.33'

其中.2表示长度为2的精度,f表示float类型

8、其他类型

主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。

>>> '{:b}'.format(17)
'10001'
>>> '{:d}'.format(17)
'17'
>>> '{:o}'.format(17)
'21'
>>> '{:x}'.format(17)
'11'

用,号还能用来做金额的千位分隔符。

>>> '{:,}'.format(1234567890)
'1,234,567,890'

25.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。

str=" adabdw "

print(str.strip())

26.获取字符串”123456“最后的两个字符。

str="123456"

print(str[-1:-3:-1])

27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?

先解码再编码,s.decode('GBK').encode('UTF-8')

28. (1)s="info:xiaoZhang 33 shandong",用正则切分字符串输出['info', 'xiaoZhang', '33', 'shandong']

re.split("\W",demo_str)

import re
a="info:xiaoZhang 33 shandong"
b=re.findall(r'[^:\s]+', a)
print(b)

       (2) a = "你好 中国 ",去除多余空格只留一个空格。

        

a = "你好 ? ? 中国 ?"
s1=a[:3]+a[3:].replace(" ","")
s2=a[:7].replace(" ","")+a[7:]
s3=a[:4].replace(" ","")+a[4:6]+a[6:].replace(" ","")
s4=a[:6].replace(" ","")+a[6:8]+a[8:].replace(" ","")

29. (1)怎样将字符串转换为小写

str.lower()

(2)单引号、双引号、三引号的区别?

都可标识字符串

单、双引号混合使用可以避免转义符

三引号一般用于多行注释或多行文本

列表

30.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。

方法一:AList = [1,2,3,1,2]
print(set(AList))

方法二:result = []

for i in AList:

     if i not in result:

              result.append(i)

print(result)

    

31.如何实现 "1,2,3" 变成 ["1","2","3"]

print("1,2,3".split(“,”))

32.给定两个 list,A 和 B,找出相同元素和不同元素

方法一:print(set(listA&listB))

              print(set(listA^listB))

方法二:

listA=[1,2,3]
listB=[1,3,4]

listC=[]
for i in listA:
    for x in listB:
        if i==x:
           listC.append(i)
listD=[]
for j in listA+listB:
    if j not in listC:
        listD.append(j)

33.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]

str=[[1,2],[3,4],[5,6]]

sum(str,[])

34.合并列表[1,5,7,9]和[2,2,6,8]

str1+str2

35.如何打乱一个列表的元素?

list=[1,2,3]

random.shuffle(list)

字典

36.字典操作中 del 和 pop 有什么区别

pop()函数会返回删除的值,而del()函数直接删除元素,没有返回值

37.按照字典的内的年龄排序

d1 = [

{‘name’:‘alice’, ‘age’:38},

{‘name’:‘bob’, ‘age’:18},

{‘name’:‘Carl’, ‘age’:28},

]

:d1.sort(key=lambda x: x[‘age’])

38.请合并下面两个字典 a = {"A":1,"B":2},b = {"C":3,"D":4}

a.update(b)

39.如何使用生成式的方式生成一个字典,写一段功能代码。

student_dic = {name: "student" for name in ["Robin", "Bob", "Jams"]} print(student_dic) # {'Robin': 'student', 'Bob': 'student', 'Jams': 'student'} 40.如何把元组("a","b")和

元组(1,2),变为字典{"a":1,"b":2}

dict(zip(('a','b'),(1,2)))

综合

41.Python 常用的数据结构的类型及其特性?

A:{1:0,2:0,3:0}

B:{“a”:0, “b”:0, “c”:0}

C: {(1,2):0, (2,3):0}

D: {[1,2]:0, [2,3]:0}

答:A为字典类型,无序key值不可重复,通过key值来取对应的value值。B也是字典类型,key值为string类型,也是通过dict[‘key’]的方式来取值。C也为字典类型,但key为元组,D的可是列表,列表是可变的,所以会报错,

42.如何交换字典 {"A":1,"B":2}的键和值?

{y:x for x,y in d.itmes()}

43.Python 里面如何实现 tuple 和 list 的转换?

使用tuple()和list()函数实现转换

44.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?

使用自带的itertools库进行实现,具体实现方式 itertools.islice(生成器对象,起始位置,结束位置),即可实现切片功能。

45.请将[i for i in range(3)]改成生成器

 (i for i in range(3))

46.a="hello"和 b="你好"编码成 bytes 类型

a.encode(encoding="utf-8")

47.下面的代码输出结果是什么?

a = (1,2,3,[4,5,6,7],8)

a[2] = 2

答:报错,元组元素不支持修改。

48.下面的代码输出的结果是什么?

a = (1,2,3,[4,5,6,7],8)

a[5] = 2

答:报错,列表看作是一个元素,5已经下标越界。

操作类题目

 

 

49.Python 交换两个变量的值

a,b=b,a

50.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用

read:读取整个文件。 readline:读取下一行,使用生成器方法。 readlines:读取整个文件到一个迭代器以供我们遍历

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

import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        else:
            return super(ComplexEncoder,self).default(obj)
d = { 'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}

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

import json
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
print(a) #{"ddf": "你好"}

53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。

54.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。

import datetime

def cal_time(n):

     date = (datetime.datetime.strptime(str,"%Y%m%d")+datetime.timedelta(days=n)).date()   --- strptime 字符串转为日期

    return datetime.datetime.strftime(date,"%Y%m%d")  -- strftime 日期转为字符串

print(cal_time(2))

55.写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。

def get_func(n):

     def get_func_in (n_in):

           return n *n_in

return get_func_in

t = get_fun(5)

print(t(4))

56.代码会存在什么问题,如何改进?

def strappend(num):
    str='first'
    for i in range(num):
        str+=str(i)
    return str

报错,'str' object is not callable,str(i)改为str[i]

57.一行代码输出 1-100 之间的所有偶数。

print([i*2 for i in range(1,51)])

print([i for i in range(1,101) if i%2==0])

58.with 语句的作用,写一段代码?

相当于发生异常之后finally中必须要执行的操作f.close()

with open("文件名",r) as f:

      f.readlines()

59.python 字典和 json 字符串相互转化方法

python 字典转为json: json.dumps(d)

json 转为字典:json.loads(d)

60.请写一个 Python 逻辑,计算一个文件中的大写字母数量

import os 

with open("test.txt","r") as f:

       count=0

      data = f.read()

      for i in data:

           if i.upper():

                count+=1

print(count)

方法二:import re

with open('file_name') as file:

    file_o = file.read()

    len_capital = len(re.compile(r'[A-Z]').findall(file_o))

print(len_capital)

61. 请写一段 Python连接 Mongo 数据库,然后的查询代码。

62.说一说 Redis 的基本类型。

字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)

63. 请写一段 Python连接 Redis 数据库的代码。

64. 请写一段 Python 连接 MySQL 数据库的代码。

65.了解 Redis 的事务么?

66.了解数据库的三范式么?

67.了解分布式锁么?

68.用 Python 实现一个 Reids 的分布式锁的功能。

69.写一段 Python 使用 Mongo 数据库创建索引的代码。

 

高级特性

70.函数装饰器有什么作用?请列举说明?

它可以让其他函数在不需要做任何代码变动的前提下增加额外功能

1,引入日志 2,函数执行时间统计3,执行函数前预备处理4,执行函数后清理功能5,权限校验等场景6,缓存7,事务处理

举例:函数执行时间统计:

from decimal import Decimal
import time

def count_time(func):
    def int_time(*args, **kwargs):
        start_time = time.perf_counter()  # 程序开始时间
        func()
        over_time = time.perf_counter()   # 程序结束时间
        total_time = Decimal(over_time-start_time)
        print('程序共计{:.2f}秒'.format(total_time))
    return int_time

@count_time
def main():
    print('>>>>开始计算函数运行时间')
    for i in range(1, 1000): # 可以是任意函数  , 这里故意模拟函数的运行时间
        for j in range(i):
            print(j)

if __name__ == '__main__':
    main()

 

71.Python 垃圾回收机制?

https://blog.csdn.net/xiongchengluo1129/article/details/80462651

72.魔法函数 __call__怎么使用?

Python给类提供了名为call的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,call方法是没有实现的,这意味着大多数情况下实例是不可调用的。

我们知道类中的方法是可调用的,其实实例也是可以被调用的,我们只需要实现call:

class Circle(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __call__(self, x, y):
        self.x = x
        self.y = y
c = Circle(10, 20)    # __init__
print c.x, c.y    # 10 20
c(100, 200)    # 调用实例(),触发__call__
print c.x, c.y    # 100 200
总结
拥有__call__方法的对象可以把对象当做一个函数调用
首先实例化这个类,触发init,然后通过实例调用触发call ,修改了实例变量。

此方法常见用于用类实现一个装饰器、元类等场景中。

73.如何判断一个对象是函数还是方法?

1、定义位置

函数:Python的函数是直接写在Python模块中的,即在.py文件中直接定义。

方法:只能定义在class类中

2、定义方式

函数:函数定义的方式 def关键字 然后接函数名 再是括号 括号里面写形参也可以省略不写形参

方法:方法定义的方式, 首先方法是定义在类中的,其他大体和函数定义差不多,这里需要注意的一点就是方法必须带一个默认参数self(静态方法除外)

3、调用方式

函数:直接使用函数名(参数1,参数2,…)调用

方法:方法是通过对象点方法调用的(这里是指对象方法)

注意:静态方法除外,可以不传递第一个self参数

74.@classmethod 和@staticmethod 用法和区别

75.Python 中的接口如何实现?

76.Python 中的反射了解么?

一个对象能够在运行时,如同照镜子一样,反射出其类型信息。简单而言,在Python中,能够通过一个对象,找出其type、class、attribute或者method的能力,称为反射或者自省。

https://blog.csdn.net/Fe_cow/article/details/80642224

77.metaclass 作用?以及应用场景?

78.hasattr() getattr() setattr()的用法

hasattr()判断对象是否有该方法或者变量;

getattr()获取对象的变量或者方法的内存地址,

setattr()设置对象的变量或者方法

delattr()删除对象的变量,不可删除方法

79.请列举你知道的 Python 的魔法方法及用途。

80.如何知道一个 Python 对象的类型?

81.Python 的传参是传值还是传址?

82.Python 中的元类(metaclass)使用举例

83.简述 any()和 all()方法

84.filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

85.什么是猴子补丁?

86.在 Python 中是如何管理内存的?

87.当退出 Python 时是否释放所有内存分配?

正则表达式

 

 

88.使用正则表达式匹配出<html><h1>百度一下,你就知道</html>中的地址 a="张明 98 分",用 re.sub,将 98 替换为 100

89.正则表达式匹配中(.*)和(.*?)匹配区别?

90.写一段匹配邮箱的正则表达式

 

其他内容

 

 

91.解释一下 python 中 pass 语句的作用?

92.简述你对 input()函数的理解

93.python 中的 is 和==

94.Python 中的作用域

95.三元运算写法和应用场景?

96.了解 enumerate 么?

97.列举 5 个 Python 中的标准模块

98.如何在函数中设置一个全局变量

99.pathlib 的用法举例

100.Python 中的异常处理,写一个简单的应用场景

101.Python 中递归的最大次数,那如何突破呢?

102.什么是面向对象的 mro

103.isinstance 作用以及应用场景?

104.什么是断言?应用场景?

105.lambda 表达式格式以及应用场景?

106.新式类和旧式类的区别

107.dir()是干什么用的?

108.一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。

109.列举 5 个 Python 中的异常类型以及其含义

110.copy 和 deepcopy 的区别是什么?

111.代码中经常遇到的*args, **kwargs 含义及用法。

112.Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?

113.w、a+、wb 文件写入模式的区别

114.举例 sort 和 sorted 的区别

115.什么是负索引?

116.pprint 模块是干什么的?

117.解释一下 Python 中的赋值运算符

118.解释一下 Python 中的逻辑运算符

119.讲讲 Python 中的位运算符

120.在 Python 中如何使用多进制数字?

121.怎样声明多个变量并赋值?

 

算法和数据结构

 

122.已知:

 

(1) 从 AList 和 BSet 中 查找 4,最坏时间复杂度那个大?

(2) 从 AList 和 BSet 中 插入 4,最坏时间复杂度那个大?

123.用 Python 实现一个二分查找的函数

124.python 单例模式的实现方法

125.使用 Python 实现一个斐波那契数列

126.找出列表中的重复数字

127.找出列表中的单个数字

128.写一个冒泡排序

129.写一个快速排序

130.写一个拓扑排序

131.python 实现一个二进制计算

132.有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。

133.单链表反转

134.交叉链表求交点

135.用队列实现栈

136.找出数据流的中位数

137.二叉搜索树中第 K 小的元素

爬虫相关

 

 

138.在 requests 模块中,requests.content 和 requests.text 什么区别

139.简要写一下 lxml 模块的使用方法框架

140.说一说 scrapy 的工作流程

141.scrapy 的去重原理

142.scrapy 中间件有几种类,你用过哪些中间件

143.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?

144.为什么会用到代理?

145.代理失效了怎么处理?

146.列出你知道 header 的内容以及信息

147.说一说打开浏览器访问 百度一下,你就知道 获取到结果,整个流程。

148.爬取速度过快出现了验证码怎么处理

149.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?

150.分布式爬虫主要解决什么问题

151.写爬虫是用多进程好?还是多线程好? 为什么?

152.解析网页的解析器使用最多的是哪几个

153.需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?

154.验证码的解决(简单的:对图像做处理后可以得到的,困难的:验证码是点击,拖动等动态进行的?)

155.使用最多的数据库(mysql,mongodb,redis 等),对他的理解?

 

网络编程

 

 

156.TCP 和 UDP 的区别?

157.简要介绍三次握手和四次挥手

158.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

 

并发

 

 

159.举例说明 conccurent.future 的中线程池的用法

160.说一说多线程,多进程和协程的区别。

161.简述 GIL

162.进程之间如何通信

163.IO 多路复用的作用?

164.select、poll、epoll 模型的区别?

165.什么是并发和并行?

166.一个线程 1 让线程 2 去调用一个函数怎么实现?

167.解释什么是异步非阻塞?

168.threading.local 的作用?

 

Git 面试题

 

 

169.说说你知道的 git 命令

170.git 如何查看某次提交修改的内容

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑色幽默168

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值