Python基础面试题

python基础

  1. 列举你了解的python2和python3的区别

    print#py2不加括号
    
    py2中1/2返回0
    py3中返回0.5
    
    py2默认ASCII编码
    py3默认utf-8编码
    
    py2中unicode类型表示字符串序列,str类型表示字节序列
    py3中str类型表示字符串序列,byte类型表示字节序列
    
    py2中函数用global关键字声明某个变量为全局变量,无法实现在嵌套函数中给一个变量声明为局部变量
    py3新增了nonlocal关键字
    
    
  2. 如何实现字符串的反转?如:name="张全蛋"请反转为name= "蛋全张"

    name = "张全蛋"
    name[::-1]
    
  3. 文件操作时:xreadlines和readlines的区别?

    readlines()把文件的全部内容读到内存,并解析成一个list,当文件的体积很大时要占用很多内存
    
    xreadlines()返回一个iter(file)迭代器,在python2.3之后已经不再推荐使用这种表示方法了,直接使用for循环迭代文件
    
  4. is和==的区别

    is比较的是id,==比较的是值

  5. 现有字典 dict={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典中的 value 值进行排序?

    dic={'a':24,'g':52,'i':12,'k':33}
    a = sorted(dic.items(),key= lambda x:x[1])
    print(dict(a))
    '''
    语法
    
    sorted 语法:
    
    sorted(iterable, cmp=None, key=None, reverse=False)
    参数说明:
    
    iterable -- 可迭代对象。
    cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    返回值
    
    返回重新排序的列表。
    '''
    
  6. 什么是可变类型、不可变类型

    可变不可变指的是内存中的值是否可以被改变。不可变类型指对象所在的内存块里面的值不可以被改变,有数字、字符串、元组;可变类型则是可以被改变的,有列表、字典。

  7. 请按list1中元素的age由大到小排序

    list1 = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
    
    sorted(list1,key=lambda x:x['age'],reverse=True)
    
  8. 下面代码数据的结果是什么?

    list = ['a', 'b', 'c', 'd', 'e']
    print(list[10:])
    
    '''
    下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index
    
    来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。'''
    
  9. 写一个列表生成式,产生一个公差为11的等差数列

a = [i*11 for i in range(10) ]
print(a)
  1. 给定两个列表,怎么找出他们相同的元素和不同的元素?

    1. list1 = [1,2,3]
    2. list2 = [3,4,5]
    3. set1 = set(list1)
    4. set2 = set(list2)
    5. print(set1&set2)
    6. print(set1^set2)
    
  2. 请写出一段Python代码实现删除一个list里面的重复元素?

    1. l1 = ['b','c','d','b','c','a','a']
    2. l2 = list(set(l1))
    

    如果想要保持他们原来的顺序用list类的sort方法:

    1. l1 = ['b','c','d','b','c','a','a']
    2. l2 = list(set(l1))
    3. l2.sort(key=l1.index)#按照索引排个序
    4. print(l2)
    

    还可以用遍历

    1. l1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
    2. l2 = []
    3. for i in l1:
    4. 	if not i in l2:
    5. 		l2.append(i)
    6. print(l2)
    
  3. 有一个list["This","is","a","Boy","!"],所有元素都是字符串,对他进行大小写 无关的排序

    l1 = ['This','is','a','Boy','!']
    print(sorted(l1))
    
  4. 列举字符串、列表、元组、字典每个常用的5个方法?

    字符串:replace、strip、split、rsplit、upper、lower、join、reverse。。。
    
    列表:append、pop、insert、remove、sort、count、index
    
    元组:len、index、count、dir
    
    字典:get、keys、items、pop、values、popitems、clear、update。。。
    
  5. 什么是反射以及应用场景

    在绝大多数语言当中都有反射机制的存在,可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射
    
  6. 简述深拷贝浅拷贝

    copy():浅拷贝指仅仅拷贝数据集合的第一层数据
        
    deepcopy():深拷贝指拷贝数据集合的所有层
    
  7. 1 < (2 == 2)1 < 2 == 2的结果分别是什么, 为什么

print(1 < (2 == 2)) --> False
print(1 < 2 == 2) --> True
```

  1. filter、map、reduce的作用

    # 答案
    filter(func, iterable) : 通过判断函数fun,筛选符合条件的元素。 
    filter(lambda x: x>3, [1,2,3,4,5,6]) 
    >>> <filter object at 0x0000000003813828>
    
    map(func, *iterable) : 将func用于每个iterable对象。 map(lambda a,b: a+b, 
    map(lambda a,b: a+b, [1,2,3,4], [5,6,7])
    >>> [6,8,10]
                           
    reduce(): 函数会对参数序列中元素进行累积。
    reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数                                                
    >>> 15
    
  2. 什么是闭包?

    闭包函数(closure function)指的是定义在一个函数内部的函数,被外层函数包裹着,其特点是可以访问到外层函数中的名字,如inner函数就是一个闭包函数。
    
    def outer():
        num = 1
        def inner():
            print(num) # 内层函数中不存在num 但可以访问到外层的num
        return inner # 基于函数对象的概念我们可以将内层函数返回到外界使用,从而打破函数调用的层级限制,但无论在何处调用,作用域的嵌套关系都是以定义阶段为准的,所以外界得到的不仅仅是一个函数对象(inner),在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,都是访问自己外层包裹的作用域中的名字num
    
    func = outer() # func == inner  func指向的是inner的内存地址,但是func本身确实一个全局变量,可以在任意位置调用func,但无论在何处调用func,都需要按照定义阶段作用域的嵌套关系去查找名字
    
    num=1000
    func() #输出结果:1 
    
    
  3. 请实现一个装饰器,限制该函数被调用的频率,如10秒一次

    import time
    def time_pay(func):
        def inner(*args,**kwargs):
            for line in range(10):
            print(line + 1)
            time.sleep(1)
            res = func(*args,**kwargs)
            return res
        return inner
    
    
  4. 解释生成器与函数的不同,并实现和简单使用generator

    '''
    生成器和函数的主要区别在于函数return a value,生成器yield a value,同时标记或记忆point of the yield以便在下次调用时从标记点恢复执行,yield使函数转换成生成器,而生成器反过来返回迭代器。
    '''
    
  5. 给出下面代码片段的输出

    def say_hi(func):
        def wrapper(*args, **kwargs):
            print("HI")
            ret = func(*args, **kwargs)
            print("BYE")
            return re
        return wrapper
    
    def say_yo(func):
        def wrapper(*args, **kwargs):
            print("YO")
            return func(*args, **kwargs)
        return wrapper
    
    @say_hi
    @say_yo
    def func():
        print("ROCK & ROLL")
    func()
    
    # 答案
    '''
    HI
    YO
    ROCK & ROLL
    BYE
    '''
    
  6. 谈谈你对闭包的理解

    '''闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
    当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点:
    
    必须有一个内嵌函数
    内嵌函数必须引用外部函数中的变量
    外部函数的返回值必须是内嵌函数'''
    
  7. 为什么函数名字可以当参数使用?

    python中一切皆对象,函数名在内存中的空间,也是一个对象。

  8. 递归函数停止的条件?

    递归函数终止的条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身还是return,终止递归。

    终止递归的条件:

    1)判断递归的次数是否达到某一限定值

    2)判断运算的结果是否达到某个范围,根据设计的目的来选择

  9. getattr(object, name[,default]) 函数:

    获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。
    注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后
    面添加括号()。

    1. functiondemo = function_demo()
    2. getattr(functiondemo, 'name') #获取name属性,存在就打印出来--- demo
    3. getattr(functiondemo, "run") #获取run方法,存在打印出 方法的内存地址---<bound method function_demo.run of <__main__.function_demo object at 0x10244f320>>
    4. getattr(functiondemo, "age") #获取不存在的属性,报错如下:
    5. Traceback (most recent call last):
    6.   File "/Users/liuhuiling/Desktop/MT_code/OpAPIDemo/conf/OPCommUtil.py", line 39, in <module>
    7.     res = getattr(functiondemo, "age")
    8. AttributeError: 'function_demo' object has no attribute 'age'
    9. getattr(functiondemo, "age", 18)  #获取不存在的属性,返回一个默认值
    
  10. setattr(object,name,values)函数:

    给对象的属性赋值,若属性不存在,先创建再赋值

    1.class function_demo(object):
    2.    name = 'demo'
    3.    def run(self):
    4.        return "hello function"
    5.functiondemo = function_demo()
    6.res = hasattr(functiondemo, 'age')  # 判断age属性是否存在,False
    7.print(res)
    8.setattr(functiondemo, 'age', 18 )  #对age属性进行赋值,无返回值
    9.res1 = hasattr(functiondemo, 'age') #再次判断属性是否存在,True
    
  11. 综合使用:

    1.class function_demo(object):
    2.    name = 'demo'
    3.    def run(self):
    4.        return "hello function"
    5.functiondemo = function_demo()
    6.res = hasattr(functiondemo, 'addr') # 先判断是否存在if res:
    7.    addr = getattr(functiondemo, 'addr')
    8.    print(addr)else:
    9.    addr = getattr(functiondemo, 'addr', setattr(functiondemo, 'addr', '北京首都'))
    10.    #addr = getattr(functiondemo, 'addr', '美国纽约')
    11.    print(addr)
    
  12. 什么是lambda函数? 有什么好处?

    lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
    1、lambda 函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,
    连名字都很随意的情况下;
    2、匿名函数,一般用来给 filter, map 这样的函数式编程服务;
    3、作为回调函数,传递给某些应用,比如消息处理

  13. 请简述标准库中functools.wraps的作用

    # 答案
    '''
    Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,例如笔者想对flask框架中的一些函数添加自定义的decorator,添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响。
    
    所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
    '''
    
  14. 说说python中装饰器、迭代器的用法;描述下dict的items()方法与iteritems()方法的不同;

    # 答案
    '''
    装饰器是指对函数执行过程,做一些扩展,甚至可以更改本身函数的执行迭代器是指遵循迭代器协议的对象,这类对象在被for循环时,每次迭代生成下一个项,不用一开始就生成整个列表在python3中不存在iteritems,items方法返回可迭代对象在python2中items()返回[(key,value)]的列表对象,iteritems()返回迭代器对象,iteritems()循环时不可以增删dict的内容
    '''
    

设计模型:单例模式、工厂模式

面试的时候原理性的东西,非常重要

posted @ 2020-04-12 11:47  ylpb  阅读(191)  评论(0编辑  收藏  举报