Yifeng Liu
,生死去来,棚头傀儡,一线断时,落落磊磊
有幸上过Raymond Hettinger的课
引用下Raymond的大概标准
1.了解主要数据结构, 底层实现,和常用相关优化法.
2.了解class和object在python里怎么实现的(相关metaclass的知识)
3. 熟悉相关库
4. 了解cpython和pypy
5. 一颗谦虚, 谨慎而且好学的心
引用下Raymond的大概标准
1.了解主要数据结构, 底层实现,和常用相关优化法.
2.了解class和object在python里怎么实现的(相关metaclass的知识)
3. 熟悉相关库
4. 了解cpython和pypy
5. 一颗谦虚, 谨慎而且好学的心
更新:
之前在组里分享过, 后端那些事,有兴趣可以看看。
要想精通python,写的代码首先得pythonic,自己闭门造车肯定不行,肯定需要研读牛B的开源代码,在这过程中会遇到python的许多高阶用法
1.装饰器 装饰器在框架中运用的很多,比如flask_login,要精通至少很随意的写出满足需求的装饰器,用装饰器肯定需要functools模块的支持
2.生成器 说道生成器就自然地联系到各种推导式(列表,元祖,字段,集合),那肯定也要提到itertools模块,contextlib标准库中是个典范,说到contextlib就需要提到with协议,迭代器协议,以及标准库中的哪些实现了它们,如文件描述符,线程锁,继续延伸的话需要了解greenlet提供的协程,那就不得不提gevent,eventlet
3.描述符 这你就得知道所有的函数其实都是描述符,property,classmethod,staticmethod都是通过描述符实现的,那就得提到werkzeug和bottle都提供的cached_property,都是访问属性的就得提到
__getattr__和__getattribute__,知道在合适的时候定义合适的方法简化流程
4.元类 其实这玩意用处很大,如sqlalchemy,django的orm中field的定义都用到了它,那你得知道当python解析py时,发现__metaclass__的时候就会调用元类的__new__和__init__,如果你理解元类的__new__和__init__的第一个参数都是类(而不是self)那元类就差不多了
5.多线程 虽说python由于gil的限制不能利用多核,但在处理io密集型的任务还是有很大好处的,
那得知道threading.RLock是线程可重入锁,daemon thread的用处(python执行环境会等待所有非daemon thread的结束),Queue是线程安全的锁,logging是线程安全的日志模块,还有线程池也要熟悉
6.其它 如python2,6/7包含了不少新特性,如abc模块的抽象方法机制,collections提供的有用容器,python中的编码问题,super为啥需要两个参数,而3不需要参数,经典的闭包问题,NotImplemented和NotImplementedError的区别,多继承的mro问题,相对导入原理(__name__,如果看最新开源代码,基本都是相对导入)......
其实还有很多,但更多的是和业务相关,比如正则表达式,那至少得知道贪婪,非贪婪,命名组等。搞服务器开发,socket,twisted,gevent肯定要精通。搞web开发,django,flask,tornado得熟悉。。。。
之前在组里分享过, 后端那些事,有兴趣可以看看。
要想精通python,写的代码首先得pythonic,自己闭门造车肯定不行,肯定需要研读牛B的开源代码,在这过程中会遇到python的许多高阶用法
1.装饰器 装饰器在框架中运用的很多,比如flask_login,要精通至少很随意的写出满足需求的装饰器,用装饰器肯定需要functools模块的支持
2.生成器 说道生成器就自然地联系到各种推导式(列表,元祖,字段,集合),那肯定也要提到itertools模块,contextlib标准库中是个典范,说到contextlib就需要提到with协议,迭代器协议,以及标准库中的哪些实现了它们,如文件描述符,线程锁,继续延伸的话需要了解greenlet提供的协程,那就不得不提gevent,eventlet
3.描述符 这你就得知道所有的函数其实都是描述符,property,classmethod,staticmethod都是通过描述符实现的,那就得提到werkzeug和bottle都提供的cached_property,都是访问属性的就得提到
__getattr__和__getattribute__,知道在合适的时候定义合适的方法简化流程
4.元类 其实这玩意用处很大,如sqlalchemy,django的orm中field的定义都用到了它,那你得知道当python解析py时,发现__metaclass__的时候就会调用元类的__new__和__init__,如果你理解元类的__new__和__init__的第一个参数都是类(而不是self)那元类就差不多了
5.多线程 虽说python由于gil的限制不能利用多核,但在处理io密集型的任务还是有很大好处的,
那得知道threading.RLock是线程可重入锁,daemon thread的用处(python执行环境会等待所有非daemon thread的结束),Queue是线程安全的锁,logging是线程安全的日志模块,还有线程池也要熟悉
6.其它 如python2,6/7包含了不少新特性,如abc模块的抽象方法机制,collections提供的有用容器,python中的编码问题,super为啥需要两个参数,而3不需要参数,经典的闭包问题,NotImplemented和NotImplementedError的区别,多继承的mro问题,相对导入原理(__name__,如果看最新开源代码,基本都是相对导入)......
其实还有很多,但更多的是和业务相关,比如正则表达式,那至少得知道贪婪,非贪婪,命名组等。搞服务器开发,socket,twisted,gevent肯定要精通。搞web开发,django,flask,tornado得熟悉。。。。
你们所说的什么要怎样数据分析、爬虫、Web 等,在我看来那不是精通 Python,而是精通某一领域,抛开 Python 换用另一门语言也可,在我看来,精通 Python 语言大约需要如下这些步骤(个人愚见,不服你奈我何~~~):
------------------------
level 1:了解基本语法
这是最容易的一级,掌握了 Python 的基本语法,可以通过 Python 代码实现常用的需求,不管代码质量怎么样。这部分内容,可以参考: The Python Tutorial。
------------------------
level 2:熟练使用常用的库
------------------------
level 3:Pythonic
这一级别比上一级别稍难,但是还是可以轻松达到。所谓 Pythonic,就是相比其它语言,Python 可以通过更加优雅的实现方式(不管是语法糖还是什么),比如(包括但不限于) with、for-else、try-else、yield 等。
另外你还需要掌握这些所谓魔法的实现原理,了解 Python 在语法层面的一些协议,可以自己实现语法糖。如 with 的实现方式(上下文管理器)等。
达到这一级,你的代码可以看起来很漂亮了。这部分内容,可以参考:
------------------------
level 4:高级玩法
掌握 Python 的内存机制、GIL 限制等,知道如何改变 Python 的行为,可以轻松写出高效的优质的 Python 代码,能够轻松分辨不同 Python 代码的效率并知道如何优化。
------------------------
level 5:看透本质
阅读 Python 的 C 实现,掌握 Python 中各种对象的本质,掌握是如何通过 C 实现面向对象的行为,对于常见的数据结构,掌握其实现细节。到这一步,需要将 Python 源码学习至少一遍,并对关键部分有较深层次的理解。
------------------------
level 6:手到拈来,一切皆空
不可说,不必说~
--------------------- 以下为补充说明 ---------------------------
看到评论区有朋友误解,这里解释一下。
首先,以上步骤 并不是打怪升级,不存在到了一级再去第下一级,你完全可以在熟练标准库的过程中掌握语言的实现原理等,这并不矛盾。所以那些评论说「我已经 xx 级了, xx 时候要到 xx 级」的朋友们,希望不要误解了我的意思,你不必将自己限制死,而可以很灵活的变通。
另外题干中的「招聘要求写着“精通 Python 语言”」,对于这样的招聘要求,绝大多数其实是 HR 脑残(不排除少部分公司真的有特殊需求),一般面对这样的公司我会选择绕道而行。既然是找工作,还是要找自己满意且公司本身很不错的,人生苦短,何必跟自己过不去呢?说到这里,我看知乎的招聘岗位中( 知乎招聘),貌似没有出现「精通」二字,自认技术高超的小伙伴可以去试试看哟~~~
最后,希望各位不要被某些答案「不需要精通 xx 语言」这样的言论干扰,编程语言有很多相似的地方,个人觉得掌握一门语言的底层实现,对自身的编程水平提升是很有帮助的。但是要搞清楚,仅仅编程语言是不够的,如何使用一门编程语言做有趣的事情,这很重要。
------------------------
level 1:了解基本语法
这是最容易的一级,掌握了 Python 的基本语法,可以通过 Python 代码实现常用的需求,不管代码质量怎么样。这部分内容,可以参考: The Python Tutorial。
------------------------
level 2:熟练使用常用的库
- 熟悉常用 standard library 的使用,包括但不限于 copy / json / itertools / collections / hashlib / os / sys 等,这部分内容,可以参考:The Python Standard Library。
- 熟悉常用的第三方库,这就根据每个人不同的用法而有所不同了,但是一定要掌握你所常用的那个领域里的第三方库。
------------------------
level 3:Pythonic
这一级别比上一级别稍难,但是还是可以轻松达到。所谓 Pythonic,就是相比其它语言,Python 可以通过更加优雅的实现方式(不管是语法糖还是什么),比如(包括但不限于) with、for-else、try-else、yield 等。
另外你还需要掌握这些所谓魔法的实现原理,了解 Python 在语法层面的一些协议,可以自己实现语法糖。如 with 的实现方式(上下文管理器)等。
达到这一级,你的代码可以看起来很漂亮了。这部分内容,可以参考:
------------------------
level 4:高级玩法
掌握 Python 的内存机制、GIL 限制等,知道如何改变 Python 的行为,可以轻松写出高效的优质的 Python 代码,能够轻松分辨不同 Python 代码的效率并知道如何优化。
------------------------
level 5:看透本质
阅读 Python 的 C 实现,掌握 Python 中各种对象的本质,掌握是如何通过 C 实现面向对象的行为,对于常见的数据结构,掌握其实现细节。到这一步,需要将 Python 源码学习至少一遍,并对关键部分有较深层次的理解。
------------------------
level 6:手到拈来,一切皆空
不可说,不必说~
--------------------- 以下为补充说明 ---------------------------
看到评论区有朋友误解,这里解释一下。
首先,以上步骤 并不是打怪升级,不存在到了一级再去第下一级,你完全可以在熟练标准库的过程中掌握语言的实现原理等,这并不矛盾。所以那些评论说「我已经 xx 级了, xx 时候要到 xx 级」的朋友们,希望不要误解了我的意思,你不必将自己限制死,而可以很灵活的变通。
另外题干中的「招聘要求写着“精通 Python 语言”」,对于这样的招聘要求,绝大多数其实是 HR 脑残(不排除少部分公司真的有特殊需求),一般面对这样的公司我会选择绕道而行。既然是找工作,还是要找自己满意且公司本身很不错的,人生苦短,何必跟自己过不去呢?说到这里,我看知乎的招聘岗位中( 知乎招聘),貌似没有出现「精通」二字,自认技术高超的小伙伴可以去试试看哟~~~
最后,希望各位不要被某些答案「不需要精通 xx 语言」这样的言论干扰,编程语言有很多相似的地方,个人觉得掌握一门语言的底层实现,对自身的编程水平提升是很有帮助的。但是要搞清楚,仅仅编程语言是不够的,如何使用一门编程语言做有趣的事情,这很重要。
先说好,我的回答仅限于这个问题。
让我们拿游泳来打比方吧。
某个游泳池要开业,所以需要一些救生员。于是他就贴出了求职公告。诚聘救生员,需精通游泳,待遇从优,非诚勿扰。
然后有人就在X乎上问了。大神们,什么叫做精通游泳?
嘛,我觉得吧,你起码得能在平静水面游个200米吧。
哎呀这个太基本了。既然是精通游泳,起码你得把蛙泳仰泳蝶泳自由泳各来个一公里吧。
年轻人,不要总想着搞个大新闻。主席畅游长江,谈笑风生,也没敢自称精通游泳。你游没游过长江啊。
半年后,游泳池倒闭了。
HR写“精通”的意思是,请新手有自知之明,我们需要一些能解决我们问题的人。什么叫能解决问题其实他也不明白,反正Team Leader满意就行。他希望的是差不多就得了,多来几个人才是正事(这才是人家的KPI)。而不是一年总共才上门一个人,而且还是个龟叔这个级别的人。实际上龟叔真的来了他才不知道该怎么办才好。就好像泳池招聘广告,只是希望你能在需要的时候,跳下去救人。而不是希望在泳池的旁边,养四个菲尔普斯。。。
让我们拿游泳来打比方吧。
某个游泳池要开业,所以需要一些救生员。于是他就贴出了求职公告。诚聘救生员,需精通游泳,待遇从优,非诚勿扰。
然后有人就在X乎上问了。大神们,什么叫做精通游泳?
嘛,我觉得吧,你起码得能在平静水面游个200米吧。
哎呀这个太基本了。既然是精通游泳,起码你得把蛙泳仰泳蝶泳自由泳各来个一公里吧。
年轻人,不要总想着搞个大新闻。主席畅游长江,谈笑风生,也没敢自称精通游泳。你游没游过长江啊。
半年后,游泳池倒闭了。
HR写“精通”的意思是,请新手有自知之明,我们需要一些能解决我们问题的人。什么叫能解决问题其实他也不明白,反正Team Leader满意就行。他希望的是差不多就得了,多来几个人才是正事(这才是人家的KPI)。而不是一年总共才上门一个人,而且还是个龟叔这个级别的人。实际上龟叔真的来了他才不知道该怎么办才好。就好像泳池招聘广告,只是希望你能在需要的时候,跳下去救人。而不是希望在泳池的旁边,养四个菲尔普斯。。。
我个人是很反对对一个语言使用“精通”这个词的。因为广大码农嘴里的“精通xxx”实际上毫无意义。代表不了任何东西。
代码是一个工具,就像一只笔一样。你精通“使用”这只笔是毫无卵用的,而广大码农嘴里“精通xxx语言”其实就是精通”使用“xxx语言而已。
精通使用一只笔是没有太大意义的(但是前提必须要基本会用哈),有意义的是你精通拿这只笔来做什么事,是拿来写书法、写文章或者是画画。然而写书法好的人换一只不那么熟的笔就不会写字了吗?写文章的换只笔就写不出好文章了?画画的换只笔就画不出画了?
那这书法,文章、画画代表的是什么呢?领域!
你们要明白:
搞安卓的Java和搞J2E的Java不是一个Java
搞嵌入式的c和搞桌面应用的c不是一个c
搞游戏引擎的c++和搞jvm的c++也不是一个c++
搞科学计算的python和搞web的python也不是一个python
代码是一个工具,就像一只笔一样。你精通“使用”这只笔是毫无卵用的,而广大码农嘴里“精通xxx语言”其实就是精通”使用“xxx语言而已。
精通使用一只笔是没有太大意义的(但是前提必须要基本会用哈),有意义的是你精通拿这只笔来做什么事,是拿来写书法、写文章或者是画画。然而写书法好的人换一只不那么熟的笔就不会写字了吗?写文章的换只笔就写不出好文章了?画画的换只笔就画不出画了?
那这书法,文章、画画代表的是什么呢?领域!
你们要明白:
搞安卓的Java和搞J2E的Java不是一个Java
搞嵌入式的c和搞桌面应用的c不是一个c
搞游戏引擎的c++和搞jvm的c++也不是一个c++
搞科学计算的python和搞web的python也不是一个python
的确,在招聘要求上写“精通XX技术”的都可以理解为是句废话。程序员大部分都是较真的人,看到精通xx的要求很多人就想自己肯定不算精通,虽然也有10w+以上的代码量了。奉劝招聘单位,少写这样的要求,否则很多合格的人可能因为自谦而不敢面试,翻完“30天精通XX”的人可能都跑来面试了。
再废话一下学语言的态度。其实写代码跟写文章没什么两样,就拿写文章来说,你写的是严谨科学的论文呢,还是文字炉火纯青又优雅的散文呢?你写的是宏篇巨著,比如“战争与和平”之类,还是写一个通知呢?如果写的是论文,可以类比普通的软件,简单、直观、好维护、结构清晰就OK了,如果写的是散文,类比那些NB人物写的精巧框架,使用了很多语言技巧,展现了NB人物对该语言的深刻理解,适用于流芳百世类型。如果写宏篇巨著,比如一个大型的业务系统、操作系统等,就涉及到架构问题了,语言的重要性退居2位,写个通知,随便吧,能用就行。
再废话一下学语言的态度。其实写代码跟写文章没什么两样,就拿写文章来说,你写的是严谨科学的论文呢,还是文字炉火纯青又优雅的散文呢?你写的是宏篇巨著,比如“战争与和平”之类,还是写一个通知呢?如果写的是论文,可以类比普通的软件,简单、直观、好维护、结构清晰就OK了,如果写的是散文,类比那些NB人物写的精巧框架,使用了很多语言技巧,展现了NB人物对该语言的深刻理解,适用于流芳百世类型。如果写宏篇巨著,比如一个大型的业务系统、操作系统等,就涉及到架构问题了,语言的重要性退居2位,写个通知,随便吧,能用就行。
我认为「精通」要满足如下条件:
所以我一直只敢称自己为 「中级 Pythonista」。对于那些仅仅知道怎么用 Python 就敢自称「精通」的人:专家不是那么好当的,没有金刚钻别揽瓷器活。不懂那么多底层细节就不要随便说自己「精通」,说自己「擅长」不会被人看不起。
@米嘉 引用的 StackOverflow 上列的那几项条件是作为将 Python 用于主要工作语言所需要的 基本条件,敢于因此而称自己「精通 Python」要让不少人笑掉大牙。况且那几项还有几个严重问题:
- 熟知主流硬件体系(x86, x64)
- 熟知 CPython 的具体实现,如若可能至少通读源码三遍以上
- 熟知每条 Python bytecode 如何被解释执行
- 熟知每条 Python 语句如何 compile 成 bytecode
- 熟知 Python 主要数据结构所采用的优化手段
- 熟知 JIT 以及哪些场合下 PyPy 会比 CPython 有较大性能提高、以及有什么代价
所以我一直只敢称自己为 「中级 Pythonista」。对于那些仅仅知道怎么用 Python 就敢自称「精通」的人:专家不是那么好当的,没有金刚钻别揽瓷器活。不懂那么多底层细节就不要随便说自己「精通」,说自己「擅长」不会被人看不起。
@米嘉 引用的 StackOverflow 上列的那几项条件是作为将 Python 用于主要工作语言所需要的 基本条件,敢于因此而称自己「精通 Python」要让不少人笑掉大牙。况且那几项还有几个严重问题:
- 第3点:如若可能,尽量避免 map/reduce/fitler,而用 list/generator/set comprehension,代码要清晰得多,GvR 如此说。xrange 和 range 的区别在 Python 3 中马上就要滚蛋了,所以如非必要,不要大量使用 xrange。
- 第5点:敢于在 CPython 中大量使用递归是对 CPython 实现的公然侮辱。Python 的多个稳定实现都没有 TCO,递归会让性能迅速下降。记住一点:Python 中函数调用非常昂贵,可读性、可维护性影响不大的情况下,能展开函数调用的时候尽量展开、递归能转化成循环的尽量转化。递归也不是人类自然的思考方式。
- 第7点:看书是对的,但不要把 Python 当作一门经典函数式语言对待,因为它不是。你当它是,它会很痛苦(“为毛要这样滥用我!?”),你也会很痛苦(“为毛你不这样实现 blah blah!?”)。SICP 是本好书,但不要因此而教条。要清楚的知道什么时候用函数式,什么时候用面向对象,什么时候用面向过程,什么时候用面向任务,什么时候用面向结果。在一棵树上吊死是大多数非理性死忠的表现。
反对排名第一的答案,IT人总是习惯于把“精通”这件事描述得很夸张。精通不代表对语言的所有细节都知道,我们会一门语言,
不是为了“会”而“会”,是为了“用”而“会”。
我有一定的python的开发经验,大概10w行python代码量,主要集中在科学计算和较大型科学计算系统的开发,我觉得最重要的是你 有能力做什么,而不是你做了什么,你没事去读什么python源码呀?你需要什么性能瓶颈了?要写什么C extension要借鉴源码么?为了读而读,浪费时间。
简单讲一下我对“精通”python的理解:
1. 熟悉语法以及原声数据结构
2. 熟悉基本实现中的性能特点,就是知道 什么操作会慢
3. 会使用profile以及基于profile的性能分析工具
4. 会使用运行时编译和静态编译的工具。pypy,numba,cython,ctypes,original C/C++ extension
5. 熟悉你所在领域的拓展库,比如我,科学计算方面的库不要太多,numpy衍生出来的一大堆大堆
6. 了解基本的编译过程,基本的操作系统知识(只要你C、C++学的还行就可以了)
最最重要的,良好的编码习惯,程序结构设计习惯,这对弱类型语言尤其重要。
不要写了1-2w行之后,就要重构一次,这样很伤的。
语言,是工具,不是目的。
我有一定的python的开发经验,大概10w行python代码量,主要集中在科学计算和较大型科学计算系统的开发,我觉得最重要的是你 有能力做什么,而不是你做了什么,你没事去读什么python源码呀?你需要什么性能瓶颈了?要写什么C extension要借鉴源码么?为了读而读,浪费时间。
简单讲一下我对“精通”python的理解:
1. 熟悉语法以及原声数据结构
2. 熟悉基本实现中的性能特点,就是知道 什么操作会慢
3. 会使用profile以及基于profile的性能分析工具
4. 会使用运行时编译和静态编译的工具。pypy,numba,cython,ctypes,original C/C++ extension
5. 熟悉你所在领域的拓展库,比如我,科学计算方面的库不要太多,numpy衍生出来的一大堆大堆
6. 了解基本的编译过程,基本的操作系统知识(只要你C、C++学的还行就可以了)
最最重要的,良好的编码习惯,程序结构设计习惯,这对弱类型语言尤其重要。
不要写了1-2w行之后,就要重构一次,这样很伤的。
语言,是工具,不是目的。
我只是用python来做我的实验,实现我的算法,我遇到什么问题就是简单的看看手册里面怎么使用python,没有过多的纠结如何去精通它。python给我带来的好处就是:它在实现算法时候更快速更高效,本来用c++需要写几天的东西,python很快就写完了,实验可以更快的得到结果。应该说:语言是为人服务的,而你的使用目的也决定了这门语言到底带给你什么。
我觉得根本就不存在所谓的精通python,C,java或任何一种编程语言。
只能是精通:tcp ip,http,数学建模,最优化,设计模式,数据挖掘,概率论,图像处理,信息论和编码,信息安全和加密,操作系统,编译原理,arm架构,等等等等。
语言终归只是工具,所谓精通语言对于多数人一点用都没有,除非你要自己设计一门语言。就好比于我精通汉语,知道各种生僻字,知道一个字的六种写法,这并没多大用处。重要的能构思奇妙故事的想象力,能准确解读文字的阅历和思维能力。
对于编程来说,语言就是不断制造的工具,比精通工具更重要的是:如何用工具解决问题,明白工具是如何解决问题的。
只能是精通:tcp ip,http,数学建模,最优化,设计模式,数据挖掘,概率论,图像处理,信息论和编码,信息安全和加密,操作系统,编译原理,arm架构,等等等等。
语言终归只是工具,所谓精通语言对于多数人一点用都没有,除非你要自己设计一门语言。就好比于我精通汉语,知道各种生僻字,知道一个字的六种写法,这并没多大用处。重要的能构思奇妙故事的想象力,能准确解读文字的阅历和思维能力。
对于编程来说,语言就是不断制造的工具,比精通工具更重要的是:如何用工具解决问题,明白工具是如何解决问题的。
一群没精通过 Python 的人来回答什么是「精通 Python」……
精通=精+通,搞定下面两点:
1. 精于「Python 魔法」,能做到那种很多时候信手拈来、触类旁通;能做到出了棘手 Bug,能顺利调试解决;至于 Pyhonic,那是基本要求
2. 通于「创造想创造的东西」,而不是熟读 Python 源码,然而对于如何创造却一脸茫然
Python 创造面向的细分领域无数种,你要精通哪一种?这才是应该正视的根本。比如:精通爬虫:-)
精通=精+通,搞定下面两点:
1. 精于「Python 魔法」,能做到那种很多时候信手拈来、触类旁通;能做到出了棘手 Bug,能顺利调试解决;至于 Pyhonic,那是基本要求
2. 通于「创造想创造的东西」,而不是熟读 Python 源码,然而对于如何创造却一脸茫然
Python 创造面向的细分领域无数种,你要精通哪一种?这才是应该正视的根本。比如:精通爬虫:-)
任何人能做到的仅仅时对这门语言本身的精通,
包括python作者在内的每个人都不知道python有多少第三方的包,类库,框架吧?
你拿Python做什么,需要用到哪些东西, 划定一个范围,才有人敢说是否精通!
包括python作者在内的每个人都不知道python有多少第三方的包,类库,框架吧?
你拿Python做什么,需要用到哪些东西, 划定一个范围,才有人敢说是否精通!