zoukankan      html  css  js  c++  java
  • 面试题总结

    1.如何实现对python列表去重并保持原先顺序?

    l = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
    addr_to = list(set(l))
    addr_to.sort(key = l.index)
    print(addr_to)
    

    2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]

    t1 = (('a'),('b'))
    t2 = (('c'),('d'))
    #print(list(zip(t1,t2)))
    print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
    

    3.请给出二分查找的python示例代码。

    l = [2,3,5,10,15,16,18,22,26]
    #二分法
    def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26]  0,8
        mid = (end+start)//2  
        if start <  end:
            if l[mid] > aim:  
                end = mid -1  #end =6-1 = 5
                return find2(l,aim,start,end)
            elif l[mid] < aim: #15  17
                start = mid + 1  # start = 5
                return find2(l, aim, start, end)
            else:
                return mid
        else:
            return "找不到"
    
    print(find2(l,18,start=0,end = len(l)-1))
    

    4.在python字符串格式化中,% 和 .format的主要区别是什么?

    -%:Python中内置的%操作符可用于格式化字符串操作,控制字符串的呈现格式,%操作符的使用是最方便的
    
    -.format:字符串的format()函数,该方法收集位置参数和关键字参数的任意集合,并使用它们的值来替换字符串中的占位符
    

    5.*args和**kwargs在什么情况下会使用到?请给出使用**kwargs的示例代码

    *args:表示将实参中按照位置传参,把多出来的值给args,且以元组的方式呈现
    def foo(x,*args):
        print(x)
        print(args)
    foo(1,2,3,4,5,6)
    
    打印结果为:
    1
    (2,3,4,5,6)
    
    
    **kwargs:表示形参中按照关键字传参,把多余的传值以字典的方式呈现
    def soo(y,**kwargs):
        print(y)
        print(kwargs)
    soo(1,a=2,b=3,c=4)
    打印结果为:
    1
    {'a':2,'b':3,'c':4}
    

    6.此题是选择题,这里只写出正确答案

    x = "foo"
    y = 2
    print(x*y)
    
    ==========>foofoo
    

    7.

    kvps = {'1':1,'2':2}
    theCopy = kvps
    kvps['1'] = 5
    sum = kvps['1'] + theCopy['1']
    print(sum)
    
    ==========>10
    

    8.(选C)

    sys.path.append('/root/mods')     
    A.改变python的启动路径
    B.改变python目前的工作路径
    C.添加一个新的python模块的搜素路径
    D.从mods中移除所有文件夹
    

    9.选(D)

    country_counter = {}
    def addone(country):
        if country in country_counter:
            country_counter[country] += 1
        else:
            country_counter[country] = 1
    addone('China')
    addone('Japan')
    addone('china')
    print(len(country_counter))
    
    A.0  B.1  C.2  D.3   E.4
    
    ============>  3
    

    10.(选B)

    names1 = ['Amir','Barry','Chales','Dao']
    names2 = names1
    names3 = names1[:]
    names2[0] = 'Alice'
    names3[1] = 'Bob'
    sum = 0
    for ls in (names1,names2,names3):
        if ls[0] == 'Alice':
            sum += 1
        if ls[1] == 'Bob':
            sum += 10
    print(sum)
    
    A.11  B.12  C.21  D.22   E.33
    
    ============>  12
    

    11. 下面程序的输出结果是:24

    d = lambda p : p * 2
    t = lambda p : p * 3
    x = 2
    x = d(x)
    x = t(x)
    x = d(x)
    print(x)
    

    12. 下面程序的输出结果是:yes 

    x = True
    y = False
    z = False
    if x or y and z:
    	print('yes')
    else:
    	print('no')
    

    13.Python里面如何实现tuple和list的转换

    temp_list = [1,2,4,3,5]
    s=tuple(temp_list)
    print(type(s))   #<class 'tuple'>
    
    temp_tupe = (1,2,3)
    l = list(temp_tupe)
    print(type(l))   #<class 'list'>
    

    14.请写出一段Python代码实现删除一个list里面的重复元素

    li = [22,3,4,5,6,77,4,6,8]
    print(set(li))
    

    15.如何得到列表list的交集与差集

    a = [2,3,4,5]
    b = [2,5,8]
    
    #交集 [2, 5]
    print(list(set(a).intersection(set(b))))
    
    #并集 [2, 3, 4, 5, 8]
    print(list(set(a).union(set(b))))
    
    
    #差集 [8]    b中有而a中没有的元素
    print(list(set(b).difference(set(a))))
    

    16.Python中定义函数时如何书写可变参数和关键字参数?

    *args是可变参数,args接收的是一个tuple;
    
    **kw是关键字参数,kw接收的是一个dict。
    
    以及调用函数时如何传入可变参数和关键字参数的语法:
    
    可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
    
    关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
    

    17.什么是lambda表达式?  

    匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突,不过Python对匿名函数的支持有限,<br>只有一些简单的情况下可以使用匿名函数
    

    18.re的match()和search()有什么区别?

    match()函数只检测re是不是在string的开始位置匹配,
    search()会扫描整个string查找匹配;
    
    也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None。
    

    19. 1 or 2 和 1 and 2输出分别是什么?为什么?  

    20.  1<(2==2) 和 1<2 == 2结果分别是什么?为什么?

    print(1<(2==2))  #False
    print(1<2==2)    #True  

     21. [i%2 for i in range(10)]  和  (i % 2 for i in range(10)) 输出结果分别是什么?

    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    <generator object <genexpr> at 0x0000009054A89258>
    

    22.python2 和python3有哪些显著的区别?  

    1.编码:
    py2:默认编码是asscii
    py3:默认采用UTF-8,因此你不再需要在文件顶部写#coding=utf-8了
    
    2.字符串:
    py2:字符串共俩类型,一个是unicode(文本字符串),一个是str(字节序列)
    py3:str表示字符串,byte表示字节序列
    
    3.True和False:
    py2:True和False在py2中是两个全局变量,在数值上分别对应1和0,可以被赋值
    py3:永远是两个关键字,不再允许被重新赋值
    
    4.nonlocal
    py2中函数用关键字global声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的。
    py3中,新增了关键字nonlocal,使得非局部变量成为可能
    

    23.请描述unicode,utf-8,gbk等编码之间的关系

    unicode --->encode---->utf-8
    utf-8 -----decode(gbk)---->unicode
    中间人关系,Unicode是中间人(原始编码),utf-8和gbk是客户。例如,gbk转换为utf8,就需要先将gbk转换为Unicode,然后再编码为utf8编码。
    详细博客链接:http://www.cnblogs.com/shaojiafeng/p/7230853.html

    24.请描述with的用法?如果自己的类需要支持with语句,应该如何书写?

    25.python中如果判断一个对象是否可调用对象?那些对象可以是可调用对象?如何定义一个类,使其对象本身就是可调用对象? 

    通过类型去判断python对象是否可调用,需要同时判断的是函数还是方法,或者类是否实现__call__方法,如果一个类实现了__call__方法,那么其实例也会成为一个可调用对象
    

    26.什么是装饰器?写一个装饰器,可以打印输出方法执行时长的信息。

    装饰器本身是一个python函数,它可以让其他函数在不需要做任何变动的前提下增加额外功能
    
    import time
    
    def timer(func):
        def decor(*args):
    
            start_time = time.time()
            func(*args)
            end_time = time.time()
            d_time = end_time - start_time
            print("run the func use : ", d_time)
        return decor
    
    @timer  #printSth = timer(printSth) -> printSth = decor
    def printSth(str, count):
        for i in range(count):
            print("%d hello,%s!"%(i,str))
    
    printSth("world", 100)
    View Code

    27.什么是进程,线程,协程,说一说python对他们的支持?

    28.def f(a,b=[])这种写法中有什么陷阱?

      

    29.哪些情况下,y! = x - (x-y)会成立?

    x,y是两个不相等的非空集合

    30.用python实现"九九乘法表",用两种不同的方式实现

    No.1(列表生成式,简单粗暴)
    print('
    '.join('  '.join(['{}*{}={}'.format(i,j,i*j) for i in range(1,j+1)])
    for j in range(1,10)))
    
    
    No.2(递归大法好)
    def f(i):
         if i>=1:
            f(i-1)
            print(['%dx%d=%d'%(j,i,i*j) for j in range(1,i+1)])
            
    if __name__=='__main__':
        f(9)
    

    31.如何在Python中拷贝一个对象?并说明它们之间的区别

    -深拷贝:完全拷贝一个副本,容器内部的元素地址都不一样
    -浅拷贝:仅仅复制了容器中元素的地址
    

    32.谈谈你对Python装饰器的理解

    装饰器本身是一个python函数,它可以让其他函数在不需要做任何变动的前提下增加额外功能
    

    33.Python里面match()和search()的区别?(**)

    match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
    
    也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None。
    

    34.获取list的元素个数,和向末尾追加元素所用的方法分别是?

    count() 和 append()
    

    35. 如何判断一个变量是不是字符串?  

    -用type查看它的类型
    
    -用isinstance函数,来判断该对象是不是已知类型,这样将返回True或False
    

    36.xrange 和 range 有什么不同?(**) 

    xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
    xrange 和 range 这两个基本上都是在循环的时候用,
    range会直接生成一个list对象:
    而xrange则不会直接生成一个list,而是每次调用返回其中的一个值
    

    37. is 和 == 的区别?  

    ==是判断两者内容是否相同
    is是判断两者是不是同一个对象 

    38.如何生成[1,4,9,16,25,36,49,64,81,100]?尽量用一行实现

    print([x * x for x in range(1, 11)])
    

     39.生成器是什么?有什么作用?请写一个生成器

    http://www.cnblogs.com/shaojiafeng/p/7274708.html

     40.map(str,[1,2,3,4,5,6,7,8,9])输出什么?

    <map object at 0x000000CD5ADC9390>
    

     41.什么是lambda函数?

    lambda函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
    

     42.请写出一段Python代码实现删除一个list里面的重复元素

    list1 = [11,3,4,5,2,3,4]
    list2 = []
    
    for i in list1:
        if i not in list2:
            list2.append(i)
        else:
            continue
    print(list2)
    

     43.如何用Python删除一个文件

    os.remove('文件') 直接从系统里面删除文件,不经过回收站
    os.rmdir('文件夹') 直接从系统里面删除空文件夹,不经过回收站
    

     44.Python里面如何生成随机数

    import random
    
    print(random.random()) ------------随机生成一个0-1之间的随机小数
    print(random.uniform(10,20))
    print(random.randint(12, 20))
    ....
    

     45.介绍一下except的用法和作用

    Python的except用来捕获所有异常, 因为Python里面的每次错误都会抛出 一个异常,所以每个程序的错误都被当作一个运行时错误。
    
    try:
    pass
    except BaseException as e: print(e) finally: pass

     46.解释生成器(generator)与函数的不同,并实现和使用简单generator

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

     47.输入一个字符串,返回倒序排列的结果:如:'abcdef',返回'fedcba'

    l='abcdef'
    print(l[::-1])
    

     48.请用自己的算法,按升序合并如下两个list,并去除重复的元素:list1 = [2,3,8,4,9,5,6]   ,  list2 = [5,,6,10,17,11,2]

    list1 = [2,3,8,4,9,5,6]
    list2 = [5,,6,10,17,11,2]
    list1.extend(list2)
    print(set(list1))
    

     49.Python中,元组和列表的主要区别是?

    (1)元组是不可变的,列表是可变的
    (2)元组是可以嵌套的
    (3)元组---()   列表---[]
    

    50.有一个数组[3,4,1,2,5,6,6,5,4,3,3]请写一个函数,找出该数组中没有重复的数的总和

    51.从0-99这100个数中随机取出10个,要求不能重复,可以自己设计数据结构

    print([x * x for x in range(1, 11)])
    

    52.Cookie 和 Session 有什么区别?

    -cookie数据存放在客户端的,而session则是存放在服务端的
    

    53.HTTP协议是有状态协议还是无状态协议,如何从两次请求中判断是同一用户

    HTTP是无状态协议。-比如用登录淘宝来举例,客户端访问淘宝,淘宝的服务端会返回给客户端一个“随机字符串”类型的键值对,当下一次再访问的时候,客户端会带着上次的“随机字符串”来和服务器进行验证,如果匹配,则登录成功
    

    54.Python 一行print出1-100偶数的列表

    print([n for n in range(1,101) if n%2 == 0])
    

    55. 1,2,3,4,5 能组成多少个互不相同且无重复数字的三位数(程序实现)  

    d = [1, 2, 3, 4,5]
    
    def getnum(num, digit, length):
        num1 = num
    
        for i in range(len(digit)):
            num = num1 * 10 + digit[i]
            if length == 3:
                yield num
            elif length < 3:
                for j in getnum(num, digit[:i] + digit[i + 1:], length + 1):
                    yield j
    
    digit = list(getnum(0, d, 1))
    print("%r 共可以组成%d个三位数字 " % (d, len(digit)))
    print("它们是:%r" % digit)
    

    56. 写出五中HTTP请求的方法  

    GETPOSTHEADPUTDELETECONNECTOPTIONSTRACE
    GET:请求指定的页面信息,并返回实体主体
    HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。
    PUT:从客户端向服务器传送的数据取代指定的文档的内容
    DELETE:请求服务器删除指定的页面
    CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
    OPTIONS:允许客户端查看服务器的性能
    TRACE:回显服务器收到的请求,主要用于测试或诊断
    

    57.描述多进程开发中 join 与 daemon 的区别?  

    p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 
    
    p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

    58. 斐波契纳数列 1,2,3,5,8,13,21......根据这样的规律,编程求出400万以内最大的斐波契纳数,并求出他是第几个斐波契纳数

    li = [1,2]
    while li[-1] < 4000000:
        li.append(li[-1] + li[-2])
    del li[-1]
    print(li[-1])
    print(len(li))
    

    59. 编程实现以下功能

    dicta = {'a':1,'b':2,'c':3,'d':4,'f':'hello'}

    dictb = {'b':3,'d':5,'e':7,'m':9,'k':'world'}

    要求写一段代码,实现两个字典的相加,不同的key对应的值保留,相同的key对应的值相加后保留,如果是字符串就拼接,最终得到如下结果:
    dictc = {'a':1,'b':5,'c':3,'d':9,'e':7,'m':9,'f':'hello','k':'world'}

    dicta = {'a':1,'b':2,'c':3,'d':4,'f':'hello'}
    dictb = {'b':3,'d':5,'e':7,'m':9,'k':'world'}
    dic = {}
    for key1 in dicta:
        for key2 in dictb:
            if key1 == key2:
                dic[key1] = dicta[key1] + dictb[key2]
    for a in dicta:
        if a not in dic:
            dic[a] = dicta[a]
    for b in dictb:
        if b not in dic:
            dic[b] = dictb[b]
    
    print(dic)
    

    60. Python主要的内置数据类型都有哪些?哪些是可变的?哪些是不可变的?可变类型与不可变类型有什么区别?

    数字,字符串,列表,字典,布尔型
    可变:列表,字典
    不可变:数字,字符串,布尔
    可变数据类型:在id不变的情况下,数据类型的内部可以改变
    不可变数据类型:value值改变,id也跟着改变
    

     61.在python中如何抛出,捕获,处理异常?

    raise Exception 触发抛出异常
    用try和except语句来捕获异常
    处理异常的方法有:
    try ... except...else语句
    finally子句,
    with语句
    

     62.什么是lambda函数?他有什么好处?另外python在函数式编程方面提供了些什么函数和语法?

    lambda函数就是可以接受任意多个参数(包括可选参数)并且返回单个表达式值得函数
    好处:
        1.lambda函数比较轻便,即用即扔,适合完成只在一处使用的简单功能  
        2.匿名函数,一般用来给filter,map这样的函数式编程服务
        3.作为回调函数,传递给某些应用,比如消息处理
    

     63.详细说说tuple,list,dict的用法,它们的特点

    元组tuple:tuple与list类似,但是tuple一旦初始化就不能修改
    列表list:是一种有序的集合,可以随时添加和删除其中的元素
    字典dict:使用键-值(key-value)存储,具有极快的查找速度
    

     64.说说python中装饰器,迭代器的用法,描述下dict的items()方法与iteritems()方法的不同

    装饰器就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能;
    迭代器就是在能调用next()方法的时候返回容器中的下一个值,任何实现__iter__和__next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值。
    
    字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。
    
    字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器
    

     65.python是如何进行内存管理的?python的程序会内存泄漏吗?说说有没有什么方面防止或检测内存泄漏?

    语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、
    面向对象的语言的内存管理方式。

    产生原因

    项目中两种情况导致对象没有被正确回收:

    •     被退出才回收的对象引用
    •     交叉引用

    66.关于python程序的运行性能方面,有什么手段能提升性能?

    1.让关键代码依赖外部包
    2.排序时使用键(key)
    3.优化代码中的循环
    4.使用较新版本的python
  • 相关阅读:
    大小写敏感性
    Select的深入应用(1)
    SQL模式匹配
    返回日期和时间范围
    利用枚举管理事务逻辑
    自动记录数据的改变时间
    操作日期和时间
    关于Rational Functional Tester (RFT)的简单介绍
    html布局 左右固定,中间只适应,三种方法实现
    js混合计算字符串字节长度
  • 原文地址:https://www.cnblogs.com/wanghaohao/p/8386604.html
Copyright © 2011-2022 走看看