zoukankan      html  css  js  c++  java
  • 面试

    1、简述编译型语言与解释型语言

    2、python解释器的种类以及特点

    #CPython
    
    当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
    
    
    
    #IPython
    
    IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
    
    
    
    #PyPy
    
    PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。
    
    
    
    #Jython
    
    Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
    
    
    
    #IronPython
    
    IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
    
    
    
    在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便!
    View Code

    3、位和字节的关系

    #其中8 bit 就称为一个字节(Byte)
    
    二进制数系统中,位简记为b,也称为比特,每个二进制数字0或1就是一个位(bit)。位是数据存储的最小单位,其中8 bit 就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一个机器周期内可以处理32位二进制数据的计算。
    View Code

    4、列举PEP8规范

    #1.代码排版            
    a.保持每行缩进使用4个空格            注释:不能混用tab和空格,默认会全部转换为空格            
    b.一行的最大长度为79个字符,(文档字符串或注释不超过72个字符)            注释:窗口显示限制,默认换行会打断代码结构            
    c.换行首选括号,再是反斜杠。换行点在操作符后敲回车            
    d.顶层函数与类之间空两行,类方法之间空一行,函数内部不同逻辑段之间空一行     
    
    
    #2.文档排版            
    a.Py2中默认编码ASCII或Latin-1,Py3中默认为UTF-8            
    b.import导入时单独分开导入,from xx import xx,xx 可以多个导入            
    c.导入位于文件的顶部:在模块注释和文档字符后,全局变量和常量前            
    d.导入顺序:标准库 、 相关第三方库 、 本地库/自定义库,之间空一行,并配置相关的__all__说明书            
    e.包导入时:尽量使用绝对路径,移植性和阅读性更高     
    
    
    
    #3.避免多余空格            
    a.各种括号前不加空格            
    b.逗号、分号或冒号前不加空格            
    c.函数调用的参数列表的圆括号的开括号前,text(1)            
    d.索引或切片的方括号的开括号前,list[1]           
    e.在复制或其他语句的运算符周围,不要为了对齐使用多个空格            
    f.算数运算符前后加空格:1 * 3             
    g.不在一个关键字参数或一个缺省参数值的 = 前后加一个空格:def text(real, imag=0)            
    h.通常不推荐使用复合语句(一行多语句)            
    i.if/for/while 块中,执行语句必须另起一行    
    
    
    
    #4.注释            
    不好理解的注释,不如没有注释。            
    如果是一个短语或句子,首字母大写(除标识符),以句号结尾,并且有两个空格            
    使用英语注释,因为不同编码或其他等原因,中文容易出现乱码            
    
    a.块注释:在一段代码前增加,以 # 开头跟一个空格。段落以# 的单行分隔                
    b.行内注释:与语句间隔两个空格,起始于 #和一个空格
    c.文档字符串:对于模块,函数,类和方法进行注释说明,位于def 行之后                
    d.版本注记:有Subversion、CVS、RCS等,在块注释后,其他代码之前,前后一个空行  
    
    
    5.命名风格            
    a.大小写字母和下划线组成            
    b.首字母大写缩进:所有字符用大写,HTTPServerError            
    c.单下划线开始:表示内部使用的方法,不建议修改            
    d.单下划线结束:用于避免与Python关键字或方法冲突            
    e.双下划线开始:定义类中的属性,不能直接通过类名进行调取,而是类方法获取,或者是类名._类名__属性名进行获取,(一般不推荐使用)            
    f.双下划线开始结束:永远不要自定义该类型的方法,用于内部的魔法方法     
    
    
    6.命名规范            
    a.特别注意"l"(小写l)、"I"(大写i)、"1"(数字1)、"0"(数字0),"O"(大写o),不作为单个变量名            
    b.模块名:全小写并简短,可以使用下滑线            
    c.包名:全小写并简短,不建议下滑线            
    d.类名:首字母大写。内部类加上前导下划线            
    e.异常名:沿用类名规则并以"Error"为前缀            
    f.全局变量名:尽量只在模块内有效。实现为__all__或者是前缀一个下划线            
    g.函数名:小写,可用下划线分隔            
    h.方法名和实例变量:下划线分隔的小写字母,私有方法和实例变量前用单下划线            i.常量:在模块级别定义,全大写和下划线分隔            
    j.类的属性有三种作用域public、non-public与subclass API,类似Java中的public、private、protected。non-public属性前,前缀单下划线            
    k.公有属性和保留字冲突时,在属性后加一个下划线,比缩写和拼写好            
    l.如果属性不希望被子类继承时,用双下滑先开头,可以进行避免。但需要注意调取时的命名内容,类名._类名__属性名可以调用,或者是子类出现相同的类名和属性名,会有冲突   m.类的实例方法第一参数为self,类方法第一参数为cls    
    7.编码建议            
    a.编码中考虑其他Python实现效率等问题,比如运算符'+'进行字符串拼接时,在CPython效率高,在Jython中非常低,所以使用.join()的方式            
    b.在于None比较时,使用is优于'==',因为在Python中None是固定内存id,所以直接通过is判断效率更高            
    c.使用复杂比较实现排序时,应用__eq__,__ne__,.....等效率更高,并且可以通过function.total_ordering()提供生成缺少的比较操作方法            
    d.使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception          e.抛出异常使用raise,并且捕获异常时不要单独只有except会捕获SystemExit和KeyboardInterrupt异常,使得难以中断并隐藏其他问题,其后续跟具体的异常类型,以及处理方式
    View Code

    5、301与302的区别

    #301适合永久重定向
        301比较常用的场景是使用域名跳转,比如,我们访问 http://www.baidu.com 会跳转到 https://www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。 
        注意: 301请求是可以缓存的, 即通过看status code,可以发现后面写着from cache。 或者你把你的网页的名称从php修改为了html,这个过程中,也会发生永久重定向。
    
    
    
    #302用来做临时跳转
        比如未登陆的用户访问用户中心重定向到登录页面。访问404页面会重新定向到首页。 
    View Code

    6、PEP8规范

    #1、代码编排
        1.1    缩进,空格不与tap混用
        1.2    每行最大长度为79,
        1.3    类和top-level函数定义之间空两行,类中定义的方法之间空一行,函数内逻辑无关段落之间空一行,其他地方尽量不要空行
        
    
    #2、文档的使用
        2.1    模块内容的顺序:模块说明和dosctring--import--globals&conctans--其他定义
                 其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行
        2.2    不要在一句import中多个库,比如import os,sys 不推荐
    
    
    #3    空格的使用(总体原则,避免不必要的空格)
        3.1    各种右括号前不要加空格
        3.2    逗号,冒号,分毫前不要加空格
        3.3    函数的左括号前不要加空格
        3.4    操作符左右各加一个空格,不要为了对齐增加空格
        3.5    函数的默认参数使用的赋值符左右省略空格
        3.6    if/for/while语句中,即使执行语句只有一句,也必须另起一行
    
    
    #4    注释
        总体原则,错误的注释不如没有注释,所以当一行代码发生变化时,第一件事情就是要修改注释,注释必须使用英文,最好时完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句,如果是短语,可以省略结束符。
        4.1    块注释,在一段代码前增加的注释,在#后加一空格,空行也得有#号
        4.2    行注释,在一句代码后加注释,        但是这种凡是尽量少用
        4.3    避免武威的注释
    
    #5    命名规范
        总体原则,新编代码必须按下面命名风格进行。现有库的编码尽量保持风格
        6.1    尽量单独使用小写字母l,大写字母O等容易混淆的字母
        6.2    模块命名尽量短小,使用全部小写的方式,可以使用下划线
        6.3    包的命名短小,使用全部小写的方式,不可以使用下划线
    View Code

    7、通过代码进行进制间的转换

    #十进制转换为二级制
    def Dec2Bin(dec):       #decimalism 十进制
        temp = []
        result = ''
        while dec:
            quo = dec % 2          #quotient商
            dec = dec // 2
            temp.append(quo)
        while temp:
            result += str(temp.pop())
    
        return result
    print(Dec2Bin(9))
    
    
    #或者直接使用    int('1111',2)      后边的2可换其他进制
    
    
    
    
    #
    View Code

    8、python最大递归深度

    RecursionError: maximum recursion depth exceeded while calling a Python object
    在调用函数是超出了最大递归深度
    
    #系统默认次数是1000
    
    import sys
    print(sys.getrecursionlimit())
    
    >>>1000
    -------------------------------------------
    #可修改
    import sys
    sys.getrecursionlimit(2000)
    
    >>>2000
    View Code

    9、python2,python3的区别

     一、python2  的代码混乱 重复较多 冗余  因为当时来编写的人有C 语言的大牛 和 java的大牛等各种大神 所以里面都含有各种语言的影子
    
                python3  经过龟叔的一个暑假的整理 终于在2018年11月 统一了代码  源码规范 清晰 简单优美。
    
        二、python3  print"内容")
    
               python2 ptint()   或者print '内容'
    
       三、python3 编码:utf-8
    
              python2编码: 默认编码:ascii     解决办法:在首行 #    -*- encoding:utf-8-*-
    
       四、用户交互 input
    
              python2:  raw-input()
    
              python3:input () 
    
    五、python2x  :unicode 默认2个字节表示一个字符  可以在LINUX 编译安装时做调整
    
          python3x:unicode 默认是4个字节表示一个字符
    
    六、python2x  没有nonlocal
    
          python3x   加入的
    
    七 、python3x  新建的包里面的init文件如果你删除该文件  包照样可以被调用
    
            python2x  新建的包如果没有init文件 则包不能够被调用 直接报错
    
    八、python2 中的经典类 遍历方法是以深度优先    新式类是以广度优先
    
          python3 中不存在经典类  所有的类都是新式类  所以都是广度优先
    View Code

    10、机器码与字节码的区别

    机器码是电脑CPU直接读取运行的机器指令,运行速度最快
    字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
    View Code

    11、range和xrange区别

    1.range和xrange都是在循环中使用,输出结果一样。
    2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。
    3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。
    
    #Python 3.x已经去掉xrange,全部用range代替。
    View Code

    12、readline和readlines区别

    f.read() #读取所有内容,光标移动到文件末尾
    f.readline() #读取一行内容,光标移动到第二行首部
    f.readlines() #读取每一行内容,存放于列表中
    
    f.write('1111
    222
    ') #针对文本模式的写,需要自己写换行符
    f.write('1111
    222
    '.encode('utf-8')) #针对b模式的写,需要自己写换行符
    f.writelines(['333
    ','444
    ']) #文件模式
    f.writelines([bytes('333
    ',encoding='utf-8'),'444
    '.encode('utf-8')]) #b模式
    
    #了解
    f.readable() #文件是否可读
    f.writable() #文件是否可读
    f.closed #文件是否关闭
    f.encoding #如果文件打开模式为b,则没有该属性
    f.flush() #立刻将文件内容从内存刷到硬盘
    f.name
    View Code

    13、列举布尔值为False的值

    print("1. ", bool(0))
    print("2. ", bool(-0))
    print("3. ", bool(None))
    print("4. ", bool())
    print("5. ", bool(False))
    print("6. ", bool([]))
    print("7. ", bool(()))
    print("8. ", bool({}))
    print("9. ", bool(0j))
    print("10. ", bool(0.0))
    View Code

    14、*args **kwargs

    分别接收溢出的位置参数,关键字参数
    #分别存于元组,字典中
    View Code

    15、is和==的区别

    is比的是两个对象的id值是否相等,也就是比较两对象是否为同一个实例对象,是否指向同一内存地址
    
    ==比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法
    View Code

    16、一行代码实现九九乘法表

    print('
    '.join([' '.join([f'{y} * {x} = {x * y}' for y in range(1, x+1)]) for x in range(1,10)]))
    View Code

    17、

  • 相关阅读:
    【AtCoder】ARC067 F
    【AtCoder】ARC095 E
    【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
    【CodeForces】961 F. k-substrings 字符串哈希+二分
    【CodeForces】961 G. Partitions 斯特林数
    【BZOJ】2310: ParkII 插头DP
    【BZOJ】2331: [SCOI2011]地板 插头DP
    webpack从0开始---(二)
    webpack从0开始---(一)
    前端基础知识(不应需要思考的知识点)三
  • 原文地址:https://www.cnblogs.com/pdun/p/11097504.html
Copyright © 2011-2022 走看看