zoukankan      html  css  js  c++  java
  • python基础知识的重点面试题

    1、解释型和编译型

    """
    - 编译型(需要编译器,相当于用谷歌翻译):编译型语言执行速度快,不依赖语言环境运行,跨平台差,如C,C++执行速度快,调试麻烦
    
    - 解释型(需要解释器,相当于同声传译):解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行,如python,JAVA执行速度慢,调试方便 
    """
    

    2、python2和python3的区别(重点)

    """
    1、python2有长整型long,python3没有长整型全为int
    2、python3中的input全是str类型,而python2得声明你输入的类型
    3、python2的str本质是8个bit的序列,python3本质是Unicode
    4、python2的默认编码是ascll,python3默认编码是utf-8
    5、python2中没有nonlocal,python3中新增了nonlocal使得非局部变量变得可能
    """
    

    3、实现字符串的反转(重点)

    """
    name='张全蛋'
    name[::-1]
    """
    

    4、文件操作时:xreadlines和readlines的区别?(重点)

    """
    readlines()是把文件的全部内容读到内存,并解析成一个list,单文件的体积很大的时候,需占用很大的内存
    xreadlines()则是直接返回一个iter迭代器,在python2.3之后就不推荐使用这种写法,直接for循环迭代文件对象
    """
    

    5、is和==的区别?(重点)

    """
    is比较的是id(id相同值一定相同)
    ==比较的是值(值相同id不一定相同)
    
    """
    

    6、dict={'a':24, 'g':52, 'i':12, 'k':33},按字典中的value值进行排序(重点)

    """
    sorted(dict.items(), key=lambda x:x[1])
    """
    

    7、什么是可变,不可变类型?()

    """
    可变不可变指的是内存中的值能否被改变
    不可变类型指的是对象所在的内存中的值是不可以被改变的,有数字类型(int、float),字符串,元祖
    可变类型主要有:列表,字典,集合
    """
    

    8、请将list1中的元素按照age由大到小排序(重点)

    """
    list1 = [{'name':'a','age':20}, {'name':'b','age':30}, {'name':'c','age':25}]
    
    sorted(list1,key=lambda x:x['age'],reverse=True)  # reverse默认是false
    """
    

    9、下面代码的输出结果是什么?(重点)

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

    10、写一个列表生成式,产生一个公差为11的等差数列(重点)

    """
    print([x*11 for x in range(10)])
    """
    

    11、给定两个列表,找出相同的元素和不同的元素?

    """
    1. list1 = [1,2,3]
    2. list2 = [3,4,5]
    3. set1 = set(list1)
    4. set2 = set(list2)
    5. print(set1&set2)  # 或者 print(set1.intersection(set2))  交集
    6. print(set1^set2)  # 或者 print(set1.difference(set2)) 差集
    """
    

    12、请写一段python代码实现list去重(重点)

    """
    l1 = ['b','c','d','b','c','a','a']
    l2 = list(set(l1))
    """
    

    如果还想要保持原来的排序

    用list的sort方法

    """
    l1 = ['b','c','d','b','c','a','a']
    l2 = list(set(l1))
    l2.sort(key=l1.index)
    print(l2)
    """
    

    13、下面的这段代码的输出结果是什么?请解释?(重点)

    """
    def extendlist(val, list=[]):
    	list.append(val)
    	return list
    list1 = extendlist(10)
    list2 = extendlist(123, []
    list3 = extendlist('a')
    print("list1 = %s" %list1)
    print("list2 = %s" %list2)
    print("list3 = %s" %list3)  # 其实用的还是第一次默认的那个列表
     # 输出结果:
     list1 = [10, 'a']
     list2 = [123]
     list3 = [10, 'a']
    """
    

    14、有一个list['This', 'is', 'a', 'Boy', '!'],所有的元素都是字符串,对他进行大小写无关的排序

    """
    l1 = ['This','is','a','Boy','!']
    print(sorted(l1))
    """
    

    15、列举字符串,列表,元祖,字典每个常用的5个方法?

    """
    字符串:strip, split, len, index, replace,join,upper,lower...
    列表:append, pop,insert, extend, remove,sort,count...
    元祖:index,count, len, dir,in,
    字典:get,keys,values, pop, items,update,popitem,setdefault
    """
    

    16、什么是反射?以及反射的应用场景?(重点)

    """
    反射指的是可以通过字符串对对象的属性或方法进行操作
    -hasattr:通过字符串判断对象的属性或方法是否存在
    -getattr:通过字符串获取对象的属性或方法
    -setattr:通过字符串设置对象的属性或方法
    -delattr:通过字符串删除对象的属性或方法
    
    应用场景:
    反射在很多框架中都被大量使用,比如django的高级文件配置,以及flask的源码中
    """
    

    17、python的深浅拷贝?(重点)

    """
    copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
    
    deepcopy():深copy,深拷贝指拷贝数据集合的所有层
    """
    

    18、python垃圾回收机制(GC)(重点)

    """
    1)引用计数
    	当一个对象的引用被创建或者复制时,对象的引用计数加一
    	当一个对象的引用被销毁时,对象的引用计数减一
    	当对象的引用计数减少为0时,就意味着对象没有被任何人引用,就可以将所占用的内存释放了
    优点:简单直观,实时性:没有引用就释放资源
    缺点:循环引用时,无法回收,也正是因为这个原因才需要通过标记清除,分代回收来辅助引用计数
    
    2)标记清除
    	标记清除是一种基于追踪回收技术实现的一种垃圾回收的算法,该算法分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二个阶段:就是把那些没有别标记的非活动对象进行回收
    	活动对象:对象之间通过引用连在一起,构成一个有向的图,对象构成这个图的节点,引用关系构成这个图的边。从根节点出发,沿着有向边遍历对象,可达的对象称之为活动对象
    	非活动对象:对象之间通过引用连在一起,构成一个有向的图,对象构成这个图的节点,引用关系构成这个图的边。从根节点出发,沿着有向边遍历对象,不可达的对象称之为非活动对象
    优点:解决循环引用
    缺点:清除非活动对象前,必须先扫描整个内存,哪怕只剩下小部分的活动对象也要扫描所有的对象
    
    3)分代回收
    	将系统中的所有内存根据其存活时间的不同划分为不同的集合
    	每一个集合就是一个“代”,垃圾的收集频率会随着代的存活时间而减少,活的时间越长的对象,就越不可能是垃圾
    	
    """
    

    19、*args和**kwargs

    """
    *args是用来接收所有的溢出的位置参数,将接收的参数组织成元祖
    **kwargs是用来接收所有的溢出的关键字参数,将接收的参数组织成字典
    """
    

    20、enumerate的作用(重点)

    """
    enumerate函数是将一个可迭代对象中的每一个元素,在每一个元素的前面给它增加一个索引值,将其组成一个索引序列,利用它就可以同时获取索引以及索引对应的值,这样做的目的就是为了便于操作
    """
    

    21、列表推导式(重点)

    """
    [i for i in range(10)]  列表推导式是用[]表示,得到的是一个新的列表
    (i for i in range(10))  生成器表达式使用()表示,得到的是一个生成器对象,可通过list 将其打印出来
    """
    

    22、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
    
    
    map: 映射
        map(函数地址, 可迭代对象) ---> map对象
        map会将可迭代对象中的每一个值进行修改,然后映射一个map对象中,
        可以再将map对象转换成列表/元组。(以第一次要转的类型为主)
        注意: 只能转一次。
    
    reduce: 合并
        reduce(函数地址, 可迭代对象, 初始值默认为0)
        reduce(函数地址, 可迭代对象, 初始值)
    
    filter: 过滤
        filter(函数地址, 可迭代对象) --> filter 对象
    """
    

    23、什么是闭包?(重点)

    """
    闭包函数指的是定义在一个函数内部的函数,被外层函数包裹着,其特点是可以引用外层函数的名字,列如下面的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 
    """
    

    24、请写一个装饰器,限制该函数被调用的频率如10秒一次(重点)

    """
    import time
    def time_wrapper(func):
    	
    	def inner(*args, **kwargs):
    		for line in range(10):
    			print(line+1)
    			time.sleep(1)
    		res = func(*args,**kwargs)
    		
    		return res
    	return inner
    
    @time_wrapper
    def func1():
    	print('from func1...')
    
    func1()
    """
    

    25、生成器迭代器的区别(重要)

    """
    生成器:但凡在函数内部调用了yield关键字,在调用函数的时候,函数体代码是不会执行的,会返回一个结果,该结果就是一个生成器,生成器的本质其实也是一个迭代器
    
    迭代器:要想知道什么是迭代器以及迭代器对象,我们得先知道什么是可迭代对象;
    	可迭代对象:在python中内置有__iter__方法的都是可迭代对象
    	迭代器对象: 执行该方法会得到一个返回值,该返回值就是迭代器对象
    				有两个方法__next__,__iter__,所以说迭代器对象一定是可迭代对象,反过来不行
    	迭代器: 迭代取值的工具
    
    装饰器:装饰器必须遵循开放封闭的原则
    	开放:对函数功能的添加是开放的
    	封闭:对函数功能的修改是封闭的
    装饰器的作用:在不修改被装饰对象源代码以及调用方式的情况下,添加新的功能
    """
    

    26、请把以下函数转化成python的lambda匿名函数

    """
    def add(x,y):
    	return x+y
    	
    # 答:
    print(lambda x,y: x+y)
    """
    

    27、日志加装饰器(待考察)

    """
    
    """
    

    28、谈谈你对闭包的理解

    """
    闭包是一个函数式编程的一个重要的语法结构。当一个内嵌函数引用其外部的作用域的变量,我们就会得到一个闭包
    创建闭包必须满足一下几点:
    	- 必须有一个内嵌函数
    	- 内嵌函数必须引用外部函数的变量
    	- 外部函数的返回值必须是内嵌函数
    """
    

    29、python函数调用的时候参数传递到底是值传递还是引用传递

    """
    函数的传递到底是值传递还是引用传递要分情况:
    	不可变的参数用值传递:像整数和字符串
    	可变参数是引用传递:像列表字典这些对象是引用传递的
    """
    

    30、为什么函数名可以当做参数用?

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

    31、递归函数的停止条件

    """
    递归的终止条件一般定义在递归函数的内部
    1、判断递归的次数是否达到某一个限定值
    2、判断运算的结果是否达到某个范围
    """
    
  • 相关阅读:
    python打包成exe可执行文件(pyinstaller)
    pandas入门:pandas的数据结构介绍
    NumPy基础:范例-随机漫步
    NumPy基础:随机数生成
    NumPy基础:线性代数
    NOIP2018总结
    luogu P2327 [SCOI2005]扫雷
    luogu P3197 [HNOI2008]越狱
    luogu P1578 奶牛浴场
    luogu P1003 铺地毯
  • 原文地址:https://www.cnblogs.com/yafeng666/p/12608152.html
Copyright © 2011-2022 走看看