python易错点、面试点汇总,不定期更新

工作之余会总结一些细小的知识点,但又不至于发一篇博客,以后将细小的知识点积累供自己备忘;

主要分为两个模块: python基础知识、Linux知识、python编程题

一 、Python

1.正则中group()、group(0)、group(1)、groups()的区别?.

 

 结论:group取索引是从1开始的,索引group()和group(0)是一样的,group(1)可以取到第一个括号的元素,groups()返回的是所有匹配对象的元组

2.你真的懂GIL吗?

概念:Cpython解释器在同一时刻只允许一个线程执行

问题:本地有两个python文件:a.py中开启5个线程,b.py中开启3个线程,问:同一时刻有几个进程,几个线程??

           首先明确下进程是系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位

           两个python文件相互独立,肯定同一时刻肯定有两个进程,两个进程共开启8个线程,但是每个进程中同一时刻只允许一个线程执行,

           所有a.py中开启了5个线程,但只用一个在执行,,所以两个文件同一时刻有两个进程,两个线程,其余的线程处于挂起状态并不会打断,

           那么python中的多线程真的一点用没有吗,分情况看了,,如果多个线程全都是计算密集型的话python确实有点鸡肋,但如果多个线程有IO操作的话,其中一个               线程处于IO操作时另一个线程就可以运行,所以在IO多线程操作中python线程还时有作用的

3.字典的排序(比较简单,但是容易遗忘)

 

 4. 字典的update()没有返回值

      两个字典合并时可以使用update()方法,但是注意update没有返回值,代码如下:

 

5. 巧用字符串split()的第二个参数

   字符串的split()操作经常使用,但是它有三个参数,第二个参数step可理解为切割几个,看代码:

 

6. 巧用re.split()方法一个拆分多个分隔符

    字符拆分时最先想到的自然是split()方法,,但是字符串的split方法每次只能按一个分隔符拆分,遇到要按多个分隔符拆分的场景可以使用re.split

    re.split()一次可以指定多个分隔符,并且可以指定正则,如下案例可一次指定四种分隔符,其中\s为空格

   

 7. python重写父类的__init__方法

 8. python2与python3的编码和字符

    版本          编码格式      文本字符串        字节序列

    python2     ascii             unicode             str

    python3      utf-8            str                     bytes

  9. 函数的元信息,类似函数的参数和返回值注释,是python3.6之后引入的新特性

    

    其中函数参数冒号后面为参数的类型,指定x和y的参数类型均为int,->为函数返回值的类型,注意不是箭头,是短横线和大于号的拼接;

    虽然自己平时写代码基本不用,但是看大佬的代码中基本都是这样写的;

 10. python函数中单下划线和双下划线的区别

     单个下划线:又称口头私有变量,一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用。其实这并不能完全做到真正的私有,只是约定俗成的而已,不能用from module import * 导入,其他方面和公有一样访问;

     双下划线:这是私有变量, 只有内部可以访问,外部不可以访问。但是也不是一定不可以访问,只是解释器把该变量解释成 _类名__xx 。但最好不要这样做,养成良好编程习惯

     

 11. 使用collection模块快速实现队列和栈

       python实现队列和栈可使用列表创建,其中队列的话添加使用insert(0, "")添加元素用pop删除元素实现先进先出,栈的话使用append添加使用pop删除实现先进后出,但是insert效率太低,下面介绍collection中的deque结构;

      deque其实是 double-ended queue 的缩写,翻译过来就是双向队列,允许两端操作元素,主要操作如下

      append: 从队列右侧添加元素
      appendleft:从队列左侧添加元素
      pop: 从队列右侧移除值
      popleft: 从队列左侧移除值

下面代码可以实现即是队列也是栈的结构体

 

 12. python 实现单例模式的方式

第一种是最主要的使用重写__new__函数实现单例模式,,代码如下:

 

 第二种是使用装饰器实现单例模式,代码如下:

 12. python实现更优雅的日志模块

python内置的日志模块为logger,但是每次使用前需要配置日志输出格式,loguru安装后时间简单,并且日志输出有颜色显示

13. 上下文管理器

任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字,如下类

14. 可迭代对象、迭代器、生成器

可迭代对象(iterable):实现__iter__方法的对象就是一个可迭代对象,通俗理解就是可以用for遍历的对象,例如字符串、列表、元组、字典、集合等;

迭代器(iterable):实现了__iter__和__next__方法的对象就是迭代器,是一个可以记录自身状态的对象,,可以使用__next__获取下一个元素;

 生成器:函数包含yield关键字就是一个生成器或者使用生成器推导式创建的对象就是生成器对象

 

 如上图所示,b是使用生成器推导式创建的生成器,相比与a,b可以更节约内存

15. python的多继承问题,python3的多继承使用广度优先的查找方式,先左右查找再向上查找,可以使用MRO查看类的多继承顺序,

super()主要作用是在多继承中可以调用父类的方法而不是父类名那样调用;

16. python最大递归深度 998,虽然显示是1000,但是递归深度到达998就会报错了

 

 

17. python多线程的调用,使用菜鸟上的代码例子,start()方法会调用myThread的run()方法

 18. python 与 python -m

python -m 是将模块当作脚本运行,主要是改变了调用是sys.path

如下图,python pack2\run.py 会报错显示导报错误

如果使用python -m pack2.run 可以正常运行

如果不使用-m,也可以在run.py导包前使用 sys.path.insert(0, code路径)

所以-m 就是实现了把当前路径添加到sys.path中

 

 19. python进程之间不共享资源,所以进程之间通讯可以采用Queue 或者 Pipe 的方式

Queue 可采用put()添加资源,get()获取资源

 20. ip地址的正则表达式

 21. 打印九九乘法表

 22. python字典键的允许类型:dict在保存的时候根据key来计算一个内存地址,然后将key-value保存在这个地址,,所以

key的取值必须可haxi,即必须为不可变数据类型,不可以是列表、字典、集合

23. python 魔术函数

     __del__ 析构函数,,函数生命周期结束时调用

     __call__ 让类的实例像是被函数一样调用

     __str__   print 打印对象时调用

     __doc__  获取注释信息

    __name__ 获取文件名,如果是当前文件调用则为__main__,如果是其他地方调用则为文件名

 24. @property作用的函数只能由一个self函数,可以像调用类属性一样执行函数

25. python map()与reduce()区别

      map与reduce都接受两个参数,第一个参数为函数名,第二个参数为序列,,但是reduce第一个参数的函数只能接受两个参数

 

 

 二、Linux操作

1. set指令最常用的两个参数意义

   set  -e  若指令传回值不等于0,则立即退出shell;

   set  -x 执行指令后,会先显示该指令及所下的参数

 2. chown修改权限

     chown -R user:group file

     修改file目录下的所有文件为user用户和group组

3. grep遍历目录下查找某个信息

    grep -r pattern path  遍历path目录下的文件,查找path下的文件是否包含pattern信息

    grep -n '^$'  file    查找file文件中空行的行号

4. shell中多行注释

    多行注释有多种方式,其中COMMENT较为简单,使用如下:

    <<"COMMENT"

     需要注释的信息。。。。

   COMMETN

 5. vmstat 查看给定时间间隔服务器状态,主要用于性能监控分析,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数

     vmstat  1  3  一秒输出一次,总共输出三次;

     vmstat  1  一秒输出一次,中间不间断;

     命令显示如下,主要包括cpu使用率,内存及io情况

uptime 也可以显示负载情况,三个负载分别是1分钟,5分钟,15分钟的平均负载

 6. 统计当前目录下python文件的总行数

    find ./ -name "*.py" | xargs cat | wc -l

7. 批量杀死某种进程

   ps -ef | grep xxx | grep -v prep | awk '{print $2}' | xargs kill -9

   或者使用killall -9 xxx  杀死某一类进程

8. 查找某个服务状态

service --state -all | grep xxx

 9. mount/unmount 挂载和卸载的,,类似之前window插入U盘后挂载才可以访问里面的文件,只不过windows自动挂载

10.  sed用来过滤显示前几行信息      ll | sed -n '1,3p'   显示当前文件的前三个

11. 查找当前路径文件最大的前五个

 find . -type f -maxdepth 1 | xargs du | sort -nr | head -5

12.查看端口占用情况

   netstat -tunlp | grep 端口

   lsof -i:端口

 

 

 三、python编程题

1. 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足以下要求:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

例如,"{[{()}]()}"就是一个闭合的有效字符串。

实现思路

这里我们运用  里面 先进后出 的思想来处理问题。

  • 遍历字符串中的每一个括号
  • 定义一个空列表,如果遇到左括号,就存储到列表中
  • 如果遇到右括号,判断列表是否为空,不为空就弹出列表中最后一个左括号,并判断右括号和弹出的左括号是否匹配,不匹配则返回 False
  • 如果遇到右括号,且列表为空,那么也就表示列表中没有匹配的括号,则直接返回 False
  • 遍历结束,最后再判断列表是否为空,不为空则表示左/右括号有多余的,返回 False ; 为空则表示是闭合的有效字符串,返回 True

代码实现如下:

 

 2. 只包含整数的列表,只遍历一次取出第二大的数值,不能使用sort()函数

 3. 两数之和的最优时间复杂度求解----双指针法

两数之和的解法有很多,,最笨的两次遍历判断两数之和是否等于目标值,,时间复杂度为n平方,或者遍历一次再判断目标值减去遍历值是否在原始的数据结构中,时间复杂度为n,最优的解法为双指针,时间复杂度为1,代码如下:

 

 4. 二分法的双指针解法,,二分法的递归遍历时间复杂度为log n,使用双指针的二分法时间复杂度为1,代码如下:

 5.最长回文字符串长度,双指针法

 

 

未完待续~~~~

posted @ 2020-11-11 22:08  skaarl  阅读(354)  评论(0编辑  收藏  举报