笔试面试题实现

1.什么是GIL 【解决】
任何时刻,无论启动多少个线程,CPython解释器只允许一个程序在cpu上执行,Python启动一个线程是调用C语言的接口,让操作系统启动线程,所以所有的线程调度是操作系统在执行,而Python解释器在启动线程后只能等待操作系统返回结果。所以Python解释器为了防止同一时刻多个线程操作同一个数据,造成数据混乱,所以在cpython解释器中,加入了global interpreter lock。

2.Python中的@staticmethod和@classmethod的区别 (**)【解决】
staticmethod: 静态方法,python解释器会将静态方法装饰的函数变为一个普通函数,该函数能被类名调用,实例调用,但是不能访问实例变量和类变量。
classmethod: 类方法,类方法第一个参数cls必须为类名,类本身。该函数能被类名调用,实例调用,能访问类变量,不能访问实例变量。

3.Python里面如何拷贝一个对象,并解析深浅拷贝【解决】
分为可变对象,不可变对象拷贝! 详情参考本文

4.Python里面的search()和match()的区别【解决】
match和search都是re模块下的函数,
match: 从字符串开头开始匹配等于 ^ 或 \A
search: 会搜寻整个字符串,返回匹配到的第一个结果
可参考本文本文:正则表达式

5.简述迭代器生成器以及他们之间的区别【解决】
列表生成式[] 中括号变 () 括号,generator_ = (x for x in range(10)) 和带 yield 的函数称为生成器都是迭代器,列表、tuple、字符串、字典等可以直接作用于for循环的可迭代对象,通过 iter() 方法都可以转变为迭代器。
一句话,生成器一定是迭代器,迭代器不一定是生成器,可参考本文

6.什么是协程,Python中的协程是如何实现的【解决】
协程是为了实现非抢占式任务,而产生的计算机程序组件,协程允许程序在不同的入口点,在不同的位置暂停或开始执行程序,
技术角度来看:协程就是一个你可以暂停执行的函数,像生成器一样。具有上下文管理能力。是程序级别的,归程序员调度,
而线程这样的上下文管理就是操作系统来调度。
python中yield函数可以实现这个功能,greenlet 及封装了greenlet的gevent模块都可以实现协程

7.什么是装饰器,请使用装饰器实现singletion。【解决】
装饰器可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用,为已经存在的对象添加额外的功能
在不改变函数代码、功能结果的前提下,为函数增添某些功能。通过python的闭包及一切皆对象,函数也为对象的特性。将函数对象传入wrapper函数,返回一个装饰后的函数。
可以极大简化代码,不必重复写代码。原理可参考本文
装饰器实现单列点这儿

8.请使用Python实现快速排序【解决C实现】
参考本文已经实现C语言实现,有时间用Python写一个...

9.简述select和epoll的原理和区别【解决】
查看本文当用户进程发起一个read请求时,实际是调用系统接口,让内核去读取数据到内核空间,再copy到用户空间,系统给进程return 一个OK,然后用户进程去取,所以在用户发起请求后socket是阻塞状态,而select和epoll这两个函数,的功能就是,将socket设置为不阻塞后,让操作系统帮忙监控他们所维护的所有socket,只有有socket准备就绪就返回,这两函数通过不断的轮询自己所维护的socket,将准备好的socket返回用户进程。select与epoll的区别就是,select有最大维护链接限制,Linux下一班为1024,可以通过修改宏定义改变,但是太大了依然会影响速度,而epoll没有限制

10.简述Python的垃圾回收机制【解决】
python采用引用计数的方式。来回收不被使用的对象。每隔一段时间检查一次,当对象的引用计数为0是就执行del 析构函数,来释放该内存,到预先申请的内存空间中去,防止内存碎片的产生。

分代回收:存活时间越久的对象,越不可能在后面的程序中变成垃圾。出于信任和效率,对于这样一些“长寿”对象,我们相信它们的用处,所以减少在垃圾回收中扫描它们的频率。Python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。

这两个次数即上面get_threshold()返回的(700, 10, 10)返回的两个10。也就是说,每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收。
详细可参考 垃圾回收机制

11.写一个简单的python socket编程【解决】
参考本文使用的socketserver也差不多

12.简述Python上下文管理器原理,并用上下文管理器实现将“hello world”写入文件的功能。

13.简述MyISAM和InnoDB的特点

14.简述一致性哈希原理和它要解决的问题

15.用python将'123456'反转成'654321'。【解决】
old = [x for x in '123456']
new_str = ''.join(old[::-1]) #--->‘654321’

16.利用python执行shell命令并取得返回结果。【解决】
import os
return os.popen(argv[1]) #---->返回结果的
# os.system( command ) 不返回结果的

17.用python继承process,写一个并行执行任务的类,并写出使用过程。

18.请列出你使用过的HA方案。

19.请列出你了解的Web服务器负载架构。

20.要求:列出一个班出平均分数超过60分的男生女生各占多少位。

表名 Student

字段名 name sex score

21.如何判断一个邮箱是否合法。【解决】
pattern = '[1]\w+@\w+.com$' #标准为以下划线或字母开头
pattern_1 = '^(\w|)\w+@\w+.com$' #数字字母下划线开头都能匹配,如果需要限制长度 '^(\w|)\w+{9,14}@\w+.com$' 长度为9到14
mail = 'lina1994@outlook.com'
if re.match(pattern_1, mail):
print('该邮箱合法')
关于正则表达式参考本文 Python中的正则参考本文

22.请实现一个装饰器,限制该函数被调用的频率,如10秒一次。【解决】
参考原文 装饰器原理参考装饰器原理

import time

def deco_limit(s, foo= None):
    """
    这是个函数装饰器,可以控制访问频率
    :param s: 该参数为访问频率,每多少s一次
    :param foo: 可选参数,用户自定制装饰器逻辑(比如cookie或状态验证等,执行返回值为False则不执行函数)
    :return:
    """
    def wrpper(func):
        """
        该函数接受被修饰函数作为参数,返回装饰器,变量func_identify为变量标识,
        存储被修饰函数的name为key,value为调用成功的时间戳。key-second存储为允许调用时间频率
        :param func: 参数为被修饰函数
        :return:
        """
        name = func.__name__
        func_identify ={name: 0,'foo': foo, 'second': s}
        def inner(*args, **kwargs):
            """
            执行函数
            :param args: 将接收的参数,打包
            :param kwargs:
            :return:
            """
            useable_time = func_identify[name] + func_identify['second'] #上次执行时间,加时间频率
            time_now = time.time()
            if time_now > useable_time:
                func_identify[name] = time_now #设置调用时间
                res = func(*args,**kwargs)
            else:
                remain_time = useable_time - time_now
                print('\033[32;1mFunction \033[31;1m{0} \033[0m'\
                      .format(name)+'\033[32;1mcan be used after {0:.2f} seconds later\033[0m'\
                      .format(remain_time))
                res = None
            return res
        return inner
    return wrpper



@deco_limit(5) #五秒允许调用一次
def foo1(*args, **kwargs):
    """ do something with args and kwargs"""
    print('执行foo1--everything is ok')
    return 'result'

@deco_limit(3) #三秒调用一次
def func1(*args, **kwargs):
    """ do something with args and kwargs"""
    print('执行func1---呱呱呱')
    return 'result'

23.请描述一下,tuple,list,dict,set 的特点。

24.请说一下对迭代器与生成器的理解。【解决】
原理参考这儿

25.请用python实现单例模式,至少两种方式。【解决】
生成器一定是迭代器,迭代器不一定是生成器
点击查看各种姿势实现单列模式

26.就你属性的Web框架,讲一讲如何维持登录状态的。

27.请说一说lambda函数的作用,请使用lambda和reduce实现1到100的累加。(**)

28.用正则实现匹配手机号(包含手机号码前带86和+86的情况)。

29.深浅copy理解【解决】
参考本文深浅copy详解

请问a,b,c,d的值为?

30.现有字典d={'a':26,'g':20,'e':22,'c':24,'d':23,'f':21,'b':25}请按照字段中的value进行排序。

31.解释top命令和vmstat命令。

32.mysql高可用方案有哪些,备份方案有哪些,有什么优缺点?

33.linux基础问题:

  - 怎么查看用户登录日志。

  - linux中的utmp,wtmp,lastlog,message各文件的作用。

  - 列举你属性的服务器性能查看命令。

  - linux服务器间怎么实现无密码登录,列举操作步骤

34.画出TCP三次握手,四次挥手断开示意图。

35.叙述mysql半同步复制原理。

36.有这样一个文本文件,它的路径是baseDir,它的名字是test.txt,要求应with方式进行打开,并打印每一行文本,并要求文件路径考虑跨平台问题。

37.Python是如何进行类型转换的。

38.请写出一段python代码实现删除一个list里面的重复元素。

39.python中类方法,类实例方法,静态方法有何区别?

40.python中pass语句作用是什么?

41.介绍一下python中range()和xrange()函数的用法。

42.用python匹配 HTML Tag 的时候,<.>和<.?>有什么区别?

43.python中 如何拷贝一个对象?

44.如何用python查询和替换一个文本字符串?

45.Django里QuerySet的get和filter方法的区别?

46.简述Django对HTTP请求的执行流程。

47.简述Django下的(内建的)缓存机制。

48.Django中Model的slugFied类型字段有什么用途?

49.Django中如何加载初始数据?

50.python函数中经常有*args和**kwargs这两个参数,它们是什么意思,为什么使用它们?

51.python中变量的作用域,变量的查找顺序。

52.python中如何动态获取和设置对象的属性?

53.描述python中GIL的概念,以及它对python多线程的影响,编写一个多线程抓取网页的程序,并阐述 多线程抓取程序是否比单线程性能有提升,并解释原因。

54.mysql有哪些存储引擎,优化mysql数据库的方法有哪些。

55.Web开发中,session和cookie的作用与区别。

56.Web开发中有哪些技术手段防止SQL注入?

57.编写快速排序或者冒泡排序。

58.解释下HTTP常见的响应状态码。

59.Python是 如何进行内存管理的?

60.介绍一下python的异常处理机制和自己开发过程中的体会。

61.python中怎么有效读取一个20G大小的文件。

62.如何查看占用8080端口的是什么进程?

63.DNS解析过程是怎样的?有几种解析方式?各自的区别是什么?

64.TCP建立连接三次握手,断开连接四次挥手的过程是怎样的?

64.谈谈Django中的中间件。

65.谈谈CSRF原理

66.谈谈RESTful规范

67.谈谈Python中的面向对象

68.谈谈Django中CBV原理

68.谈谈Django REST freamwork

漫动互通,面试题
1python基础数据类型
2lambda表达式
3map,filter,reduce是什么
4写一个排序
5贪婪匹配和非贪婪匹配
6常用的编辑器以及快捷键


  1. A-Za-z_ ↩︎

posted @ 2018-08-26 23:44  G1733  阅读(463)  评论(0编辑  收藏  举报