1、印象最深的一个项目。

2、Python中list和tuple的区别是什么?

  • 声明方式不同,列表用[]声明,元组用()声明。

  • 列表内的元素是可变的,元组内的元素时不可变的。

  • 注意:

    • 元组中的元素值是不可以修改的!但是可以对元组进行连接组合。

    • 元组中的元素值是不允许删除的!但是可以使用del删除整个元组。

3、Python中的迭代器和生成器分别是什么?

  • 迭代器

    • 迭代器是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象

    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完。迭代器只能往前,不能后退

    • 迭代器的两个基本方法,iter()和next()。

  • 生成器

    • 使用了yield的函数被称为生成器。

    • 生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器运行的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时,从当前位置继续执行。调用一个生成器函数,返回一个迭代器

4、设计模式知道哪些?讲讲单例模式的用处?

  • 无序列表内容
  • 无序列表内容
  • 无序列表内容

5、MySQL和Redis的区别是什么?

  • 数据库类型

    • MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度慢。
    • Redis是非关系型数据库,也是缓存数据库。将数据存储在缓存中,缓存的读取速度块,能够大大的提高运行效率,但是保存时间有限。
  • 数据库作用

    • MySQL作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在I/O操作,如果频繁的访问数据库:第一,会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二,反复的访问数据库也会导致数据库的负载过高

    • Redis数据库是一种缓存型数据库,用于存储使用频繁的数据,这样可以减少访问数据库的次数,提高运行效率

6、MySQL的引擎是什么?

  • InnoDB
    • 该引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。

7、linux显示当前路径的指令是什么?

  • pwd

8、查看资源使用量的指令是什么?

  • top命令

    • 能够实时显示系统中各个进程的资源占用情况。
  • ps命令

    • 用于报告当前系统的进程状态。可以查看**哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。
  • pmap命令

    • 用于报告进程的内存映射关系。
  • free命令

  • 显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区

9、返回家目录的指令是什么?

  • cd ~

10、TCP连接中滑动窗口的作用是什么?

  • 用于进行流量控制,防止接收方来不及接受数据,造成网络丢包和网络拥塞等情况。

11、输入一个url的过程是什么?

  • 浏览器向DNS发出请求,解析该url的ip地址。

  • DNS解析出ip地址后,浏览器和服务器简历TCP连接。

  • 浏览器和服务器之间进行请求和响应等操作。

  • 释放TCP连接。

  • 浏览器将拿到的数据进行渲染,显示界面。

12、DNS和Mac地址有关系吗?

  • 没有关系。

    • DNS是将域名和IP联系起来;而ARP是将IP和MAC联系起来。一个在应用层,一个在网络层。
    • ip地址的目的是为了解决网络与网络之间的通信。而mac地址则是为了解决相邻主机间的通信。

13、ARP欺骗是什么?

  • 背景

    • 两个计算机在同一局域网时,发送方需要知道接收方的MAC地址。如果发送方不知道接收方的MAC地址,就无法发送信息,这时就要询问ARP。ARP会在局域网里向所有计算机广播,找到接收方的MAC地址。
  • 原理

    • 主机之间在传递消息时,发送方得先问ARP找到接收方的MAC地址才能发送。ARP向局域网中的所有主机广播询问接收方的MAC地址。这个询问包含了发送方的IP和MAC地址,黑客如果在这个局域网中,也会收到ARP Request,从而得知发送方的地址。这样,黑客就可以冒充别的主机,进行欺骗活动,截取数据包。

14、写一个生成器函数。

def helper(n):
    i = 0
    while i<n:
        yield i
        i += 1
f = helper(5)
while True:
    try:
        print(next(f))
    except:
        print('over')
        break
  • 输出
0
1
2
3
4
over

15、写一个单例模式。

  • 单例模式的主要目的是确保某一个类只有一个实例存在

  • 使用模块实现单例模式。

    • 因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,会直接加载.pyc文件,而不会再次执行模块代码。因此,我们只需要把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()
  • 将上面代码保存在文件demo.py中,要使用时直接在其他文件中导入此文件中的对象,这个对象即为单例模式的对象
from demo import singleton
  • 使用装饰器实现单例模式
def Singleton(cls):
    _instance = {}
    def _singleton(*ars, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return _singleton

@Singleton
class A(object):
    a = 1
    def __init__(self, x=0):
        self.x = x

a1 = A(2)
a2 = A(3)

16、合并两个有序数组。

def mergeList(arr1, arr2):
    if len(arr1) == 0 and len(arr2) == 0:
        return []
    stack = []
    p1 = 0
    p2 = 0
    while p1<len(arr1) and p2 < len(arr2):
        if arr1[p1] <= arr2[p2]:
            stack.append(arr1[p1])
            p1 += 1

        else:
            stack.append(arr2[p2])
            p2 += 1

    while p1 < len(arr1):
        stack.append(arr1[p1])
        p1 += 1

    while p2 < len(arr2):
        stack.append(arr2[p2])
        p2 += 1

    return stack

if __name__ == '__main__':
    arr1 = [1, 3, 5, 7, 9]
    arr2 = [2, 4, 6, 8, 10]
    result = mergeList(arr1, arr2)
    print(result)

17、最近有什么爱看的书籍?

18、对小米工作环境的看法。

19、为什么选择测开?对自己以后的规划是什么?

20、有什么要问的?

21、Python中的字典怎么获取默认值?

  • setdefault()方法

    • dict.setdefault(key, default=None),如果键不存在于字典中,将会添加键并将值设为默认值。

22、Python中给怎么给列表元素去重?

lis = [1, 2, 2, 2, 3, 4]
lis = set(lis)
lis = list(lis)
print(lis)
  • 输出
[1, 2, 3, 4]

23、TCP拥塞控制的方法有什么?慢开始是怎么工作的?

24、B树和B+树了解吗?