Python进程path – 从徒弟到专家
我一直在学习,工作和使用Python一年半。 作为一个慢慢转向生物信息学的生物学家,这个语言一直是我在实验室做出的所有主要贡献的核心。 我或多或less地爱上了Python允许我expression美丽的解决scheme的方式,以及语言的语义,从思想到可行代码的自然stream动。
我想知道的是你对这个或其他论坛中很less见到的问题的回答。 这个问题对于我来说对于Python改进之路上的任何人来说似乎都是重中之重,但是谁也不知道他的下一步应该是什么。
让我总结一下我不想先问的问题;)
- 我不想知道如何快速学习Python
- 我也不想找出熟悉这门语言的最好方法
- 最后,我不想知道“一举两得”的方法。
我想知道你的意见是:
你会推荐给一个Python熟练人员的步骤,从学徒到专家身份(随时停止,无论你的专业知识是什么),以便持续改进,成为更好,更好的Python编码器,一步一个脚印。 在SO上的一些人几乎似乎值得崇拜他们的Python的威力,请赐教:)
我会喜欢的那种答案(但是可以让读者感到惊讶:P)的格式或多或less是这样的:
- 阅读这个(例如:python教程),注意那种细节
- 代码如此多的时间/问题/代码行
- 然后,阅读这个(例如:这本或那本书),但是这一次,注意这一点
- 解决一些真实的问题
- 然后,继续阅读Y.
- 一定要把握这些概念
- 代码为X时间
- 回到这样或那样的基础,或进一步移动到…
- (你明白了:)
我真的很在意在不同的阶段知道你应该注意什么,以便不断地进步(当然还有适当的努力)。 如果您来自特定的专业领域,请在此领域讨论适当的path。
编辑:感谢您的伟大的投入,我回到了Python的改进轨道上! 我真的很感激!
我认为Python掌握的过程如下所示:
- 发现列表parsing
- 发现生成器
- 将地图,缩小,过滤,iter,范围,xrange经常合并到您的代码中
- 发现装饰者
- 写recursion函数,很多
- 发现itertools和functools
- 阅读真实世界Haskell ( 在线阅读 )
- 用大量的高阶函数,recursion和其他东西重写所有旧的Python代码。
- 每当他们向你展示一个Python类时,烦扰你的小隔间。 声称它可以作为一个字典加上一些function来“更好地”实现。 拥抱函数式编程。
- 重新发现战略模式,然后从你在Haskell之后很难忘记的命令代码中find所有这些东西 。
- find一个平衡点。
进一步掌握Python知识的一个好方法是深入研究已经使用的库,平台和框架的源代码。
例如,如果你正在Django上build立一个站点,可以通过查看Django如何实现相关function来回答很多可能会影响你的问题。
这样你将继续挑选新的成语,编码风格和Python技巧 。 (有些会好,有些会坏的。)
当你在源代码中看到一些你不明白的Pythony时 , 跳到#python IRC频道 ,你会发现很多“语言律师”很乐意解释。
多年来这些小小澄清的积累导致了对语言及其所有细节的更深入的理解。
了解(更深入)Python的数据types及其与内存pipe理的angular色
正如社区中的一些人所知道的, 我教Python课程 ,其中最受欢迎的是综合性的Intro + Intermediate课程,也是一门介绍各种应用程序开发领域的“高级”课程。
很多时候,我会问一个类似于“我应该参加你的开场白还是高级课程?”的问题,我已经对Python进行了1 – 2年的编程,而且我认为介绍对我来说太简单了,所以我会喜欢直接跳到高级… 你会推荐哪个课程?“
为了回答他们的问题,我想知道他们在这个领域有多强大,而不是测量他们是否已经准备好接受任何高级课程的最好方法,但是要看他们的基本知识对于Python的对象有多好内存模型,这是由许多不仅是初学者而是那些已经超越的人所写的许多 Python错误的原因。
为了做到这一点,我将这些简单的两部分问答问题指向他们:
很多时候,他们能够获得产出,但是为什么更难以及更为重要的回应呢?我会将结果视为答案的20%,而“为什么”会得到80%的回报。 如果他们不能理解为什么,不pipePython的经验如何,我总是会引导人们进入全面的介绍+中级课程,因为我花了一个关于对象和内存pipe理的讲座,以至于你应该能够用产出和充足信心的原因。 (仅仅是因为在1 – 2年之后你才了解Python的语法,所以你不会准备好超越“初学者”的标签,直到你对Python的工作方式有了更好的理解。)
接下来的询问需要类似的答案更加困难,例如,
例3
x = ['foo', [1,2,3], 10.4] y = list(x) # or x[:] y[0] = 'fooooooo' y[1][0] = 4 print x print y
我推荐的下一个主题是理解引用计数,学习“实习”意味着什么(但不一定是使用它),学习浅层和深层的副本(如上面的例子3),最后是各种types之间的相互关系和列表与元组,列表与元组,列表与列表,列表parsing与生成器expression式,迭代器与生成器等; 然而所有其他的build议是另一个post的另一个时间。 希望这有助于在此期间! 🙂
PS。 我同意其他的反应,比如反省,学习其他项目的源代码,并为这两个build议增加一个强烈的“+1”。
PPS。 伟大的问题BTW。 我希望自己一开始就有足够的智慧来问这样的问题,但那是很久以前的事了,现在我正在努力用我多年的全职Python编程来帮助别人!
查看Peter Norvig关于成为十年程序员的文章: http : //norvig.com/21-days.html 。 我敢打赌,任何语言都适用。
理解反省
- 写一个
dir()
等价物 - 写一个
type()
相当于 - 弄清楚如何“猴子补丁”
- 使用
dis
模块来查看各种语言结构如何工作
做这些事情会的
- 给你一些关于如何实现python的很好的理论知识
- 给你一些较好的低级编程实践经验
- 给你一个直观的Python数据结构的感觉
def apprentice(): read(diveintopython) experiment(interpreter) read(python_tutorial) experiment(interpreter, modules/files) watch(pycon) def master(): refer(python-essential-reference) refer(PEPs/language reference) experiment() read(good_python_code) # Eg. twisted, other libraries write(basic_library) # reinvent wheel and compare to existing wheels if have_interesting_ideas: give_talk(pycon) def guru(): pass # Not qualified to comment. Fix the GIL perhaps?
我会给你最简单最有效的build议,我想任何人都可以给你: 代码 。
你只能通过编码更好地使用一种语言(这意味着理解它)。 你必须积极享受编码,受到启发,提出问题,并自己find答案。
有一个小时,以备用? 编写能够反转string的代码,找出最佳解决scheme。 一个免费的晚上? 为什么不尝试一些networking抓取。 阅读其他人的代码。 看看他们如何做事。 问问自己你会做什么。
当我厌倦了我的电脑,我打开我的IDE和代码风暴。 我记下那些听起来有趣并且具有挑战性的想法。 一个URL缩短? 当然,我可以做到这一点。 哦,我学会了如何将数字从一个基地转换为另一个副作用!
无论你的技能水平如何 你永远不要停止学习。 通过在业余时间积极编码,您将不需要额外的努力就能理解语言,最终成为一名专家。 您将build立知识和可重复使用的代码并记住成语。
如果你正在使用python进行科学研究(看起来你是这样),其中一部分就是学习和理解科学图书馆,对我来说这些将是
- numpy的
- SciPy的
- matplotlib
- 编写Mayavi / MLAB
- 查科
- 用Cython
知道如何使用正确的库和vector化您的代码是科学计算所不可或缺的。
我想补充一点,用普通的pythonic方式(面向对象的方法,列表,迭代器)处理大数字数据集可能是非常低效的。 在科学计算中,可能有必要以与传统python编码器处理数据的方式大不相同的方式来构build代码。
谷歌最近刚刚发布了一个在线Python课程(“课程”中的“课程”)。
http://code.google.com/edu/languages/google-python-class/
我知道这并不能回答你的问题,但我认为这是一个很好的开始!
下载Twisted ,看看源代码。 他们采用一些相当先进的技术。
彻底了解所有的数据types和结构
对于每种types和结构,编写一系列演示程序,用于演示types或数据结构的各个方面。 如果你这样做,可能是值得每个博客的笔记…这可能是有用的很多人!
我在一个夏天刚刚通过python网站上的教程学习了python(不幸的是,我似乎无法再find,所以我不能发布链接)。
后来,我在大学一年级的时候给了我python。 接下来的夏天,我练习了PythonChallenge和来自Google Code Jam的问题。 解决这些问题有助于从algorithm的angular度来看,也从学习Python能做什么以及如何操纵它来充分利用python的angular度来解决这些问题。
由于类似的原因,我听说高尔夫代码也是如此,但是我从来没有为自己尝试过。
学习algorithm/math/文件IO / Pythonic优化
这不会让你上学,但要开始,尝试通过欧拉项目的问题前50左右,如果你有体面的高中math,知道如何谷歌,不应该税。 当你解决这个问题的时候,你可以进入论坛,在那里你可以看看别人的解决scheme,这些解决scheme将会教你更多。 虽然不错,但不要提出你的解决scheme,因为这个想法是鼓励人们自己去解决问题。
如果你使用蛮力algorithm,强迫自己在Python中工作将是无情的。 这将教你如何在内存中布置大数据集,并通过字典等快速语言function高效地访问它们。
从这个我自己,我了解到:
- 文件IO
- algorithm和技术,如dynamic规划
- Python数据布局
- 字典/包含HashMap
- 清单
- 元组
- 它们的各种组合,例如字典到元组列表
- 发电机
- recursion函数
- 开发Python库
- 文件系统布局
- 在翻译会议期间重新加载
而且非常重要
- 何时放弃和使用C或C ++!
所有这些都与生物信息学有关
诚然,我没有从这个经验中学习Python的OOP特性。
你有没有看过这本书“ 使用Python的生物信息学编程 ”? 看起来你是其焦点小组的确切成员。
你已经有了很多的阅读材料,但是如果你能处理更多的东西,我build议你通过阅读Python增强build议,尤其是“成品”PEP和“推迟,放弃,撤回和拒绝”来学习python的发展。政治公众人物。
通过观察语言如何变化,做出的决定和理由,您将吸收Python的哲学,并理解“惯用Python”是如何产生的。
教给别人谁开始学习Python总是一个很好的方式让你的想法清楚,有时,我通常会从学生那里得到很多简洁的问题,让我重新思考有关Python的概念性的东西。
不完全是你要求的,但我认为这是很好的build议。
学习另一种语言,哪个不重要。 每种语言都有自己的想法和习惯,你可以从中学习。 了解语言的差异,更重要的是why
他们不同。 尝试像Haskell这样的纯粹function语言,并且看到一些没有副作用的function的好处(和挑战)。 了解如何将从其他语言学到的一些东西应用到Python。
我build议从某些事情开始,强迫你去探索语法的expression力。 Python允许用许多不同的方式来编写相同的function,但通常有一个最优雅和最快的方法。 如果你习惯了其他语言的成语,你可能永远不会find或接受这些更好的方法。 我花了一个周末的时间熬过了20多个Project Euler的问题,并在Google App Engine上与Django做了一个简单的webapp。 这只会让你从学徒到新手,也许,但是你可以继续制作更高级的webapps,解决更高级的Project Euler问题。 几个月后,我回到了一个小时而不是一个周末,从头开始解决了前20个PE问题。