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

很多,os、time、random、re、math、sys等

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

str,bytes,int,float,list,dict,tump,set,bool等。

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

我们一般打开文件:

file = open('xxx.txt','w')
try:
    file.write('111')
except:
    pass
finally:
    file.close()

而我们使用with则可以直接

with open('xxx.txt','w') as f:
    f.write('111')

由with帮我们执行了close操作,保证了文件的安全性。

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

可变类型:指的是对变量进行append、+、-等相关操作后,虽然改变了对象的值,但是对象的id也就是地址不会发生改变,对于相同值的变量,内存中有多份。包括:

  • list
  • dict
  • set
  • byte array
  • user-defined classes(default)

不可变类型:指的是改变值就会变换id,相同的值内存中只有一份(类似java的运行时常量池),包括:

  • int
  • float
  • bool
  • string
  • tuple
  • range

5. Python 获取当前日期?

from time import localtime.strftime
print(strftime('%Y-%m-%d',localtime())

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

这个。。就是写程序,要是非说有个知识点,那就是python的collections包

这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

text = 'How are you? I am fine, thank you, and you?'
text_list = text.split(' ')
count = Counter(text_list)
print(count)

得到:

Counter({'you?': 2, 'How': 1, 'are': 1, 'I': 1, 'am': 1, 'fine,': 1, 'thank': 1, 'you,': 1, 'and': 1})

collections中包括以下几个容器(我没打错,就是有大写有小写,我也不知道为什么):

namedtuple() 创建命名元组子类的工厂函数
deque 类似列表的容器,实现了在两端快速添加和弹出
ChainMap 类似字典的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典子类,保存了他们被添加的顺序
defaultdict 字典子类,有一个工厂函数,为查询提供默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了列表对象,简化了字符串子类化

namedtuple就相当于一个只有属性的类,比如我们想新建一个friend类,有几个属性(但是不需要方法):

定义一个deque但后就可以调用append、appendleft、pop、popleft、remove等操作进行双向进出栈操作。

ChainMap,实话实说我觉得这个用处不大,如下图,我们可以看到虽然将多个字典合并起来了,但是值能查询到第一次出现的值,虽然转了list确实将关键字合并了。

Counter 上面演示过, 提供了可哈希对象的计数功能 。

OrderedDict,不做演示,保存插入顺序。

defaultdict,我也不知道为啥上面驼峰这个就这样x。

这个提供了一个默认返回,比如我们查找fff,d可以返回一个空,而s则报错,同时d可以将相同的键值对转化为列表。

剩下三个Userxxx,是用来给用户自定义的(比如自定义自己的列表)

7.用Python删除文件和用linux命令删除文件的方法:

python:

import os
os.rmdir('path')
os.remove('file')

linux:

rm file

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

class MyError(Exception):
pass

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

def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result" + result)
finally:
print("exit")

try中写需要保护的代码,except写异常的处理,else中写try中不引发异常后必须执行的代码,finally则是在任何情况下都会被执行的代码。

10.遇到bug如何处理?

这个有点仁者见仁了,首先一定是看报错,看报错栈最顶层是哪里的代码,一般我会定位到报错栈里最先出现我的代码的部分,然后观察报错信息,分析情况。

如果分析不出来或者较难分析,需要一步一步debug、添加中间状态变量啊或者整理思路,反正手段不少,具体可能要看情况。

11.谈谈Python和其他语言的区别

python对于其他所有语言都不具备的一个优点就是第三方库太强大了,甚至我们印象中的写windows驱动这种必须用C++解决的活都可以用python来解决。

但是缺点也很明显,就是慢和臃肿(不是代码行上的),慢说的就是相对java和c++的运行速度来说,确实还是慢,java经过优化已经和c++不会差很多。再一个是臃肿,虽然python可以用几行解决别的语言很多行解决的事情,但是在打成可执行文件的时候,python的文件会明显比其他语言大(我也不知道是我的打包库有问题还是确实这样)。

12.简述解释型和编译型语言

解释型语言边运行变解释,也就是如果你在某一步出现一些错误(比如在12行你进行了一个除0操作),在程序运行到这一行之前并不会抛出任何错误,因为他还没看到这。

编译型语言先进行编译,也就是会尽可能保证程序的可运行,往往直接进行除0操作的代码是编译不通的。

顺便一说,java现在已经不再是纯粹的解释型语言了,虽然都这么说,但是经过几次JVM的更新迭代,现在已经属于解释型和编译型共有的语言了,JVM会挑选一部分常用代码进行编译。

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

由于我们编写的是.py,需要解释器去执行py文件,而且由于python是一门开源语言,解释器理论上可以由任何人编写,因此确实存在不少解释器。

我知道解释器,但是不知道还有好多哈哈哈哈,这个我还真不知道,学习了。

  • CPython:这个就是我们日常使用的python解释器,由于是使用C语言进行编写的,因此又叫做CPython。
  • IPython:基于CPython之上的一个交互式解释器,这么一说我也知道了,jupyter那个东西,之前就叫ipython notebook,后来改成了jupyter notebook,就是一个在可视化上解析代码的东西。
  • PyPy:他的目标是执行速度。采用JIT技术(这也是JVM代码优化的技术),对py代码采用动态编译,但是需要注意的是,PyPy与Cpython的代码有一丢丢不同。
  • Jython:运行在JVM上的python解释器,可以直接把Python代码编译成Java字节码文件。
  • IronPython:和Jyhon类似,编译成.Net。

14.说说你知道的Python3和Python2的区别

性能:

早起的python3版本速度比python2慢很多。

编码:

python2的默认编码为ASCII,而python3的为utf-8

语法:

  • 加入了as和with,True,False和None
  • 除法返回浮点数,//整除
  • print语句改为print()函数
  • raw_input改为input

15.Python3和Python2中的int和long的区别:

python2中有long,python3中没有long,但是int功能上和python2的long很像。

16.xrange和range的区别

python2中的xrange等同于python3的range,同时python3中并没有xrange。

17.什么是PEP8?

《Python Enhancement Proposal #8》,8号python增强提案,是一个针对Python代码格式进行规范的一个文档,包括:

  • 首行缩进4个空格,不能使用tab
  • 每行最大程度79
  • 类和top-level方法定义空两行,类中方法定义空一行,函数内逻辑无关段落空一行,其他地方尽量不要空行
  • 模块的导入顺序:标准库,三方库,自定义库,之间空一行。
  • 不推荐一个import多个库(import os,time)
  • 注释和命名规范
  • 尽量使用is is not 取代==,if x is not None 优于if x
  • 每个模块都要有自己的异常类
  • try中的代码尽量少

18.了解Python之禅吗?

Python社区的历年都包含在Tim Peters撰写的Python之禅中, 要获悉这些有关编写优秀Python代码的指导原则,只需在解释器中执行命令import this

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

19. 了解 docstring 么?

下图就是一个docstring,使用三对双引号(或者单引号)来声明,通过方法名.__doc__来显示(partition.__doc__)

20.了解类型注解么?

如下,分别对x,y和返回值进行了定义。

def add(x:int, y:int) -> int:

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

  • 类:首字母大小,驼峰命名法
  • 变量:小写,下划线命名法
  • 常量:全部大写

22. Python 中的注释有几种?

两种,分别是单行注释#和多行注释”””这是多行注释”””。

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

打完方法的冒号后回车,按仨引号回车,打文档注释。

24.如何给变量加注释

一般是代码后空2格

a = 3  # 这是变量a

但是我感觉这好乱啊哈哈哈还是喜欢在上面另起一行注释

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

不支持,很多编译器实际上是将tab转换为n个空格(可设置)。

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

可以,但不推荐(PEP8标准中 提过)

27.在给py文件命名的时候应该注意什么?

  • 避免python的保留字、关键字
  • 避免常用第三方库的关键字、保留字
  • 只能使用数字、字母和下划线。
  • 只能以字母和下划线开头。

28.举几个python代码风格工具:

Pylint、Black等,主要功能类似于java的那个alibaba规范脚本,检查定义符不符合规范、定义的接口是否都被使用等,在安装之后右键又一个check即可检查错误。

29.列举Python中的基本数据类型:

再放送?这和第二题有啥区别

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

又是再放送

31.如何将‘hello world’转换为首字母大写‘Hello World’

另:

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

这句话其实看怎么定义‘数字’,科学技术法或者+5,-5算数字吗?如果都不算,那么下面这样就可以。

如果算,需要做的就是这样:

33. 将字符串”ilovechina”进行反转

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

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

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

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

s.decode("gbk").encode("utf-8")

38.s=”info:xiaoZhang 33 shandong”,用正则切分字符串输出’info’, ‘xiaoZhang’, ’33’, ‘shandong’ a = “你好 中国 “,去除多余空格只留一个空格。

39.(1)怎样将字符串转换为小写 (2)单引号、双引号、三引号的区别?

s = 'HAHAHA'
print(s.lower())

单引号双引号没有区别,但是有一点,就是单引号中双引号可以,但是再使用单引号需要转义,双引号同理。三引号是docstring和多行注释。

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

41. 如何实现 “1,2,3” 变成 [“1″,”2″,”3”]

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

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

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

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

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

pop在删除后返回该元素的值,del直接删除,另外二者速度上没有去很大区别(尽管del相对pop有一丢丢优势)

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

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

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

50. 如何把元组(“a”,”b”)和元组(1,2),变为字典{“a”:1,”b”:2}

关于zip:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

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

¿啥 是这个吗

  • int 存整数
  • float 存浮点数
  • list 存列表
  • tuple 存元组
  • dict 存字典

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

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

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

这道题考察itertools的islice。

iterable[start : stop : step], 创建一个迭代器,跳过前start个项,迭代在stop所指定的位置停止,step指定用于跳过项的步幅。迭代默认将从0开始,步幅默认1 (是不是和切片很像?)

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

56. a=“hello” 和 b=“你好” 编码成 bytes 类型

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

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

元组不能更改,报错。

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

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

(1,2,3,[2,5,6,7],8) 。虽然元组不能更改,但是元组内的数据类型如果可变类型是可以改的(int为不可变类型,list为可变类型)。

59. Python 交换两个变量的值

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

read是将文件中的数据以字符串的形式存出来,多行中用\n分割,但是对于较大文件需要很大的内存。

readline是一次读取一行,但是相对于readlines慢。

readlines是将文件行以列表的形式返回。

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

可以处理所有python的自带数据类型(或自动转换到可处理类型)

from datatime import datatimd
datatime.strftime('%Y-%m-%d %H:%M:%S')

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

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

读写文件就不写了,with open() as f ,然后分别read和write

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

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

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

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

首先命名不规范,其次由于str是不可变类型,每次循环都产生新的对象浪费,应该列表转换。

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

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

with open('xxx','w') as f:
f.write('xxx')

会自动调用close方法,不再需要手动调用(详见第三题)

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

70. 请写一个 Python 逻辑,计算一个字符串中的大写字母数量

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

略。

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

有五种类型:

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • ZSet(有序集合)

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

现在电脑没有redis环境,以后补x。

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

略。

75. 了解 Redis 的事务么?

事务提供了一种”将多个命令打包,一次性提交并按顺序执行”的机制,提交后在事务执行中不会中断。只有在执行完所有命令后才会继续执行来自其他客户的消息。

类似于批处理+资源锁。

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

一范式: 任给关系R,如果R中每个列与行对应单元格的数据都是不可再分的基本元素,则R达到第一范式,简称1NF。 (最基本的范式)

二范式: 如果一个关系达到第一范式,且不存在任何非主属性对候选关键字的部分函数依赖,则称关系达到第二范式,2NF。 (其他项均与主键有关)

三范式: 如果一个关系达到第二范式且不存在非主属性对候选关键字的传递函数依赖,则称为达到第三范式,简称3NF。 (约束外键,通过外键查询信息)

77. 了解分布式锁么?

利用诸如zookeeper,redis等更高效的分布式组件来实现分布式锁,可以提供高可用的更强壮的锁特性,并且支持丰富化的使用场景。

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

略。

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

略。

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

装饰器本质上是一个 Python 函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

81. Python 垃圾回收机制?

Python的垃圾回收机制十分类似于java的垃圾回收,但是Python的垃圾回收并没有java的那么多种,python只有引用计数器和分代回收、标记清除。

82. 魔法函数 call怎么使用?

call的存在允许了对象当作方法来进行使用,比如下面的sum(),虽然sum的对象,但是依然会调用call来进行相关的操作。

class Sum:
    def __init__(self, x, y):
        self._x = x
        self._y = y
    def add(self):
        return self._x + self._y
    def __call__(self):
        return self.add()
sum = Sum(1, 2)
print(sum.add())
print(sum())
print(callable(sum))

输出:

3
3
True

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

使用type,方法输出应该是function,而对象则是__main__.对象名。

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

classmethod用来定义类方法,而staticmethod用来定义静态方法。

使用上两种都可以使用类名.方法名来进行调用,但是calssmethod必须要有一个以上参数(cls), 这个参数表示自身类,可以用它来对方法内的方法进行调用。

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

from abc import ABCMeta,abstractmethod
class interface(object):
    __metaclass__ = ABCMeta #指定这是一个抽象类
    @abstractmethod  #抽象方法
    def Lee(self):
        pass
    def Marlon(self):
        pass

但是需要注意的是接口的继承类必须复写所有方法,所以可能还不如继承好用。

86. Python 中的反射了解么?

反射是在只知道类名或者函数名的情况下调用其对应的函数。

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

metaclass允许父类对子类进行修改,一般用在框架开发。由于不推荐使用所以不做过多介绍。

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

常用在python的反射,86题全部用过这几种方法,移步86题。

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

  • init:构造函数
  • del:析构函数
  • setattr:设置参数
  • getattr:获得参数
  • delattr:删除参数
  • ···

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

type()

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

这取决于是什么类型,如果是可变类型就传递值,如果是不可变类型就传参。

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

元类就是生成类的工具,python最基础的元类是type(也就是可以用type来生成类),同样我们也可以通过复写 __metaclass__属性来使当前类变成元类。

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

any方法会监测这里面是否有非0(0、False、空),如果有返回True,如果没有返回False。

all方法检测是否全为0(0、False、空),如果全空返回True,反之False。

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

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表。

95. 什么是猴子补丁?

在运行期间动态修改一个类或模块。

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

python使用了一个内存池叫做 pymalloc ,它对于那些小于512k以下的对象在pymalloc中分配空间,防止频繁的使用C语言的malloc和free造成的系统开销。对于大于512k的依然交给系统的malloc来处理。

然后利用引用计数器、标记-清除等算法进行垃圾处理。

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

不会,会保留一部分全局变量空间。

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

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

?代表非贪婪匹配。即可以匹配0次或者1次,而.只匹配一个任意字符。

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

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

空语句,当搭建整体架构或者确定要有这个方法(循环、判断等)但是具体实现还没想好或者当前可以跳过时。

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

input接受一个标准输入数据,返回string类型

103. python 中的 is 和==

is 比较地址(id),而==比较值,对于对象的比较,可以在类中重载__eq__来完成对==的重载。

104. Python 中的作用域

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

思考下面两个等价示例:

if a==1:
    return a
else:
    return b
return a if a==1 else b

在一些简短的判断语句中可以使用三元运算。

106. 了解 enumerate 么?

该函数他igong了将一个可遍历的对象组合一个索引返回。

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

?第一题。

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

global

109. pathlib 的用法举例

用于pathlib中的Path类可以创建path路径对象, 属于比os.path更高抽象级别的对象

  • Path.suffix 文件后缀
  • Path.stem 文件名不带后缀
  • Path. name 带后缀的完整名字
  • Path. parent 带路径的上级目录

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

一下子也想不出比较好的例子了,一般异常就是在文件开关、请求或者容易产生越界的地方使用

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

递归次数最大为1000次,但是这并不是出于性能考虑的限制,而是出于防止无限递归造成崩溃。

使用下面代码就可以更改这个限制。

import sys
sys.setrecursionlimit(1500)

112. 什么是面向对象的 mro

MRO Method Resoluthion Order 方法解析顺序

子类优于父类,自实现优于系统实现。对于多继承情况,根据类的不同(分为新式类和旧式类,区分旧式新式类显示继承Object),其中新式类采用广度优先遍历来查找方法,旧式类采用深度优先遍历来查找方法。详见116

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

获取对象的类型,主要用来确定类型是否是需要的类型或者根据对象选择不同的分支。

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

assert,会检查assert后面的语句是否为真,为真继续执行,为假抛出异常。常用于debug中判断当前步结果是否在意料之中。

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

比如定义一个求两数和的方法:

lambda x, y:x+y

常用于简单方法并且不需要重复调用的情况

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

新式类都继承object,旧式类不需要。新式类的MRO采用广度优先搜索,而旧式类采用深度优先搜索。

旧式类:

class A:
	pass
class B:
	pass
class C(B):
	pass
class D(C,A):
	pass

执行顺序(深度优先):D-C-B-A

新式类:

class A(object):
	pass
class B(object):
	pass
class C(object):
	pass
class D(A,B,C):
	pass

执行顺序(广度优先):D-A-B-C-Object

python2中默认旧式类,新式类要显式声明。

python3中都是新式类,旧式类被移除。

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

查看对象有什么方法。

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

from tools import demo1
from tools import demo2

或者(但不推荐)

from tools import demo1,demo2

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

  • IndexError 索引越界
  • KeyError 没有这个关键字
  • NameError 变量使用前未定义
  • IndentationError 缩进错误
  • TypeError 类型错误,比如int(‘hahaa’)
  • ZeroDivsionError 零除
  • ········

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

copy是浅拷贝,而deepcopy是深拷贝。

我们都知道python的对象分为可变对象和不可变对象,因此举个例子。

思考上面两个例子,其中对于列表中有可变类型时,深拷贝的浅拷贝的区别显现了出来。

因此,可以简单的理解为,浅拷贝只拷贝一层地址,而深拷贝会继续向下拷贝元素的子元素地址。

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

*args是元组类型,**kwargs是字典类型。

def function(arg,*args,**kwargs):
    print(arg,args,kwargs)
function(6,7,8,9,a=1, b=2, c=3)

输出:6 (7, 8, 9) {‘a’: 1, ‘b’: 2, ‘c’: 3}

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

  • _xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
  • __xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以
  • __xxx___ 定义的是特列方法。像__init__之类的

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

w:只写

a+:可读可写,没有创建

wb:二进制写

124. 举例 sort 和 sorted 的区别

sort是list的一个属性方法,改变原列表。
sorted不改变原列表,生成新列表。

125. 什么是负索引?

倒是第绝对值个数。

126. pprint 模块是干什么的?

print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是pprint()模块打印出来的数据结构更加完整,每行为一个数据结构,更加方便阅读打印输出结果。特别是对于特别长的数据打印,print()输出结果都在一行,不方便查看,而pprint()采用分行打印输出,所以对于数据结构比较复杂、数据长度较长的数据,适合采用pprint()打印方式。当然,一般情况多数采用print()。

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

+、-、*、/、+=、-=、*=、/=

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

and or not is

129. 讲讲 Python 中的位运算符

&按位与、|按位或、^异或、~取反、<<左移、>>右移。

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

int()十进制、bin()二进制、oct()八进制、hex()十六进制。

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

a,b = 1,2

132. 已知:

  • 从 AList 和 BSet 中 查找 4,最坏时间复杂度那个大?
  • 从 AList 和 BSet 中 插入 4,最坏时间复杂度那个大?

list的后台实现是列表,采用线性查找,因此时间复杂度为n;直接插入,时间复杂度1。

set的后台实现是字典,采用二叉树排序,时间复杂度lgn,建树插入,时间复杂度lgn。

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

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

python天然就是单例模式,因此只需要在类中新建自己的对象即可。更多单例模式方法感兴趣的自己查。

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

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

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

138. 写一个冒泡排序

139. 写一个快速排序

详见:【算法导论】快速排序

140. 写一个拓扑排序

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

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

143. 单链表反转

144. 交叉链表求交点

145. 用队列实现栈

146. 找出数据流的中位数

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

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

大部分情况是没有区别的,其中:content返回的是字节码,而text是编码后的文本(猜测编码),因此在text猜错的情况下需要我们使用content.decode()来进行重新解码。

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

详见:网络爬虫 解析库的使用

150. 说一说 scrapy 的工作流程

首先Spiders将需要请求的url经ScrapyEngine交给Scheduler。

Scheduler处理后,经ScrapyEngine,DownloaderMiddlewares交给Downloader。

Downloader向网站进行请求,接受响应,将response经过ScrapyEngine,SpiderMiddleware交给Spiders。

spiders处理response,提取数据,经过ScrapyEngine交给ItemPipline进行本地(数据库)保存。

151. scrapy 的去重原理

Scrapy本身带有一个中间件进行去重,可以在scrapy的源码中找到一个 dupefilters.py 文件,同时又一个dont_fliter开关进行控制是否进行去重操作。

对于每一个url,根据url(处理)使用set进行去重。

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

Doenloader Middleware等。

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

比较简单的就是各种.gov、.edu、这类网站的反爬,几乎没有,简单的requests就可以。

其次就是比如微博、知乎、CSDN这种本身就有大量匿名访问流量的公开网站。这种网站一般会在ip访问频率和登录状态上进行限制,这种只要加一个ip代理或者控制访问频率和携带cookie即可。

再就是例如淘宝这类网站可能有加密接口,没有办法直接找到接口,一般使用js解密或者使用测试框架。包括selenium等。

再高的比如淘宝,某些页面有图层遮挡、甚至有测试框架检测,除了应用小众测试框架以外水平有限,不知道怎么解决。

154. 为什么会用到代理?

由于访问迅速目标网站拒绝访问时,需要使用大量其他ip作为代理访问目标网站。

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

维持代理池,心跳检测代理可用性。

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

  • Accept:接受返回文件爱你类型
  • Accept-Encoding:接受返回编码
  • Accept-Language:接受返回语言
  • Connection:是否持续连接(HTTP1.0/1.1)
  • Cookie:保存登录状态,在京东等网站也用来保存购物车信息
  • Host:目标主机
  • Referer:来源(比如从百度点入某页,referer就是百度)
  • User-Agent:浏览器相关信息

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

这里是考三次握手吗?首先浏览器向服务器发送询问请求,然后服务器返回ACK,然后浏览器返回ACK的ACK。然后将百度的主页发送到浏览器,解析给用户。

如果使用HTTP1.1,当你点击搜索时,向服务器发送请求并获取结果。(百度确实使用HTTP1.1)。

如果是HTTP1.0,则重复上述握手过程。

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

降速,或者处理验证码,不过现在很多公司都接入极验了,还是降速或者使用代理比较稳妥。

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

scrapy是爬虫框架,而scrapy是redis对scrapy的支持组件。

redis为内存数据库,具有很快的读写效率。

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

目标服务器对ip的限制以及高速率要求的爬取。

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

多线程好,因为爬虫属于IO密集型。

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

beautifulsoup、lxml

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

代理池+js逆向。

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

selenium有js方法可以进行拖动。图片直接OCR或者类似处理后输入即可。

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

mysql传统数据库,关系型。mongodb非关系型数据库,支持字段更多,由于使用了内存优化也并不慢(相比mysql)。redis内存数据库,读取非常快,但是没办法永久存储。

166. TCP 和 UDP 的区别?

  • TCP面向连接,UDP无连接。
  • TCP面向字节流,UDP面向数据报。
  • TCP保证数据正确,UDP不保证。
  • TCP保证数据顺序,UDP不保证。

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

三次握手:

客户端:你好。

服务器:我收到你好了,你好。

客户端:我收到你的你好了,搞起。

四次挥手:

客户端:88

服务器:收到

服务器:88

客户端:收到

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

沾包就是多个数据包被连续送入接收方的缓存中,无法判断出数据边界。

造成沾包的原因有很多,在发送方可能是因为TCP协议本身的限制,将很多小包打成大包后发送,因此可能造成沾包。

对于接收方,可能是进程接受数据不及时,导致缓存中滞留过多数据。

分类: Python

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注