Python 爬虫面试题 170 道


语言特性

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

1
2
3
4
5
6
7
8
Python的定位是“优雅”、“明确”、“简单”,容易入门,开发效率高,拥有非常强大的第三方库。
Python属于解释型编程语言,属于动态语言,并且是强类型语言。
同时具备可移植、可扩展,可嵌入等优点。

拿 C 语言和 Python 比:
Python 的第三方类库比较齐全并且使用简洁,很少代码就能实现一些功能,如果用 C 去实现相同的功能可能就比较复杂。
但是对于速度来说 Python 的运行速度相较于 C 就比较慢了。所以有利的同时也有弊端,毕竟我们的学习成本降低了。
线程不能利用多CPU问题,GIL即全局解释器锁。

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

1
2
编译型: 一次性将所有代码编译成二进制文件,运行效率高。
解释型: 当程序执行时,将代码从上至下一行一行的解释成二进制,运行效率慢。

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

1
2
3
4
5
CPython C语言开发的,使用最广的解释器。
IPython是基于CPython之上的一个交互式解释器,交互方式增强功能和 cPython 一样。
PyPy,采用 JIT 技术。对 Python 代码进行动态编译,提高执行效率
JPython 运行在 Java 上的解释器,直接把 Python 代码编译成 Java 字节码执行
IronPython 运行在微软 .NET 平台上的解释器,把 Python 编译成 .NET 的字节码。

Python3 和 Python2 的区别?

1
2
3
4
5
print 在 Python3 中是函数,必须加括号 print('hello'),Python2 中 print 为 class,print 'Hello, World!'
Python3中 input得到的为str;Python2的input的到的为int型,Python2的raw_input得到的为str类型
Python2中 使用xrange,Python3 使用range。
Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。
Python2 中默认的字符串类型默认是 ASCII,Python3 中默认的字符串类型是 Unicode。

Python3 和 Python2 中 int 和 long 区别?

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

xrange 和 range 的区别?

1
2
xrange 是在 Python2 中的用法,Python3 中只有 range。
range 生成的不是一个 list 对象,而是一个生成器。

编码规范

什么是 PEP8?

1
《Python Enhancement Proposal #8》(8 号 Python 增强提案)又叫 PEP8,他针对的 Python 代码格式而编订的风格指南。

了解 Python 之禅么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
通过 import this 语句可以获取其具体的内容。它告诉大家如何写出高效整洁的代码。

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
# 优美胜于丑陋(Python以编写优美的代码为目标)
Explicit is better than implicit.
# 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
Simple is better than complex.
# 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
Complex is better than complicated.
# 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
Flat is better than nested.
# 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
Sparse is better than dense.
# 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
Readability counts.
# 可读性很重要(优美的代码是可读的)
Special cases aren't special enough to break the rules.
Although practicality beats purity.
# 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
Errors should never pass silently.
Unless explicitly silenced.
# 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写except:pass风格的代码)
In the face of ambiguity, refuse the temptation to guess.
# 当存在多种可能,不要尝试去猜测
There should be one-- and preferably only one --obvious way to do it
# 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
Although that way may not be obvious at first unless you're Dutch.
# 虽然这并不容易,因为你不是 Python 之父(这里的Dutch是指Guido)
Now is better than never.
Although never is often better than *right* now.
# 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
# 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
Namespaces are one honking great idea -- let's do more of those!
# 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)