面试题-Python基础篇(80题)(待完善)

Python基础篇(80题)

  1. 为什么学习Python?

    1、语言本身简洁,优美,功能超级强大,
    2、跨平台,从桌面应用,web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做
    3、非常火爆的社区
    4、很多有名的大公司堵在用
    
  2. 通过什么途径学习的Python?

    通过参加培训、网上搜索资料进行学习
    
  3. Python和Java、PHP、C、C#、C++等其他语言的对比?

    Python:轻量级、易学、自由/开放源码软件、可移植性、支持面向对象、丰富的库、规范的代码。
    Java:优点:开源性,功能强大,库多
             缺点:编译速度 比较慢,不完全
    PHP:优点:性能很强,配合简单,稳定,容易部署。
             缺点:函数命名不规范,驼峰法和下划线,传参位置不一。
    C:    优点:能操纵底层,能细粒度优化性能。
             缺点:1、是面向过程的,2、运行时类型检查不可用,3、不提供命名空间功能,4、构        
             造函数和析构函数不可用。        
    C#:  优点: 强大的.NET Framework托管代码集合类,较简单的语言特性。WEB应用程序    
             开发速度快。
             缺点:底层和高性能不合适,Windows平台以外支持有限。
    C++: 优点:性能比较高,可进化型。
             缺点: 难学,门槛高!
    
  4. 简述解释型和编译型编程语言?

    解释性语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是在执行的时候才能编译,这样解释型语言每执行一次就要编译一次,效率比较低。
    编译型语言:执行代码之前,有一个专门的编译过程。把源高级程序编译成一个机器语言,只做一个翻译,运行时不需要编译,所以编译型语言执行效率比较高。
    
  5. Python解释器种类以及特点?

    1、Cpython:最常用的官方版本,使用C语言实现。使用最为广泛。
    2、Jpython:Python的Java实现,Jpython会将Python代码动态编译成Java字节码,然后在JVM上运行。
    3、IronPython:Python的C#实现,IronPython将Python代码编译成C#字节码,然后再CLR运行(与Jpython类似)
    4、PYPY(特殊): Python实现的Python,将Python的字节码再编译成机器码。
    
  6. 位和字节的关系?

    1byte等于8bit
    
  7. b、B、KB、MB、GB 的关系?

    1bytes(B) = 8bits(b)字节
    1KB = 1024Bytes = 2的10次方Bytes
    1MB = 1024KB = 2的20次方Bytes
    1GB = 1024MB = 2的30次方Bytes
    
  8. 请至少列举5个 PEP8 规范(越多越好)。

    pep8规范 官方文档:https://www.python.org/dev/peps/pep-0008/
    PEP8中文翻译:http://www.cnblogs.com/ajianbeyourself/p/4377933.html
    
    一、代码编排
    1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格
    2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
    3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
    二、文档编排
    1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
    2 不要在一句import中多个库,比如import os, sys不推荐。
    3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。
    三、空行的使用
    总体原则,避免不必要的空格。
    1 各种右括号前不要加空格。
    2 逗号、冒号、分号前不要加空格。
    3 函数的左括号前不要加空格。如Func(1)。
    4 序列的左括号前不要加空格。如list[2]。
    5 操作符左右各加一个空格,不要为了对齐增加空格。
    6 函数默认参数使用的赋值符左右省略空格。
    7 不要将多句语句写在同一行,尽管使用‘;’允许。
    8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
    四、注释
    总体原则,英文,简明。
    与代码自相矛盾的注释比没注释更差。修改代码时要优先更新注释!
    注释是完整的句子。如果注释是断句,首字母应该大写,除非它是小写字母开头的标识符(永远不要修改标识符的大小写)。
    如果注释很短,可以省略末尾的句号。注释块通常由一个或多个段落组成。段落由完整的句子构成且每个句子应该以点号(后面要有两个空格)结束,并注意断词和空格。
    非英语国家的程序员请用英语书写你的注释,除非你120%确信代码永远不会被不懂你的语言的人阅读。
    注释块通常应用在代码前,并和这些代码有同样的缩进。每行以 '# '(除非它是注释内的缩进文本,注意#后面有空格)。注释块内的段落用仅包含单个 '#' 的行分割。
    慎用行内注释(Inline Comments) 节俭使用行内注释。 行内注释是和语句在同一行,至少用两个空格和语句分开。行内注释不是必需的,重复罗嗦会使人分心。不要这样做:
    五、命名
    总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。
    六 、编码建议
    1 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。
    2 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。
    3 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
    4 异常中不要使用裸露的except,except后跟具体的exceptions。
    5 异常中try的代码尽可能少
    6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查
    7 使用isinstance()比较对象的类型
    8 判断序列空或不空,有如下规则
    9 字符串不要以空格收尾。
    10 二进制数据判断使用 if boolvalue的方式。
    
  9. 通过代码实现如下转换:

    二进制转换成十进制:v = “0b1111011”

    十进制转换成二进制:v = 18

    八进制转换成十进制:v = “011”

    十进制转换成八进制:v = 30

    十六进制转换成十进制:v = “0x12”

    十进制转换成十六进制:v = 87

    二进制转换成十进制:v = “0b1111011”:

    先将V变成字符串,然后print(int("0b1111011",2)),结果是123
    
    

    十进制转换为二进制:v = 18

    Print(bin(v)):0b10010
    
    

    八进制转换为十进制:v = "011"

    Print(int(v,8)) 结果是:9
    
    

    十进制转换成八进制:v = 30

    Print(oct(v))结果是:0o36
    
    

    十六进制转换成十进制:v = ”0x12“

    v = "0x12"
    s = str(v)
    print(int(s,16))
    #18
    
    

    十进制转换成十六禁止:v = 87

    v = 87
    print(hex(v))
    #0x57
    
    
  10. 请编写一个函数实现将IP地址转换成一个整数。

    如 10.3.9.12 转换规则为:
    10 00001010
    
 3 00000011

    9 00001001
    
 12 00001100

    再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?

    def bian(number):
        a = str(bin(number))[2:]
        if len(a) % 8:
            b = ['0' for _ in range(8 - len(a) % 8)]
            b.append(a)
            return ''.join(b)
    
    a = bian(10)
    b = bian(10)
    c = bian(10)
    d = bian(10)
    
    d = int(a + b + c + d, 2)
    print(d)
    #168430090
    
    
  11. python递归的最大层数?

    最大数为998
    
    
  12. 求结果:
    v1 = 1 or 3

    v2 = 1 and 3

    v3 = 0 and 2 and 1
    
 v4 = 0 and 2 or 1
    
 v5 = 0 and 2 or 1 or 4
    
 v6 = 0 or Flase and 1

    答:
    v1 = 1 
    v2 = 3 
    v3 = 0
    v4 = 1
    v5 = 1 
    v6会报错
    
    
  13. ascii、unicode、utf-8、gbk 区别?

    ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。
    
    Unicode能够表示全世界所有的字节
    
    UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码
    
    GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。
    
    
  14. 字节码和机器码的区别?

    机器码
    机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
    通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。
    总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写
    字节码
    字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。
    字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
    总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码
    
    作者:莫辜负自己的一世韶光
    链接:https://www.jianshu.com/p/2b5ec13dbf72
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
    
    
  15. 三元运算规则以及应用场景?

    三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
    
    三元运算符的功能与'if....else'流程语句一致,它在一行中书写,代码非常精炼,执行效率更高
    
    格式:[on_true] if [expression] else [on_false]
    
    res = 值1 if 条件 else 值2
    
    
  16. 列举 Python2和Python3的区别?

    1、print
    
    在python2中,print被视为一个语句而不是一个函数,python3中,print()被视为一个函数
    
    2、整数的除法
    
    在python2中,键入的任何不带小数的数字,将被视为整数的编程类型。比如5/2=2,解决方法:5.0/2.0=2.5
    
    在python3中,整数除法变得更直观 5/2=2.5
    
    3、Unicode
    
    Python 2 默认使用 ASCII 字母表;Python 3 默认使用 Unicode
    
    4、后续发展
    
    Python 2.7 将在 2020 年失去后续的支持,
    
    Python 3 将继续开发更多的功能和修复更多的错误。
    
    
    
  17. 用一行代码实现数值交换:
    
 a = 1
    
 b = 2

    a, b = b, a
    
    
  18. Python3和Python2中 int 和 long的区别?

    int(符号整数):通常被称为是整数或整数,没有小数点的正或负整数;
    
    long(长整数):无限大小的整数,这样写整数和一个大写或小写的L。
    
    
  19. xrange和range的区别?

    range: 函数说明,range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
    
    xrange:函数说明,xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
    
    1、range和xrange都是在循环中使用,输出结果一样。
    2、range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。
    3、xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。
    
    注意:Python 3.x已经去掉xrange,全部用range代替。
    
    
  20. 文件操作时:xreadlines和readlines的区别?

    二者使用时相同,但返回类型不同,xreadlines返回的是一个生成器,readlines返回的是list
    
    
  21. 列举布尔值为False的常见值?

     0 , [ ] , " , ( ) , { }
    
    
  22. 字符串、列表、元组、字典每个常用的5个方法?

    字符串:
    .upper()      #首字母大写
    .lower()       #所有字母大写
    .strip()        #去除首尾空格
    .replace()    #替换
    .split()        #分割
    
    列表:
    .append()    #在列表尾部追加一个值
    .inset()        # 指定位置插入数据
    .reverse()    #反转
    .remove()    #删除制定元素
    .pop()         #删除指定元素
    
    元祖:
    .index()        #查看元素下标是多少
    .len()            #计算元祖元素个数
    .min()           #返回元祖中元素最小值
    .max()          #返回元祖元素最大值
    .tuple()         #将列表转换为元祖
    
    字典:
    .clear()         #删除字典所有项
    .get()           #获取字典中指定键的值
    .keys()         #以列表的形式返回字典中所有键
    .values()       #以列表的形式返回字典中所有值
    .items()        #以列表的形式返回字典中的键值
    
    
  23. lambda表达式格式以及应用场景?

    lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
    
    add = lambda x, y : x+y
    
    print(add(1,2))  # 结果为3
    
    应用在函数式编程中 应用在闭包中
    
    
    
  24. pass的作用?

    1、空语句 do nothing
    2、保证格式完整,保证语义完整
    3、占位语句
    
    
  25. *arg和**kwarg作用

    *args:可以理解为只有一列的表格,长度不固定。
    
    **kwargs:可以理解为字典,长度也不固定。
    
    1、函数调用里的*arg和**kwarg:
    (1) *arg:元组或列表“出现”
    **kwarg:字典“出没”
    (2)分割参数
    2、函数定义时传的*arg /**kwarg:
    (1)接收参数
    
    
  26. is和==的区别

    s:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址
    
    == : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法
    
    
  27. 简述Python的深浅拷贝以及应用场景?

    浅拷贝:copy.copy                       深拷贝:copy.deepcopy
    
    浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层
    
    主要应用在字符串,数字的深浅拷贝
    
    
  28. Python垃圾回收机制?

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通
    过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。通过“分代回收”(generation collection)以空间换取时间来进一步提高垃圾回收的效率。
    
    
  29. Python的可变类型和不可变类型?

    Python的每个对象都分为可变和不可变
           可变:列表、字典   不可变:数字、字符串、元组
    
    
  30. 求结果:
    
 v = dict.fromkeys(['k1','k2'],[])

    v[‘k1’].append(666)
    
 print(v)

    v[‘k1’] = 777
    
 print(v)

    答:
    {'k1': [666], 'k2': [666]}
    {'k1': 777, 'k2': [666]}
    
    
  31. 求结果:

    def  num():
        return [lambda x:i*x for i in range(4)]
    print([ m(2) for m in num()])
    
    答:
        [6, 6, 6, 6]
    
    
  32. 列举常见的内置函数?

    1、abs()    此函数返回数字的绝对值。 
    
    2、all()     此函数用于判断给定的可迭代参数 iterable 中的所有元素是否都不为 0、都不为False 或者iterable都 为空,如果是返回 True,否则返回 False。
    
    3、bin()     返回一个整数 int 或者长整数 long int 的二进制表示。
    
    4、bool()    函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
    
    5、dict()     函数用于创建一个字典。
    
    
    
  33. filter、map、reduce的作用?

    通俗的说.这三者都是用在一堆数据(比如一个列表)上.
    
    map是用同样方法把所有数据都改成别的..字面意思是映射..比如把列表的每个数都换成其平方.
    
    reduce是用某种方法依次把所有数据丢进去最后得到一个结果..字面意思是化简..比如计算一个列表所有数的和的过程,就是维持一个部分和然后依次把每个数加进去.
    
    filter是筛选出其中满足某个条件的那些数据..字面意思是过滤..比如挑出列表中所有奇数
    
    
  34. 一行代码实现9*9乘法表

     print (‘\n‘.join([‘ ‘.join([‘%s*%s=%-2s‘ % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
    
    
  35. 如何安装第三方模块?以及用过哪些第三方模块?

    使用官方推荐的setuptools的包管理工具,easy -- install和pip。
    requests模块
    
    
  36. 至少列举8个常用模块都有那些?

    1、sys:用于提供对解释器相关的访问以及维护,并有很强的交互功能
    2、time: 时间模块
    3、os:用于提供操作系统模块
    4、ashlib:用于加密相关的操作
    5、random:生成随机变量
    6、pickle:用于python特有的类和pthon的数据类型间进行转换
    7、datetime:date和time的结合体
    8、re:正则表达式模块
    
    
  37. re的match和search区别?

    e.match()从开头开始匹配string。
    
    re.search()从anywhere 来匹配string。
    
    
  38. 什么是正则的贪婪匹配?

    贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配
    
    非贪婪匹配:就是匹配到结果就好,就少的匹配字符
    
    默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式
    
    
  39. 求结果:
 a. [ i % 2 for i in range(10) ]
 b. ( i % 2 for i in range(10) )

    1、a = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    2、b = 是生成器表达式(generator)
    
    
  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
    
    
  41. def func(a,b=[]) 这种写法有什么坑?

    因为b是可变类型,每次调用这个方法b不会每次都初始化[].而是调用相同的[].
    
    
  42. 如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?

    a = "1 , 2 ,3"
    
    a. split(",")
    
    
  43. 如何实现[‘1’,’2’,’3’]变成[1,2,3] ?

    a = ["1", "2", "3"]
    b = [int(x) for x in a]
    print(list(map(lambda x: int(x), a)))
    
    
  44. 比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

    1、a和b相同,因为只有一个元素的元祖需要加,来表示(1,)
    2、b1表示的列表元素为整数,b2表示的是列表元素是元祖
    
    
  45. 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

    print([x ** 2 for x in range(1, 11)])
    
    
  46. 一行代码实现删除列表中重复的值 ?

    使用list(set())
    
    
  47. 如何在函数中设置一个全局变量 ?

    Global变量名
    
    
  48. logging模块的作用?以及应用场景?

    可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
    
    print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
    
    
  49. 请用代码简答实现stack 。(栈)

    # Stack():创建一个新的空栈
    class Stack():
        def __init__(self):
            self.items = []
    
        # 判断栈是否为空
        def is_empty(self):
            return self.items == []
    
        # 添加一个新的元素,item到栈顶
        def push(self, item):
            self.items.append(item)
    
        # 弹出栈顶元素
        def pop(self):
            return self.items.pop()
    
        # 返回栈顶元素
        def peek(self):
            return self.items[len(self.items) - 1]
    
        # 返回栈的元素个数
        def size(self):
            return len(self.items)
    
    
  50. 常用字符串格式化哪几种?

    %、format、f
    
    
  51. 简述 生成器、迭代器、可迭代对象 以及应用场景?

    1、生成器是迭代器的一种,需要时yiled关键字
    2、迭代器实现了__next__方法
    3、可迭代对象实现了__iter__,__next__方法
    4、可迭代对象调用__iter__方法后,返回一个迭代器。
    
    
  52. 用Python实现一个二分查找的函数。

    def search(datset, find_num):
        if len(datset) > 1:
            mid = int(len(datset) / 2)
            if datset[mid] == find_num:
                print(datset[mid])
            elif datset[mid] > find_num:
                return search(datset[0: mid], find_num)
            else:
                return search(datset[mid + 1:], find_num)
        else:
            if datset[0] == find_num:
                print(datset[0])
            else:
                print("不好意思,没有这个数字:", find_num)
    
    search(data, 20)
    
    
  53. 谈谈你对闭包的理解?

    内层函数引用了外层函数的变量,然后返回内层函数的情况,成为闭包。
    内部函数包含对外部作用域而非全局作用域的引用
    
    
  54. os和sys模块的作用?

    os:系统有关。
    sys:解释器有关。
    
    
  55. 如何生成一个随机数?

    使用random模块里的random.random。
    
    
  56. 如何使用python删除一个文件?

    os.remove(path),删除文件path。如果path是一个目录,抛出osError错误。如果要删除目录,请使用rmdir()方法。
    
    
  57. 谈谈你对面向对象的理解?

    面向对象的程序设计:核心是对象二字
    体现在三个方面: 封装、继承、多态
    继承有两种方式:
                        1、将同一类的方法封装到类中
                        2、将数据封装到对象中
    继承:子类拥有父类的所有方法和属性,
            好处:抽取重复代码,减少代码冗余。
            坏处:耦合性太强。
    多态:对于不同的类可以有同名的方法,同名的方法应用到不同的类可以有不同行为。
    
    
  58. Python面向对象中的继承有什么特点?

    1、在继承中基类的构造(__init__()方法)不会被调用,它需要在其派生类的构造亲自调用,有别于C#.
    2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量,区别于在类中调用普通函数不需要带上self参数。
    3、Python总是首先查找对应类型的方法,如果它不能再派生类中找到对应的方法,它才开始到基类中逐个查找。
    4、Python里边可以继承多个类,C#、 Java不可以多继承(如果继承多个类,继承顺序为从左到右)
    
    
  59. 面向对象深度优先和广度优先是什么?

    深度优先:不全部保留节点,占用空间小,有回溯操作(即有入栈/出栈操作),运行速度慢。
    广度优先:保留全部节点,占用空间大;无回溯操作(既无入栈、出栈操作)、运行速度快。
    
    
  60. 面向对象中super的作用?

    super()函数是用于调用父类的一个方法。用来解决多重继承问题的。
    
    
  61. 是否使用过functools中的函数?其作用是什么?

    ???

    用过。
    作用:把一个函数的某些参数给固定住,返回一个新的函数,调用这个新函数会更简单。
    
    
  62. 列举面向对象中带爽下划线的特殊方法,如:__new____init__

    __new__:可以调用其它类的构造方法或者直接返回别的对象来作为本类的实例。
    __init__: 负责类的实例化
    __call__:对象后边加括号,出发执行
    __str__:print打印一个对象时。
    __doc__:类的注释,该属性是无法继承的。
    __getattr__:在使用调用属性(方式、属性)不存在的时候触发
    __setattr__:添加/修改属性会触发它的执行
    __dellattr__:删除属性的时候会触发
    __delete__:采用del删除属性时,触发
    
    
  63. 如何判断是函数还是方法?

    函数:是封装了一些独立的功能。可以直接调用,python内置了许多函数,同时可以自建函数来使用。
    方法:和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作。
    
    
  64. 静态方法和类方法区别?

    1、静态方法:相当于普通函数
    2、类方法:通过类调用,第一个参数默认是类本身。
    
    
  65. 列举面向对象中的特殊成员以及应用场景

    __new__ : 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
    __init__ : 负责类的实例化
    __call__对象后边加括号,触发执行
    __str__ : print打印一个对象时。
    __doc__ : 类的注释,该属性是无法继承的。
    __getattr__ : 在使用调用属性(方式,属性)不存在的时候触发
    __setattr__ : 添加/修改属性会触发它的执行
    __dellattr__ : 删除属性的时候会触发
    __delete__ : 采用del删除属性时,触发
    
    
  66. 1、2、3、4、5 能组成多少个互不相同且无重复的三位数

    5*4*3

  67. 什么是反射?以及应用场景?

    通过字符串的形式操作对象相关的属性。实现可插拔机制,动态导入模块(基于反射当前模块成员)
    web框架的CBV配置文件获取类
    
    
  68. metaclass作用?以及应用场景?

    metaclass是类的产生类,而并非继承类,
    通过它来控制类的产生,以及类实例化的操作。Wtform中实例化自定义form类是执行了其元类的__call__方法。
    
    
  69. 用尽量多的方法实现单例模式。

    class Singleton(object):
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
                return cls._instance
    
    # 使用装饰器
    from functools import wraps
    
    def singleton(cls):
        instances = {}
    
        @wraps(cls)
        def getinstance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
                return instances[cls]
    
        return getinstance
    @singleton
    class MyClass(object):
        a = 1
    
    #使用元类
    class Singleton(type):
        _instances = {}
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
                return cls._instances[cls]
    class MyClass(metaclass=Singleton)
        pass
    
    
  70. 装饰器的写法以及应用场景

    from functools import wraps
    
    def outer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            """我就是装饰器里的函数"""
            func(*args, **kwargs)
            return inner
    
    #应用场景:Django的csrf,缓存
    
    
  71. 异常处理写法以及如何主动跑出异常(应用场景)

    try:
        """执行语句"""
    except: #异常类型
        """触发异常后执行的语句"""
    finally:
        """有没有异常都执行的语句"""
    # 主动抛出异常
    raise  #异常类实例
    
    
  72. 什么是面向对象的mro

    https://www.cnblogs.com/aademeng/articles/7262647.html

    方法查找的顺序
    
    
  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,
    
Because nums[0] + nums[1] = 2 + 7 = 9,

    return [0, 1]

    A :
    nums = [2, 7, 11, 15]
    
    class Solution(object):
        def twoSum(self, nums, target):
            """
            :param nums:  list[int]
            :param target:  int
            :return: List[int]
            """
            if len(nums) <= 1:
                return False
            buff_dict = {}
            for i in range(len(nums)):
                if nums[i] in buff_dict:
                    return [buff_dict[nums[i]], i]
                else:
                    buff_dict[target - nums[i]] = i
    B:
    class Solution:
        def twoSum(self,nums,target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            d = {}
            size = 0
            while size < len(nums):
                if target-nums[size] in d:
                    if d[target-nums[size]] <size:
                        return [d[target-nums[size]],size]
                    else:
                        d[nums[size]] = size
                    size = size +1
    solution = Solution()
    list = [2,7,11,15]
    target = 9
    nums = solution.twoSum(list,target)
    print(nums)
    
    
  75. json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?

    #字符串、字典、列表、数字、布尔值、None、、自定义class类
    import json
    import datetime
    
    class MyEncoder(json.JSONEncoder):
        def default(self, o):  # o是数据类型
            if isinstance(o, datetime.datetime)
                return o.strftime('%Y-%m-%d')
            else:
                return super(MyEncoder, self).default(o)
    
    
  76. json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?

    import json
    a=json.dumps({"ddf":"你好"},ensure_ascii=False)
    print(a) #{"ddf": "你好"}
    
    
  77. 什么是断言?应用场景?

    断言条件为真时,代码继续执行,负责抛出异常,这个异常通常不会去捕获他,我们设置一个断言目的就是要求必须实现某个条件。
    
    
  78. 有用过with statement吗?它的好处是什么?

    文件操作时使用过,with语句下代码完成后调用求值语句返回对象的__exit__方法,可以实现一些操作,比如关闭文件。
    
    
  79. 使用代码实现查看列举目录下的所有文件。

    # 递归方法
    def print_directory_contents(sPath):
        import os
        for sChild in os.listdir(sPath):
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)
    
    
  80. 简述 yield和yield from关键字。

    yield 的作用就是把一个函数变成一个生成器,带有yield的函数不再是一个普通的函数
    
    yield from  generator 。实际上就是返回另外一个生成器       
    
    yield from 后面可以跟的式子有“ 生成器  元组 列表等可迭代对象以及range()
    
    
posted @ 2019-06-21 12:07  搞事^o^Boy  阅读(111)  评论(0)    收藏  举报