我会先给出我对精通Python的理解,然后给出一些Python中有难度的知识点。如果大家在看完我这篇回答之前,已经充分理解了我列出的各个知识点,那么,我相信你已经算是精通Python了。如果不能,我希望这篇回答能让你意识到自己Python知识还存在哪些不足,在之后的学习中,从哪些方面去改进。

精通是个伪命题

怎样才算精通Python,这是一个非常有趣的问题。很少有人会说自己精通Python,因为,这年头敢说精通的人都会被人摁在地上摩擦。其次,我们真的不应该纠结于编程语言,而应该专注于领域知识。比如,你可以说你精通数据库,精通分布式,精通机器学习,那都算你厉害。但是,你说你精通Python,这一点都不酷,在业界的认可度也不高。

再者,Python使用范围如此广泛,一个人精力有限,不可能精通所有的领域。就拿Python官网的Python应用领域来说,Python有以下几个方面的应用:Web Programming: Django, Pyramid, Bottle, Tornado, Flask, web2py

GUI Development: wxPython, tkInter, PyGtk, PyGObject, PyQt

Scientific and Numeric: SciPy, Pandas, IPython

Software Development: Buildbot, Trac, Roundup

System Administration: Ansible, Salt, OpenStack

如果有人声称精通上面所有领域,那么,请收下我的膝盖,并且,请收我为徒。既然精通Python是不可能也是没有意义的事情,那么,为什么各个招聘要求里面,都要求精通Python呢?我觉得这都是被逼的。为什么这么说呢,且听我慢慢说来。

为什么招聘要求精通Python

绝大部分人对Python的认识都有偏差,认为Python比较简单。相对于C、C++和Java来说,Python是比较容易学习一些,所以,才会有这么多只是简单地了解了一点语法,就声称自己会Python的工程师。

打个比方,如果一个工程师,要去面试一个C++的岗位,他至少会找一本C++的书认真学习,然后再去应聘。Python则不然,很多同学只花了一点点时间,了解了一下Python的语法,就说自己熟悉Python。这也导致Python的面试官相对于其他方向的面试官,更加容易遇到不合格的求职者,浪费了大家的时间。Python面试官为了不给自己找麻烦,只能提高要求,要求求职者精通Python。

怎样才算精通Python

既然精通Python本身是一件不可能的事情,而面试官又要求精通Python,作为求职者,应该达到怎样的水平,才敢去应聘呢?我的观点是,要求精通Python的岗位都是全职的Python开发,Python是他们的主要使用语言,要想和他们成为同事,你至少需要:

1. 能够写出Pythonic的代码(什么是Pythonic的代码,请看我在另一个问题下的回答:怎样才能写出pythonic的代码? – 知乎用户的回答)

2. 对Python的一些高级特性比较熟悉

3. 对Python的优缺点比较了解

这样说可能比较抽象,不太好理解。我们来看几个例子,如果能够充分理解这里的每一个例子,那么,你完全能够顺利通过”精通Python”的岗位面试。

一.上下文管理器

大家在编程的时候,经常会遇到这样的场景:先执行一些准备操作,然后执行自己的业务逻辑,等业务逻辑完成以后,再执行一些清理操作。

比如,打开文件,处理文件内容,最后关闭文件。又如,当多线程程序需要访问临界资源的时候,线程首先需要获取互斥锁,当执行完成并准备退出临界区的时候,需要释放互斥锁。对于这些情况,Python中提供了上下文管理器(Context Manager)的概念,可以通过上下文管理器来控制代码块执行前的准备动作以及执行后的收尾动作。

我们以处理文件为例来看一下在其他语言中,是如何处理这种情况的。 Java风格/C++风格的Python代码:

Pythonic的代码:

我们这个问题讨论的是精通Python,显然,仅仅是知道上下文管理器是不够的,你还需要知道:

1. 上下文管理器的其他使用场景(如数据库cursor,锁)上下文管理器管理锁上下文管理器管理数据库cursor上下文管理器控制运算精度

2. 上下文管理器可以同时管理多个资源

假设你需要读取一个文件的内容,经过处理以后,写入到另外一个文件中。你能写出Pythonic的代码,所以你使用了上下文管理器,满意地写出了下面这样的代码:

你已经做得很好了,但是,你时刻要记住,你是精通Python的人啊!精通Python的人应该知道,上面这段代码还可以这么写:

3. 在自己的代码中,实现上下文管理协议.

你知道上下文管理器的语法简洁优美,写出来的代码不但短小,而且可读性强。所以,作为精通Python的人,你应该能够轻易地实现上下文管理协议。在Python中,我们就是要自己实现下面两个协议:

二. 装饰器

由于我们这个问题的题目是精通Python,所以,我假设大家已经知道装饰器是什么,并且能够写简单的装饰器。那么,你是否知道,写装饰器也有一些注意事项呢。我们来看一个例子:

我们用装饰器装饰完函数以后,无法正确地获取到原函数的函数名称和帮助信息,为了获取这些信息,我们需要使用@functool.wraps。 如下所示:

再比如,我们要获取被装饰的函数的参数,以进行判断,如下所示:

这段代码看起来没有任何问题,但是,执行将会出错,因为,username是一个位置参数,而不是一个关键字参数,我们在装饰器里面,用kwargs.get("username’)是获取不到username这个变量的。为了保证灵活性,我们可以通过inspect来修改装饰器的代码,如下所示:

装饰器还有很多知识,比如装饰器怎么装饰一个类,装饰器的使用场景,装饰器有哪些缺点,这些,你们都知道吗?感兴趣的同学 可以看我以前的一篇博客(python装饰器入门与提高)

三. 全局变量

关于Python的全局变量,我们先从一个问题开始:Python有没有全局变量?可能你看到这个问题的时候就蒙圈了,没关系,我来解释一下。

从Python自己的角度来说,Python是有全局变量的,所以,Python为我们提供了global关键字,我们能够在函数里面修改全局变量。但是,从C/C++/Java程序员的角度来说,Python是没有全局变量的。因为,Python的全局变量并不是程序级别的(即全局唯一),而是模块级别的。模块就是一个Python文件,是一个独立的、顶层的命名空间。模块内定义的变量,都属于该命名空间下,Python并没有真正的全局变量,变量必然属于某一个模块。

我们来看一个例子,就能够充分理解上面的概念。三种不同的修改全局变量的方法:

这段代码虽然看起来都是在对全局变量操作,其实,还涉及到命名空间和模块的工作原理,如果不能很清楚的知道发生了什么,可能需要补充一下自己的知识了。

四. 时间复杂度

我们都知道,在Python里面list是异构元素的集合,并且能够动态增长或收缩,可以通过索引和切片访问。那么,又有多少人知道,list是一个数组而不是一个链表。

关于数组和链表的知识,我想大家都知道了,这里就不再赘述。如果我们在写代码的过程中,对于自己最常用的数据结构,连它的时间复杂度都不知道,我们又怎么能够写出高效的代码呢。写不出高效的代码,那我们又怎么能够声称自己精通这门编程语言呢。

既然list是一个数组,那么,我们要使用链表的时候,应该使用什么数据结构呢?在写Python代码的时候,如果你需要一个链表,你应该使用标准库collections中的deque, deque是双向链表。标准库里面有一个queue,看起来和deque有点像,它们是什么关系?这个问题留着读者自己回答。

我们再来看一个很实际的例子:有两个目录,每个目录都有大量文件,求两个目录中都有的文件,此时,用Set比List快很多。因为,Set的底层实现是一个hash表,判断一个元素是否存在于某个集合中,List的时间复杂度为O(n),Set的时间复杂度为O(1),所以这里应该使用Set。我们应该非常清楚Python中各个常用数据结构的时间复杂度,并在实际写代码的过程中,充分利用不同数据结构的优势。

五. Python中的else

最后我们来看一个对Python语言优缺点理解的例子,即Python中增加的两个else。相对于C++语言或者Java语言,Python语法中多了两个else。

一个在while循环或for循环中:

另一个在try…except语句中:

那么,哪一个是好的设计,哪一个是不好的设计呢?要回答这个问题,我们先来看一下在大家固有的观念中,else语句起到什么作用。在所有语言中,else都是和if语句一起出现的:

翻译成自然语言就是,如果条件满足,则执行语句1,否则,执行语句2。注意我们前面的用语,是否则,也就是说,else语句在我们固有的观念中,起到的作用是“否则”,是不满足条件的情况下才执行的。

我们来看Python中,while循环后面的else语句。这个else语句是在while语句正常结束的时候执行的。所以,按照语意来说,while循环的else起到的作用是and。也就是说,在Python中,while循环末尾的else换做and才是更加合适的。

你可能觉得我有点钻牛角尖,那好,我再强调一遍,while循环中的else语句是在循环正常结束的时候执行的,那么请问:

1. 如果while循环里面遇到了break语句,else语句会执行吗

2. 如果while循环最后,遇到了continue语句,else语句还会执行吗

3. 如果while循环内部出现异常,else语句还会执行吗

这里的几个问题,大多数人都不能够很快的正确回答出来。而我们的代码是写给人看的,不应该将大多数人排除在能够读懂这段代码之外。所以我认为,Python语言中循环语句末尾的else语句是一个糟糕的设计。

现在,我们再来看try…except语句中的else,这个else设计得特别好,其他语言也应该吸取这个设计。这个设计的语义是,执行try里面的语句,这里面的语句可能会出现异常,如果出现了异常,就执行except里面的语句,如果没有出现异常,就执行else里面的语句,最后,无论是否出现异常,都要执行finally语句。这个设计好就好在,else的语句完全和我们的直观感受是一样的,是在没有出现异常的情况下执行。并且,有else比没有else好,有了else以后,正确地将程序员认为可能出现异常的代码和不可能出现异常的代码分开,这样,更加清楚的表明了是哪一条语句可能会出现异常,更多的暴露了程序员的意图,使得代码维护和修改更加容易。

结论

我这篇文章很长,但是,我相信对很多人都会有帮助。这里想说的是,Python是一门编程语言,使用范围非常广泛,大家不要去追求精通Python程序语言自身,而应该将精力放在自己需要解决的实际问题上。其次,绝大多数人对Python的认识都存在误区,认为Python很简单,只是简单地了解一下就开始写Python代码,写出了一堆很不好维护的代码,我希望这一部分人看到我的回答以后,能够回去重新学习Python。最后,对于一些同学的疑虑——招聘职位要求精通Python,我的回答是,他们并不奢望招到一个精通Python的人,他们只是想招到一个合格的工程师,而大部分的Python工程师,都,不,合,格!

声明:本文系网络转载,版权归原作者所有。如涉及版权,请联系删除!

python工程师证书-一个程序员怎么才算精通python相关推荐

  1. 精通python能干嘛-一个程序员怎样才算精通Python?

    原标题:一个程序员怎样才算精通Python? 作者:赖明星 我会先给出我对精通Python的理解,然后给出一些Python中有难度的知识点.如果大家在看完我这篇回答之前,已经充分理解了我列出的各个知识 ...

  2. 怎样才算精通Python?

    在这篇文章中,我会1)先给出我对精通Python的理解:2)然后给出一些Python中有难度的知识点.如果大家在看完这篇文章之前,已经充分理解了我列出的各个知识点,那么,我相信你已经算是精通Pytho ...

  3. 程序员如何才算真正的高效编程?

    软件工程师为了准备面试,常常需要花费大量时间练习编程问题,同时还需要完善简历.然而,当他们最终拿下创业公司.谷歌.亚马逊或其他公司的工作后,才发现辛辛苦苦积累的技能与日常工作所需的技能完全不是一码事. ...

  4. java c++ python哪个好_程序员学java好还是python语言好 c++又如何

    技术程序员学Java.C++.Python... 分析对比,到底学什么语言吃香,哪种语言最靠谱,如何学好这些语言呢? 几天前,我们在知识上看到这样一个问题:"java,C++,Python, ...

  5. python编程无师自通专业程序员的养成_正版 Python编程无师自通——专业程序员的养成 算机与互联网 编程语言与程序设计 计算机 网络...

    第一部分编程简介 第1章概述3 1.1本书的结构4 1.2从终点出发4 1.3你不是一个人在战斗5 1.4自学的优势5 1.5为什么应该编程5 1.6坚持不懈6 第一部分编程简介 第1章概述3 1.1 ...

  6. python工程师证书-【一个合格的Python工程师需要达到怎样的编程水平】

    如何才算精通Python?在Python学习中,我们都有哪些误区?相信你看完这篇文章都会得到解答. 如果不能,我希望这篇回答能让你意识到自己Python知识还存在哪些不足,在之后的学习中,从哪些方面去 ...

  7. 怎么样才算是精通python?

    前言: 怎样才算精通Python? 我想这是很多小伙伴刚接触python的时候想到的第一个问题 那么今天up就来给带啊讲解一下个人对Python的一些理解 纯属个人意见,不服可划走--> 可说可 ...

  8. 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...

  9. 你为什么选择成为一个程序员,你适合做一个软件开发工程师吗?

    选择一个职业也许有许多理由,那你为什么选择做了一个程序员呢? 作为一个标准的80后老猿,我来说一下自己的亲身体会,也给想入门的小白一个心理评估. 本人开发15余年,随没有太大的建树,但也有自己的些许经 ...

最新文章

  1. 一个小型的网页抓取系统的架构设计
  2. [BZOJ 1124][POI 2008] 枪战 Maf
  3. tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册
  4. zip unzip_zip和unzip上的Java要点
  5. 前端学习(3011):vue+element今日头条管理--关于编辑器代码段
  6. win32开发(定时器)
  7. XZ_iOS iOS13浅色模式/暗黑模式导航栏颜色不自动适配
  8. 发布最新通用挤房器:全能挤房器1.0
  9. BarcodeX(ActiveX打印控件) v5.3.0.80 免费版使用
  10. VS2005远程调试
  11. 去除水印-Teorex Inpaint 序列号
  12. 封装lodash和ramda中常用方法并发布自己的npm包
  13. pr同时对多个视频进行缩放
  14. python 打开文件夹与开启文件的几种方式
  15. 排查oracle数据库服务是否启动
  16. ArcGIS Engine开发教程之图层符号化
  17. 请查收!顶会AAAI 2020录用论文之自然语言处理篇
  18. 运动控制屏蔽回原点屏蔽z_index是什么_安卓智能手表它不香吗,为什么要花 3199 买 Apple Watch?...
  19. 为什么要申报绿色工厂?
  20. 【工业互联网】项天成:实体经济需要智能服务;王洪添:浪潮M81工业互联网平台

热门文章

  1. 使用dstat命令的插件查看mysql的io状态
  2. 洛谷-不高兴的津津(升级版)-数组
  3. MapInfo常见数据格式
  4. 栏目信息开源 免费 java CMS - FreeCMS1.3 标签 infoList
  5. uart与usart区别
  6. 02.规划过程组表格-采购管理计划
  7. 洛谷 2758 编辑距离
  8. 【转】CAD2012打开自动关闭解决方法
  9. 用JAVA操作ClearCase
  10. 软件测试用python一般用来做什么-Python简直是万能的,这5大主要用途你一定要知道!...