【面试】python常见问题

系统 1601 0
  1. python2和python3的区别
  2. fun(*args,**kwargs)中的*args,**kwargs什么意思?
  3. 谈下python的GIL
  4. 列出5个python标准库
  5. 一句话解释什么样的语言能够使用装饰器
  6. python的内建数据类型有哪些
  7. 简述_ _init_ _
  8. _ _new_ _和_ _init的区别
  9. 简述with方法打开处理文件
  10. 列出python中可变数据类型和不可变数据类型
  11. 装饰器
  12. python为什么不需要编译,你是怎么理解python解释器的
  13. 你写代码的时候会考虑对代码进行优化吗
  14. python生成器与迭代器
  15. python的优劣(为什么会慢)
  16. 讲讲hash,python的dict用的是哪种方法解决冲突
  17. python闭包
  18. lambda表达式写一下,随便写一个,它的好处
  19. 条件表达式写一个(三元表达式)
  20. python里深拷贝和浅拷贝说一下
  21. python里多线程和多进程说一下
  22. python中如何实现多线程
  23. 进程和线程
  24. python的反射和自省
  25. 单引号、双引号和三引号的区别
  26. str的常用方法
  27. python导入文件,都用过哪些导入方式
  28. python的依赖用过吗,多线程呢,继承呢,多态呢
  29. 解释继承
  30. 解释python中的help()和dir()
  31. 一大段字符串,单词以空格隔开,统计每一个单词的词频
  32. 什么是猴子补丁
  33. isinstance()和type()区别
  34. 大数据的文件读取
  35. find和grep
  36. python中的异常处理
  37. 什么是断言?应用场景
  38. 列举python中的五个异常类型及其含义
  39. python中变量有单下划线前缀和结尾,双下划线前缀和结尾,区别是什么
  40. sort和sorted的区别
  41. 什么是负索引
  42. python的read()、readline()、readlines()、xreadlines()
  43. 如何随机打乱列表中的元素,要求不引用额外的内存空间

 

以上问题收集于各个面经。

以下答案为个人总结,部分来源于网络,仅供参考。

  1. (1)python2中print是语句,python3中print是函数。python3中print后必须是小括号,python2中print后可以是小括号也可以是空格分隔。    (2)python中使用ASCII编码,python3中使用utf-8编码。    (3)python中为了正常显示中文需要引入coding声明,python3不需要。    (4)python3去掉了long类型,现在只有整形.    (5)python2 range(1,10)返回列表,python3返回迭代器,节约内存。
  2. *args代表 位置参数 ,它会接收任意多个参数并把这些参数作为元组传递给函数。    **kwargs代表的关键字参数,允许使用事先没有定义的参数名,另外,位置参数一定要放在 关键字参数 前面。                                                                               在函数定义中使用  args 和 kwargs 传递可变长参数。  args 用来将参数打包成 tuple 给函数体调用。  kwargs 打包关键字参数成 dict 给函数体调用。
  3. GIL(Global Interpreter Lock)全局解释器锁,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。                                                         利用多进程可以实现同时运行。但是多进程中每个进程都会被系统分配资源,相当于每个进程都有一个python解释器。这样导致系统的资源开销大。

  4. math: 数学运算     re: 正则匹配     datetime: 处理日期时间     os: 提供与操作系统相关联的函数     doctest: 测试相关。

  5. 函数可以作为参数传递的语言,可以使用装饰器。

  6. 整形(int)、布尔型(bool)、字符串(str)、列表(list)、元组(tuple)、字典(dict)。

  7. _ _init_ _是初始化方法,创建对象后,就立刻被默认调用了,可接收函数。

  8. 创建一个新实例时调用_ _new_ _,初始化一个实例用_ _init_ _,这是他们最本质的区别;  new方法会返回所构造的对象,init不会,new函数必须以cls最为第一个参数,而init则以self作为其第一个参数。

  9. 打开文件在读写的时候可能会出现一些异常情况,如果按照常规的f.open写法,我们需要try、expect、finally,做出异常判断,并且文件最终不管遇到什么情况,都要执行finally  f.close()关闭文件,with帮我们实现了finally中的close。

  10. python3的基本数据类型有6种:Num(int、float、bool、complex),string,list,set,dictionary,tuple。其中可变数据类型为:list、dic、set(列字集)。不可变数据类型为:Num、str、tuple(数字元)。

  11. 本质上,装饰器(decorator)就是一个返回函数的高阶函数。它能使函数的功能得到补充,而同时不用修改函数的本身代码。  【作用和功能:引入日志、函数执行时间统计、执行函数前预备处理、执行函数后的清理功能、权限校验等场景、缓存】

  12. 解释器由一个编译器和一个虚拟机组成,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码,所以,解释型语言也有编译过程,只不过这个编译过程并不是直接生成目标代码,而是中间代码(字节码),然后再通过虚拟机来解释执行字节码。同一个代码在下一次执行的时候还要重新逐行解释。

  13. (1)使用直观、贴切的函数和变量名     (2)with关键字     (3)避免导入整个库   (4)使用生成器     

  14. 生成器是一次生成一个值的特殊类型函数。通过列表生成式可以直接创建一个列表。但是,收到内存限制,列表容量有限。

  15. 【python是一个动态的解释型语言,python中的值不是存储在缓存区而是分散的存储在对象中;python写完程序,提交到解释器,解释器会立刻将第一行的代码翻译成机器码,然后提交给CPU去执行,然后进入下一行。所以python比那些编译型的语言执行起来要慢】

  16. hash(散列函数)是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。     python使用散列表来实现dict,在dict的散列表中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对值得引用。因为每个表元的大小一致,所以可以通过偏移量来读取某个表元。

  17. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。     如果在一个内部函数里。对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包。    【闭包作用:装饰器、面向对象、实现单利模式】

  18. lambda x:x*x     lambda表示匿名函数,因为没有函数名字,不必担心函数名冲突。简洁,不用def、return。

  19.  x=1 if x>y else 0

  20. 浅拷贝(copy()):只是对另一个变量内存地址的拷贝,这两个变量只想同一个内存地址。【特点:共用一个值、内存地址一样、其中一个值改变,另一个变量的值也会改变】     深拷贝(deepcopy()):一个变量对另一个变量的值拷贝。【特点:两个变量的内存地址不同、连个变量各有自己的值,互不影响、任意一个改变不会影响另一个】   

    深浅拷贝用法来自copy模块。

    导入模块:import copy

    浅拷贝:copy.copy

    深拷贝:copy.deepcopy

  21. 1、进程就是活着的程序,程序不过是一些文本,运行着的程序就是进程,是系统进行资源调度和分配的基本单位,掌握资源,包括内存等,线程就是轻量级进程,是CPU调度和分派基本单位。     2、由于进程占有资源,压栈和出栈慢,所以切换不灵活,线程不占资源,只占必要的资源(递归要压栈所以有一点资源),所以线程容易通信->在进程分来的内存中直接通信,容易并发->切换灵活,同一进程的线程切换速度很快,因此线程开销小     3、地址空间,进程独立,同一进程的线程共享资源,对其他进程的线程独立

  22. 线程是轻量级的进程,多线程允许一次执行多个线程。众所周知,Python 是一种多线程语言,它有一个多线程包。

    GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU 上。当然,所有传递都会增加执行的开销。

  23. 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个线程(Tread)。                    在Unix/Linux下,可以使用fork()调用实现多进程,要实现跨平台的多进程,可以使用multiprocessing模块。进程间通信通过queue、pipes实现。                             Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。                                                                                                                                         多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。

  24. 反射的作用就是列出对象所有的属性和方法,发射就是告诉我们,这个对象到底是什么,提供什么功能。dir()是一个内置的反射函数,可以列出对象的属性和方法。

  25. 单引号和双引号的普通用法是相同的,单引号和双引号的区别主要体现在用单引号包起来的字符串里包含双引号的时候,不需要转义符,反过来也是一样。     三引号的核心用法主要体现在跨行的字符串上,会包含两个界定符之间所有字符。还有就是三引号可以多行注释。

  26. 0

  27. 0

  28. 0

  29. 一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法)。

    继承使我们可以重用代码,并且还可以更方便地创建和维护代码。Python 支持以下类型的继承:

    1. 单继承- 一个子类类继承自单个基类

    2. 多重继承- 一个子类继承自多个基类

    3. 多级继承- 一个子类继承自一个基类,而基类继承自另一个基类

    4. 分层继承- 多个子类继承自同一个基类

    5. 混合继承- 两种或两种以上继承类型的组合

  30.  

    help()函数返回帮助文档和参数说明     dir()函数返回对象中的所有成员

  31.  

    首先用split()函数以空格为间隔,分离出每一个单词存到列表中,再用自带的count()函数去统计词频,但这样就不是考算法了,所以可以用第二种方法,每次读一个单词与后面的作比较,遇到一样的计数就加一。然后用同样的方式去算其他单词的词频

     

    (人生第一次求职面试,感觉太慌了,感觉一切都靠本能。其实第二种方法很笨,实际应用中根本就不合实际,因为时间复杂度太高,工作中我肯定会用第一种,但第一种调用内置函数看不到你的思路)

    (当我走出面试房间的时候,我就想到了第三种方法,时间复杂度O(n))

    (使用哈希,以单词作为键,每遇到这个单词,以该单词为键的值就加一,只需要遍历一次,就能统计完所有的词频,感觉很遗憾)

  32. 在运行时动态修改类和模块

  33. isinstance()函数用来判断一个对象是否是一个已知类型,类似type()。【区别在于:type()不会认为子类是父类类型,isinstance()会认为是,考虑继承关系】

  34. (1)利用生成器(2)迭代器进行迭代遍历:for line in file

  35. grep命令是一种强大的文本搜索工具,grep搜索内容串可以是正则表达式,允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。

    find通常用来再特定的目录下搜索符合条件的文件,也可以用来搜索特定用户属主的文件。

  36. 用try / except / else 语句来检测try语句块中的错误,从而让except语句捕捉异常信息处理。

  37. python中断言用assert实现,一般在表达式为True的情况下,程序才能通过。

  38. AttributeError 对象没有这个属性

    NotImplementedError 尚未实现的方法

    StopIteration 迭代器没有更多的值

    TypeError 对类型无效的操作

    IndentationError 缩进错误

  39. 变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。“单下划线开头” 的成员变量叫做保护变量,意思是只有类对象和子类对象才能访问到这些变量。

  40. 他俩都可以对列表元素进行排序。不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。sort是应用在list上的方法。sorted可以对所有可迭代的对象进行排序操作。“双下划线开头” 的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

  41. 负索引一般表示的是从后面取元素。

  42. read()会读取整个文件,将读取到底的文件内容放到一个字符串变量,返回str类型。                                                 readline()读取一行内容,放到一个字符串变量,返回str类型。                                                                                   readlines() 读取文件所有内容,按行为单位放到一个列表中,返回list类型。                                                                 xreadlines()返回一个生成器,来循环操作文件的每一行。
  43. random包中的shuffle()函数

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论