zoukankan      html  css  js  c++  java
  • 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的内容
      '''
      

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

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

  • 相关阅读:
    [GDKOI2010] 圈地计划(网络流)
    jzoj3454 表白(love)解题报告(01分数规划+DP)
    数论之卢卡斯定理
    POJ1180 Batch Scheduling 解题报告(斜率优化)
    BZOJ 球形空间产生器 解题报告(高斯消元)
    你是怎么封装一个view的
    沙盒目录结构是怎样的?各自用于那些场景?
    这个写法会出什么问题: @property (copy) NSMutableArray *array;
    怎么用 copy 关键字?
    @property后面可以有哪些修饰符?
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12684434.html
Copyright © 2011-2022 走看看