【面试题目来着微信公众号:GitChat】
高级特性
- 函数装饰器有什么作用?请列举说明?
【理解】
【手写通用装饰器】
from functools import wrap
def decorator(old_func):
@wrap(old_func)
def new_func(*args, **kwargs):
print("装饰内容1")
result = old_func(*args, **kwargs)
print("装饰内容2")
return result
return new_func
- Python 垃圾回收机制?
【小整数池】 [-5, 257)这些整数是提前创建好的对象,不会回收;同理,字母也是。
【引用计数】python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。引用计数为0时,回收这部分内存。
【循环垃圾回收器】 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。 - 魔法函数 __call__怎么使用?
【定义】python中双下划线包起来的方法,统称为魔术方法。
- 如何判断一个对象是函数还是方法?
【直接判断】类中的函数就叫方法。
【代码判断】
from types import MethodType, FunctionType
class TestClass:
def func(self):
pass
def testFunc():
pass
def run():
print("foo 是函数", isinstance(TestClass().func, FunctionType))
print("foo 是方法", isinstance(TestClass().func, MethodType))
print("foo2 是函数", isinstance(testFunc, FunctionType))
print("foo2 是方法", isinstance(testFunc, MethodType))
if __name__ == '__main__':
run()
-
@classmethod 和@staticmethod 用法和区别
【classmethod】类方法装饰器;第一个参数是类本身;对象和类都可以调用这个方法。
【staticmethod】静态方法装饰器;与类、对象都无关的方法,没有代码类或对象的参数;类和对象都可以直接调用。
-
Python 中的接口如何实现?
我通常使用flask或Django框架实现接口。我们上个项目是用的Flask框架实现的。 -
Python 中的反射了解么?
【概念】反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。
【实现】python的四个重要内置函数:getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制。他们都是对内存内的模块进行操作,并不会对源文件进行修改。 -
metaclass 作用?以及应用场景?
【概念】metaclass是元类,元类就是用来创建类的“东西”。
【作用】元类的主要目的就是为了当创建类时能够自动地改变类。
【应用】“元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters -
hasattr() getattr() setattr()的用法
【hasattr(object, name)】hasattr() 函数用于判断对象是否包含对应的属性。如果对象有该属性返回 True,否则返回 False。
【getattr(object, name[, default])】getattr() 函数用于返回一个对象属性值。返回对象属性值。
【setattr(object, name, value)】setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。无返回值。 -
请列举你知道的 Python 的魔法方法及用途。
-
如何知道一个 Python 对象的类型?
【判断是否是一个类型】isinstance(obj, cls)
【查看类型】type(obj)
-
Python 的传参是传值还是传址?
【不可变参数传递】通过拷贝进行传递的,传值。
【可变类型参数传递】引用传递,传址。 -
Python 中的元类(metaclass)使用举例
待补充 -
简述 any()和 all()方法
【all】all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
【any】any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
元素除了是 0、None、空、FALSE 外都算 TRUE。 -
filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
【filter(function, iterable)】filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
def test35():
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = filter(lambda x: x % 2 == 1,
a)
return list(b)
-
什么是猴子补丁?
【概念】python中,在运行期间动态修改一个类或模块。
【应用】单元测试时构造罕见异常。 -
在 Python 中是如何管理内存的?
【小整数池】 [-5, 257)这些整数是提前创建好的对象,不会回收;同理,字母也是。
【引用计数】python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。引用计数为0时,回收这部分内存。
【循环垃圾回收器】 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。 -
当退出 Python 时是否释放所有内存分配?
答案是 No。循环引用其它对象或引用自全局命名空间的对象的模块,在 Python 退出时并非完全释放。
正则表达式
- (1)使用正则表达式匹配出
<html><h1>www.baidu.com</html>
中的地址;(2)a=“张明 98 分”,用 re.sub,将 98 替换为 100
【1】分组:gourp(n)取第n组,gourp(0)取所有的.
import re
def test36():
data = "<html><h1>www.baidu.com</html>"
r_str = "<html><h1>(.*?)</html>"
url = re.search(r_str, data)
print(url.group(1))
【2】前向界定与后向界定
有时候需要匹配一个跟在特定内容后面的或者在特定内容前面的字符串, Python 提供一个简便的前向界定和后向界定功能,或者叫前导指定和跟从指定功能。
‘(?<=…)’ 前向界定:括号中 ’…’ 代表你希望匹配的字符串的前面应该出现的字符串。
‘(?=…)’ 后向界定:括号中的 ’…’ 代表你希望匹配的字符串后面应该出现的字符串。
def test37():
key = "张明 98 分"
p1 = "(?<=张明 )\d+(?= 分)"
result = re.sub(p1, "100", key)
print(result)
- 正则表达式匹配中(.)和(.?)匹配区别?
(.*)
是贪婪模式。尽可能长的匹配。
(.*?)
是非贪婪模式。
- 写一段匹配邮箱的正则表达式
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
面试题目来着微信公众号:GitChat
Python 爬虫面试题 170 道
以上答案皆为鄙人回答,如有问题,敬请诸君指出.
【python面试170题】系列
1. 语言特性
2. 编码规范
3. 数据类型-字符串
4. 数据类型-列表、字典
5. 数据类型-综合
6. 操作类题目
7. 高级特性、正则表达式
8. 其他内容
9. 算法和数据结构
10. 爬虫相关
11. 网络编程、并发、Git