zoukankan      html  css  js  c++  java
  • 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(' '.join([' '.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()这个方法的特点用来保存一个全局变量,
        但是这个全局变量只有在当前线程才能访问。

  • 相关阅读:
    如何输出高精度时间差
    GetThreadTimes获取其它线程cpu时间
    12-Python基础之类与面向对象
    10-Python函数之递归
    09-Python基础之内置函数与匿名函数
    08-Python基础之迭代器与生成器
    07-Python基础之装饰器
    06-Python基础之函数进阶(嵌套,作用域)
    05-Python基础之函数基础
    04-Python基础之文件操作基础
  • 原文地址:https://www.cnblogs.com/wangxingwei/p/11126167.html
Copyright © 2011-2022 走看看