python面试题

第一部分 Python基础篇(80题)
4.  解释型语言,程序边运行边解释
    编译型语言,程序会先生成目标文件,通过链接生成可执行文件

5.python解释器总类及特点:
    cpython:C语言开发使用最广
    ipython:基于cpython采用jit技术,对python进行动态编译,提高执效率
    jpython:运行在java上的解释器,直接把py代码编译成java字节码执行

6.位和字节的关系
    8位==1字节

7.b,B,KB,MB,GB
    8b=1B
    1024B=1KB
    1024KB=1MB
    1024MB=1GB

8.请至少列举5个PEP8规范(越多越好)
    1.代码编排缩进,4个空格的缩进,不使用tap,更不能混合使用tap和空格
    2.不要在一句import中引用多个库
    3.尽量避免不必要的空格
    4.逗号,冒号,分号前不加空格
    5.操作符左右更加一个空格
    6.如果采用from xx import xx引用库,可以省略'module.',都可能出现命名冲突,这时要采用import xx

9.通过代码实现进制转换
    #十进制转换成2,8,16进制
    v = 18
    print(bin(v))#十进制转换成二进制
    v = 18
    print(oct(v))#十进制转换成八进制
    v= 18
    print(hex(v))#十进制转18进制

    #2,8,16进制转换成10进制
    v = '0b1111011'
    print(int(v,2))#二进制字符串
    v='011'#八进制
    print(int(v,8))
    v='0x0E'
    print(int(v,16))

10.请编写一个函数实现将IP地址转换成一个整数
    def Change(addr):
        # 取每个数
        id = [int(x) for x in addr.split(".")]
        print(id)
        return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))

    ip = '10.3.9.12'
    print(bin(Change(ip)))

11.python的最大递归层数
    998层

12.求结果
    or  从左到右,有一个真的值,则返回第一个真的值,若所有值都为假,则返回最后一个值
    and 从左到右,有一个假的值,则返回第一个假的值,若所有值均为真,则返回最后一个值
    v1 = 1 or 3                1
    v2 = 1 and 3               3
    v3 = 0 and 2 and 1         0
    v4 = 0 and 2 or 1          1
    v5 = 0 and 2 or 1 or 4     1
    v6 = 0 or Flase and 1      False

13.ascii、unicode、utf-8、gbk区别
    ascii 位字符编码
    gb2312 编码:2字节表示一个汉字,最多表示65535个汉字
    gbk编码是对gb2312的扩展,完全兼容gb2312
    unicode是所有字符的集合
    unt-8是unicode的扩展,字符为1字节,汉字为3字节

14.字节码和机器码的区别
    字节码:与硬件无关,经过编译的,不可阅读,实现方式:编译器和虚拟机
           字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转义后才能成为机器码。
    机器码:电脑cpu直接读取运行的机器指令,运行速度快,比较晦涩难懂

15.三元运算规则及应用场景
   表达式?true:false
   表达式的值如果为真,则为true,否则为false

16.列举py2和py3的区别
    print函数 py2不需要括号,py3需要括号好
    py2中有xrange和range py3中只有xrange => rang:其中rang是个迭代器
    xreadline和readline
    py2中经典类和新式类并不一样,经典类的深度优先继承,新式类是广度优先
    py3中经典类和新式类都是广度优先


17.用一行代码实现数值交换:
   a=10
   b=9
   a,b=b,a
   a,b = b,a

18.python2与py3中的long与int的区别
   py2中的long类型==py3中的int类型

19.xrange与rang的区别:
   py2中 xrange等于py3中的range是个迭代器
   py2中的range是个列表

20.文件操作时:xreadlines和readlines的区别?
   xreadlines是个迭代器
   readlines是个列表,每一行为一个列表元素

21.列举布尔值为False的常见值:
    bool("")
    bool([])
    bool({})
    bool(0)
    bool(-0)

22.字符串、列表、元组、字典每个常用的5个方法
    str.spilt()
    str.join()
    str.replace()
    字符串:str.split()
            str.join()
            str.replace()
            str.upper()
            str.count()
    列表:list.append()
          list.pop()
          list.remove()
          list.index()
          list.extend()#列表拼接
    元组(只能读,不能更改):
    字典:dict.get()
          dict.update()#字典合并
          dict.item()#字典转换成列表
          dict.setdefault()#添加字典,如果存在相同的键值,则不添加

23.lambda(匿名函数)表达格式及应用场景
   calc=lambda x:x*3  lambda x :x*3
   调用calc(3)

24.pass的作用?
   终止本次循环

25.*arg与**kwargs作用
   *arg:多个参数元组
   **kwargs:字典

26 is与==的区别
    变量的三个基本要素:分别是id,type,value
    ==:判断value
    is:判断id

27.简述深浅copy及应用场景
    copy模块
    copy.copy
    copy.deepcopy

    字面:深浅copy对于字符串,数字,仅有一层的字典,列表,元组一样,都只拷贝内存地址
    内存地址的角度:
        深copy对于字符串和数字与浅copy一样
        对于多层字典和列表:
            第一层深浅copy相同,但是对于第二层,深copy会指向对象的值的内存地址,而浅copy则会只指向对象的第二层内存地址

28.python的垃圾回收机制
    python会定时的去搜索没有被指向的变量,进行清除

29.python的可变类型和不可变类型
    python的可变类型为:列表,字典
                        列表与字典中的值可以更改
    python的不可变类型为:数字,字符串,元组
                        数字例如:i=5
                                  i=6
                                  系统不会将5删除,而是指向了6,如果没有其它变量应用5,原有对象就会收回
                                  所有赋值为5的变量同时指向了内存中为5的值的地址
30.求结果:
    v = dict.fromkeys(['k1','k2'],[])
    v["k1"].append(666)
    print(v)
    v["k1"] = 777
    print(v)

    输出:{'k2': [666], 'k1': [666]}
          {'k2': [666], 'k1': 777}
    如果子层中是个列表,则需要注意,append(666)则k2与k1都会被修改
    直接赋值则不会

31.求结果:
    def num():
        return [lambda x:x*i for i in range(4)]
    # [lambda x:x*1, lambda x:x*2, lambda x:x*3, lambda x:x*4]

    print([m(2) for m in num()])

    输出:[6, 6, 6, 6]

32.列举常见的内置函数?
    abs
    sum
    range
    max([])
    min([])
    round(1)#浮点数
    len()
    .....

33.filter、map、reduce的作用?
   list1 = filter(lambda n:n%2==1,range(1,20))
   打印1-20之间的奇数
   list1 = map(lambda n:n%2==1,range(1,20)) # 匹配函数
   打印1-20之间的数据,如果是奇数,为true,如果是偶数,为false

   py3中,reduce内置函数,需要引入模块functools
   from functools import reduce
   reduce 是累加函数
   reduce(lambda x,y:x+y,range(1,20))

34.一行代码实现9*9乘法表(不会)
    print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

35.如何安装第三方模块,用过哪些第三方模块?
   通过pycharm编译器中的file->setting->project->Project interpreter可以下载安装
   通过pip安装

   sqlarchmey,mysql,selecter.....
   restframe_work


36.至少列举8个常用的模块
   re、time、os、sys、json、paramiko、threading、process、Queue、socket、mysql,sqlachme

37.re的match和search区别?
   match()是否以什么开头
   search()匹配所有

38.什么是正则的贪婪匹配?
   str="abcdnsidnc"
   re= "ab*c"
   贪婪匹配结果:"abcdnsidnc"
   非贪婪匹配结果:abc

39.求结果: a. [ i % 2 for i in range(10) ]  b. ( i % 2 for i in range(10) )
    a.   [ i % 2 for i in range(10) ]
    输出:[0,1,0,1,0,1,0,1,0,1]
    b. ( i % 2 for i in range(10) )
    输出:是个迭代器,输出的是迭代器的地址,可以使用for循环函数来打印

40.求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
    a.输出:1
    b.输出:2
    c.输出:False
    d.输出:True
    d.答案分析:
    其他语言if(a>4 and a<10)
    python 4<a<10
    推出===>  1<2 ==2 为  1<2 and 2==2
     ===> True and True
     ===> True

41.def func(a,b=[]) 这种写法有什么坑?
    def func(a,b=[]):
        b.append(a)
        print(b)
    func(1)
    func(1)
    func(1)
    func(1)
    输出:
  [1]
  [1, 1]
  [1, 1, 1]
  [1, 1, 1, 1]
    每次实例化都会使用第一次创建的list表

42.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
    split(',')

43.如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
    [int(i) for i in s]


44.比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
    a 与 b = [(1,),(2,),(3,) ]的区别:
        a是个数字列表,b是个元组列表
    a 与  b = [(1),(2),(3) ] 的区别:
        无区别

45.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
    [x*x for x in range(1,11)]

46.一行代码实现删除列表中重复的值 ?
    list(set([]))
    #集合去重

47.如果在函数中设置一个全局变量
    global

48.logging模块的作用?以及应用场景?
    不知道

49.请用代码简答实现stack
    class Stack(object):
        def __init__(self):
            self.stack = []

        def push(self, value):    # 进栈
            self.stack.append(value)

        def pop(self):  #出栈
            if self.stack:
                self.stack.pop()
            else:
                raise LookupError(‘stack is empty!‘)

        def is_empty(self): # 如果栈为空
            return bool(self.stack)

        def top(self):
            #取出目前stack中最新的元素
            return self.stack[-1]

50.常用字符串格式化哪几种?
    1.最方便
        print("hello %s and %s" %("df","another df"))
    2.最好用
        print("hello %fisrt and %second"%("first":"df","second":"another df"))
    3.最先进
        print("hello {first} and {second}".format(first="df",second="another df"))

51.简述 生成器、迭代器、可迭代对象 以及应用场景?
    可迭代对象:实现了迭代器协议的对象就是可迭代对象
    可迭代对象可以生成迭代器:通过iter()转换成iterator
    生成器生成式子:[x*x for x in range(10)]是个列表
    把[]改成()就可以变成迭代器

52.用python实现一个二分查找
def binary_chop(alist, data):
    """
    非递归解决二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    first = 0
    last = n - 1
    while first <= last:
        mid = (last + first) // 2
        if alist[mid] > data:
            last = mid - 1
        elif alist[mid] < data:
            first = mid + 1
        else:
            return True
    return False

if __name__ == '__main__':
    lis = [2,4, 5, 12, 14, 23]
    if binary_chop(lis, 14):
        print('ok')谈谈你对闭包的理解?
   def binary_chop(alist, data):
    """
    非递归解决二分查找
    :param alist:
    :return:
    """
    n = len(alist)
    first = 0
    last = n - 1
    while first <= last:
        mid = (last + first) // 2
        if alist[mid] > data:
            last = mid - 1
        elif alist[mid] < data:
            first = mid + 1
        else:
            return True
    return False

if __name__ == '__main__':
    lis = [2,4, 5, 12, 14, 23]
    if binary_chop(lis, 14):
        print('ok')

53.谈谈你对闭包的理解
    不懂

54.os和sys模块的作用?
    os主要处理操作系统相关操作
    sys主要处理系统相关操作

55.如何生成一个随机数
    import random
    random.rangrange(1,100)

56.如何使用python删除一个文件?
    if os.file.exist(path):
        os.remove(path)

57.谈谈你对面向对象的理解?
    面向对象有三大特性,封装、继承和多态。

58.Python面向对象中的继承有什么特点
    Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。
    在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#

59.面向对象深度优先和广度优先是什么?
    不懂

60.面向对象中super的作用
   用于调用父类的方法,解决多重继承问题。

61.是否使用过functools中的函数?其作用是什么?
   reduce

62.列举面向对象中带下划线的特殊方法,如:__new__、__init__
    __call__
    __str__
    __add__
    __dic__
    __getitem__

63.如何判断是函数还是方法?
    方法需要通过对象来调用

64.静态方法和类方法区别?
    静态方法不需要传入self参数,类成员方法需要传入代表本类的self参数
    静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量

65.列举面向对象中的特殊成员以及应用场景?
    __doc__描述信息类
    __call__ 对象后面加括号,触发执行
    __dict__ 查看类或对象中的所有成员
    __str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值

66.1、2、3、4、5 能组成多少个互不相同且无重复的三位数
    不懂

67.什么是反射?以及应用场景?
    反射主要根据字符串去寻找类的属性值
    web框架

68.metaclass作用?以及应用场景?
   不懂

69.用尽量多的方法实现单例模式。

70.装饰器的写法以及应用场景。

71.异常处理写法以及如何主动跑出异常(应用场景)

72.什么是面向对象的mro

73.isinstance作用以及应用场景?

74.写代码并实现:
   Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
   have exactly one solution, and you may not use the same element twice.
   Example:
        Given nums = [2, 7, 11, 15], target = 9,json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
        
Because nums[0] + nums[1] = 2 + 7 = 9,


75.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
    (dict、list、string、int、float、long、bool、None)
    import json
    from json import JSONEncoder
    from datetime import datetime
    class ComplexEncoder(JSONEncoder):
    def default(self, obj):
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')
    else:
        return super(ComplexEncoder,self).default(obj)
    d = { 'name':'alex','data':datetime.now()}
    print(json.dumps(d,cls=ComplexEncoder))
    # {"name": "alex", "data": "2018-05-18 19:52:05"}

76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
    import json
    a=json.dumps({"ddf":"你好"},ensure_ascii=False)
    print(a) #{"ddf": "你好"}

77.什么是断言?应用场景?

78.有用过with statement吗?它的好处是什么?

79.使用代码实现查看列举目录下的所有文件。

80.简述 yield和yield from关键字。


第二部分 网络编程和并发(34题)
1.简述osi七层协议
    应用层->表示层->会话层->传输层->网络层->数据链路层->物理层

2.什么是C/S和B/S架构?
    C/S 客户端/服务端架构
    B/S 浏览器/服务器架构

3.简述 三次握手、四次挥手的流程。
    三次握手
    客户端->发送建立链接请求->服务端
    服务端->发送给确认请求->客户端
    客户端->发送数据包->服务端,链接建立

4.什么是arp协议?
    ARP协议,全称“Address Resolution Protocol”,中文名是地址解析协议,
    使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。

5.TCP和UDP的区别
    TCP是由链接的,UDP是无链接的。
    TCP可靠的,要求资源数多
    UDP实时的,要求资源数少

6.什么是局域网和广域网?
    局域网:一个区域内,多台计算机互联组成的
    广域网:连接不同区域局域网或城域网计算机通信的远程网

7.为何基于tcp协议的通信比基于udp协议的通信更可靠?
    因为tcp是由连接的:三次握手双向机制,http使用tcp协议传输的

8.什么是socket?简述基于tcp协议的套接字通信流程。
    socket:Socket是网络上两个程序双向通讯连接的端点。
    通讯流程:
    1.服务器通过socket函数创建一个套接字,用这个套接字完成监听活动。
    2.服务器绑定一个ip和端口
    3.服务器调用listen来监听端口状态,等待客户端链接
    4.客户端通过socket函数创建一个套接字,并设定远端ip和端口。
    5.客户端通过connect函数来连接远端服务器
    6.服务器通过accept函数来接收客户端的连接通讯。
    7.客户端可以通过write函数和read来实现与服务端的数据收发。
    8.服务器可以通过write函数和read来实现与客户端的数据收发。
    9.通讯结束,关闭socket,调用close函数。

9.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
    粘包:多个数据包被连续存储于连续的缓存中
    原因:发送方,往往等待接收到一定的数据后才会发送数据,如果连续几次发送少量数据,
    通过TCP会根据算法把数据合成一包发送,接收方就收到了粘包数据。

    那些情况:
    客户端或者服务端没有设置,响应机制,导致数据粘包。

10.IO多路复用的作用?
   单个线程或者进程就可以同时处理多个网络IO连接。

11.什么是防火墙以及作用?
    将内部网络与公用网络隔离的方法。
    提高内部网络安全,过滤不安全服务。

12.select、poll、epoll 模型的区别?
   select:支持的文件描述符数量太少 => 1024
          在fd数量多的时候,系统开销较大
   poll:与select,描述fd集合方式不同

   eproll:是对select和poll的改进,在为每个fd指定一个回调函数,设备就绪时,
   直接唤醒并将fd加入就绪表。

13.简述 进程、线程、协程的区别 以及应用场景?


16.threading.local的作用?
    threading.local()这个方法的特点用来保存一个全局变量,
    但是这个全局变量只有在当前线程才能访问。

posted @ 2019-07-03 14:24  土味程序员  阅读(325)  评论(0编辑  收藏  举报