Python面试宝典大全-10_python开发面试

147 阅读3分钟

要求:写一个函数,传入的参数是一个列表(列表中的元素可能也是一个列表),返回该列表最大的嵌套深度。例如:列表[1, 2, 3]的嵌套深度为1,列表[[1], [2, [3]]]的嵌套深度为3。

def list_depth(items):
    if isinstance(items, list):
        max_depth = 1
        for item in items:
            max_depth = max(list_depth(item) + 1, max_depth)
        return max_depth
    return 0

点评:看到题目应该能够比较自然的想到使用递归的方式检查列表中的每个元素。

题目48:按照题目要求写出对应的装饰器。

要求:有一个通过网络获取数据的函数(可能会因为网络原因出现异常),写一个装饰器让这个函数在出现指定异常时可以重试指定的次数,并在每次重试之前随机延迟一段时间,最长延迟时间可以通过参数进行控制。

方法一:

from functools import wraps
from random import random
from time import sleep


def retry(*, retry_times=3, max_wait_secs=5, errors=(Exception, )):

    def decorate(func):

        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(retry_times):
                try:
                    return func(*args, **kwargs)
                except errors:
                    sleep(random() * max_wait_secs)
            return None

        return wrapper

    return decorate

方法二:

from functools import wraps
from random import random
from time import sleep


class Retry(object):

    def __init__(self, *, retry_times=3, max_wait_secs=5, errors=(Exception, )):
        self.retry_times = retry_times
        self.max_wait_secs = max_wait_secs
        self.errors = errors

    def __call__(self, func):

        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(self.retry_times):
                try:
                    return func(*args, **kwargs)
                except self.errors:
                    sleep(random() * self.max_wait_secs)
            return None

        return wrapper

点评:我们不止一次强调过,装饰器几乎是Python面试必问内容,这个题目比之前的题目稍微复杂一些,它需要的是一个参数化的装饰器。

题目49:写一个函数实现字符串反转,尽可能写出你知道的所有方法。

点评:烂大街的题目,基本上算是送人头的题目。

方法一:反向切片

def reverse_string(content):
    return content[::-1]

方法二:反转拼接

def reverse_string(content):
    return ''.join(reversed(content))

方法三:递归调用

def reverse_string(content):
    if len(content) <= 1:
        return content
    return reverse_string(content[1:]) + content[0]

方法四:双端队列

from collections import deque

def reverse_string(content):
    q = deque()
    q.extendleft(content)
    return ''.join(q)

方法五:反向组装

from io import StringIO

def reverse_string(content):
    buffer = StringIO()
    for i in range(len(content) - 1, -1, -1):
        buffer.write(content[i])
    return buffer.getvalue()

方法六:反转拼接

def reverse_string(content):
    return ''.join([content[i] for i in range(len(content) - 1, -1, -1)])

方法七:半截交换

def reverse_string(content):
    length, content= len(content), list(content)
    for i in range(length // 2):
        content[i], content[length - 1 - i] = content[length - 1 - i], content[i]
    return ''.join(content)

方法八:对位交换

def reverse_string(content):
    length, content= len(content), list(content)
    for i, j in zip(range(length // 2), range(length - 1, length // 2 - 1, -1)):
        content[i], content[j] = content[j], content[i]
    return ''.join(content)

扩展:这些方法其实都是大同小异的,面试的时候能够给出几种有代表性的就足够了。给大家留一个思考题,上面这些方法,哪些做法的性能较好呢?我们之前提到过剖析代码性能的方法,大家可以用这些方法来检验下你给出的答案是否正确。

题目50:按照题目要求写出对应的函数。

要求:列表中有1000000个元素,取值范围是[1000, 10000),设计一个函数找出列表中的重复元素。

def find_dup(items: list):
    dups = [0] * 9000
    for item in items:
        dups[item - 1000] += 1
    for idx, val in enumerate(dups):
        if val > 1:
            yield idx + 1000

2020版Python教程_完全入门_学完达到Python工程师水平
pan.baidu.com/s/1WjZwe-12… 提取码: 9e...

2020ython入门视频全套全开源(最新版)
pan.baidu.com/s/1ptF9rF2a… 提取码: qdh

最新Python爬虫全套视频:
pan.baidu.com/s/1RLof\_AF… 提取码: b..

整理好的基本还是很全的,需要学习资料的伙伴,回复:“Python教程” 即可获取!