4.2 面试题

面试题 #

参考:

基础题 #

数据结构 #

元组是不是真的不可变? #

tuple 的每个元素,指向永远不变。

要创建一个内容也不变的 tuple 怎么做?

必须保证 tuple 的每一个元素本身也不能变。

# “可变的” tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

迭代器 vs 生成器 #

迭代器 #

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__()__next__()

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
生成器 #

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

生成器是一个返回迭代器的函数。

python 中生成器是迭代器的一种,使用 yield 返回值函数,每次调用 yield 会暂停,而可以使用 next () 函数和 send () 函数恢复生成器。

要创建一个 generator,有很多种方法,第一种方法很简单,只有把一个列表生成式的 [] 中括号改为()小括号,就创建一个 generator

#列表生成式
lis = [x*x for x in range(10)]
print(lis)
#生成器
generator_ex = (x*x for x in range(10))
print(generator_ex)

结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x000002A4CBF9EBA0>

进阶题 #

猴子补丁 #

属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。

为什么叫猴子补丁 #

属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法:

  1. 这个词原来为 Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里 guerilla 发音和 gorllia (猩猩) 相似,再后来就写了 monkey (猴子)。

  2. 还有一种解释是说由于这种方式将原来的代码弄乱了 (messing with it),在英文里叫 monkeying about (顽皮的),所以叫做 Monkey Patch。

猴子补丁的叫法有些莫名其妙,只要和 “模块运行时替换的功能” 对应就行了。

ujson #

import json
import ujson

def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads

monkey_patch_json()

参考:


本文访问量

本站总访问量

本站总访客数