Python的发展路径-从学徒到大师

我学习、工作和使用Python已经有一年半的时间了。作为一名慢慢转向生物信息学的生物学家,这种语言一直是我在实验室所做的所有主要贡献的核心。我或多或少爱上了Python让我表达美丽的解决方案的方式,也爱上了这种语言的语义,它允许从思想到可行的代码的自然流动。

有一个问题,我很少在这里或其他论坛看到,我想听听你的回答。在我看来,这个问题对于任何走在Python改进道路上的人来说都很重要,但他不知道下一步应该做什么。

让我先总结一下我不想问的问题;)

  • 我不想知道如何快速学习Python
  • 我也不想找出熟悉这门语言的最佳方法
  • 最后,我不想知道“一个技巧可以解决所有问题”的方法。

我想知道你的意见是:

从学徒到大师,你会向Python熟练者推荐哪些步骤,以便一个人不断提高,成为一个越来越好的Python程序员,一次一步。SO上的一些人几乎因为他们的Python能力而值得崇拜,请启发我们:)

我喜欢的那种回答(但请随意给读者惊喜:P),格式或多或少是这样的:

  • 阅读这个(例如:python教程),注意那种细节
  • 这么多时间/问题/行代码的代码
  • 然后,读这本(例如:这本或那本书),但这次,注意这本
  • 解决一些现实生活中的问题
  • 然后,继续读取Y。
  • 一定要掌握这些概念
  • X时间的代码
  • 回到这样那样的基础或进一步讨论……
  • (你懂的)

我真的很想知道你对一个人在不同阶段应该注意什么问题的看法,以便不断进步(当然,要付出适当的努力)。如果你来自一个特定的专业领域,讨论一下你认为适合这个领域的道路。

编辑:感谢您的大力投入,我又回到了Python改进的轨道上!非常感谢!

386590 次浏览

谷歌最近发布了一个在线Python类(“类”在“一门课程”中)。

http://code.google.com/edu/languages/google-python-class/

我知道这并不能完全回答你的问题,但我认为这是一个很好的开始!

这不是你想要的,但我觉得这是个好建议。

学另一门语言,哪门都无所谓。每种语言都有自己的想法和习惯,你可以从中学习。了解语言之间的差异,更重要的是它们是不同的。尝试纯函数式语言,如Haskell,看看函数的一些好处(和挑战),没有副作用。看看如何将从其他语言中学到的一些东西应用到Python。

进一步学习Python知识的一个好方法是深入研究您已经使用的库、平台和框架的源代码。

例如,如果您正在Django上构建一个站点,那么许多可能困扰您的问题都可以通过查看Django如何实现相关特性来解决。

这样您将继续学习新的习语、编码风格和Python技巧。(有些是好的,有些是坏的。)

当你在源代码中看到一些你不理解的Pythony时,跳转到#python IRC频道和你会发现很多“语言律师”乐于解释。

多年来这些小的澄清的积累导致了对语言及其所有来龙去脉的更深刻的理解。

下载扭曲的并查看源代码。他们采用了一些相当先进的技术。

我第一次自学python是在一个夏天的时候,只是在python网站上做教程(遗憾的是,我似乎再也找不到它了,所以我不能发布链接)。

后来,在我大学一年级的课程中,有人教我python。在接下来的夏天,我用PythonChallenge谷歌代码Jam的问题进行了练习。 从算法的角度,以及从学习Python可以做什么以及如何操作它来充分利用Python的角度,解决这些问题是有帮助的

出于类似的原因,我听说代码高尔夫也可以,但我自己从来没有尝试过。

理解自省

  • 写一个dir()的等价
  • 写一个type()的等价
  • 弄清楚如何“monkey-patch”
  • 使用dis模块来查看各种语言结构是如何工作的

做这些事

  • 给你一些关于python如何实现的理论知识
  • 在底层编程方面给你一些很好的实践经验
  • 让你对python数据结构有一个很直观的感觉

彻底理解所有数据类型和结构

对于每种类型和结构,编写一系列演示程序来练习类型或数据结构的各个方面。如果你这样做了,在博客上记下每一个笔记可能是值得的……它可能对很多人有用!

你看过《生物信息学编程使用Python》这本书吗?看来你是焦点小组的一员。

(更深入地)理解Python的数据类型及其在内存管理方面的角色

正如社区中的一些人所知道的,我教Python课程,最受欢迎的是综合的入门+中级课程,以及介绍应用程序开发各个领域的“高级”课程。

经常有人问我类似这样的问题:“我应该上你的入门课还是进阶课?”我已经有1-2年的Python编程经验了,我认为入门部分对我来说太简单了,所以我想直接跳到高级部分…会推荐哪门课程?”

为了回答他们的问题,我考察了他们在这方面的能力有多强——并不是说这真的是衡量他们是否为任何高级课程做好了准备的最佳方法,而是看看他们对Python对象和内存模型的基本知识有多好,这是那些不仅是初学者,而且已经超越了这一点的人编写许多 Python错误的原因。

为了做到这一点,我让他们看看这个简单的测试问题: Ex1: x=42;y = x;x + = 1;打印x, y Ex2: x =(1、2、3),y = x, x[0] = 4,打印x, y < / p >

很多时候,他们能够得到输出,但为什么是一个更困难和更重要的响应…我认为产出只占答案的20%,而“为什么”占80%。如果他们不知道为什么,不管他们有多少Python经验,我总是会引导他们去全面的入门+中级课程,因为我花了一节课在对象和内存管理上,让你能够有足够的信心回答输出和为什么。(仅仅因为你在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),最后,语言中各种类型和结构之间的相互关系,即列表vs元组,字典vs集,列表理解vs生成器表达式,迭代器vs生成器,等等;然而,所有这些建议都是另一篇文章。希望这对你有所帮助!: -)

ps.我同意其他的回答,即更深入地进行内省以及研究其他项目的源代码,并在这两个建议中添加一个强烈的“+1”!

pp。顺便说一句,问得好。我希望我一开始就足够聪明,问过这样的问题,但那是很久以前的事了,现在我正试图用我多年的全职Python编程来帮助别人!!

看看Peter Norvig关于10年内成为大师级程序员的文章:http://norvig.com/21-days.html。我敢打赌这对任何语言都适用。

我会给你一个我认为任何人都能给你的最简单、最有效的建议:代码

您只能通过编码更好地使用一种语言(这意味着理解它)。你必须积极地享受编码,受到启发,提出问题,并自己找到答案。

有一个小时的空闲时间吗?编写反转字符串的代码,并找出最优的解决方案。一个自由的夜晚?为什么不试试网络抓取呢?阅读别人的代码。看看他们是怎么做事的。问问你自己你会怎么做。

当我对我的电脑感到无聊时,我打开我的IDE和代码风暴。我记下那些听起来有趣、有挑战性的想法。URL缩短器?当然,我能做到。哦,我学会了如何将数字从一种进制转换为另一种进制,这是我的一个副作用!

无论你的技能水平如何,这都是有效的。永远不要停止学习。通过在业余时间积极编写代码,你将不需要额外的努力就能理解这门语言,并最终成为一名大师。你将建立知识和可重用的代码和记忆习语。

我认为掌握Python的过程是这样的:

  1. 发现# EYZ0
  2. 发现# EYZ0
  3. 经常将Map, reduce, filter, iter, range, xrange合并到代码中
  4. 发现# EYZ0
  5. 写很多递归函数
  6. 发现itertoolsfunctools
  7. 读取真实世界Haskell (在线免费阅读)
  8. 用大量的高阶函数、递归和诸如此类的东西重写所有旧的Python代码。
  9. 每次你的同事给你一个Python类的时候,都要惹恼他们。声称它可以“更好”地实现为字典加上一些功能。拥抱函数式编程。
  10. 重新发现策略模式,然后从令状代码中发现诸如此类,你在Haskell之后努力忘记了。
  11. 找到平衡。
你已经有很多阅读材料了,但如果你能处理更多,我推荐你

通过阅读python增强建议来了解python的进化,特别是“完成”的pep和“延迟、放弃、撤回和拒绝”的pep

通过了解语言的变化,所做的决定及其基本原理,您将吸收Python的哲学,并理解“地道的Python”是如何产生的。

http://www.python.org/dev/peps/

我建议从一些迫使您探索语法表达能力的东西开始。Python允许多种不同的方法来编写相同的功能,但通常有一种最优雅、最快的方法。如果你习惯了其他语言的习语,你可能永远不会找到或接受这些更好的方法。我花了一个周末的时间艰难地完成了前20个左右的Project Euler问题,并在谷歌应用程序引擎上用Django做了一个简单的web应用程序。这可能只会让你从学徒变成新手,但你可以继续制作更高级的web应用程序,解决更高级的Project Euler问题。几个月后,我重新开始,在一个小时内解决了前20道体育题目,而不是一个周末。

如果你在科学中使用python(看起来你是这样),其中的一部分将是学习和理解科学库,对我来说,这些将是

  • numpy
  • scipy
  • matplotlib
  • mayavi / mlab
  • 查科
  • Cython

了解如何使用正确的库和向量化代码对于科学计算是至关重要的。

我想补充一点,用常见的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?

教那些刚开始学习Python的人总是让你的想法清晰的好方法,有时,我通常会从学生那里得到很多简洁的问题,让我重新思考关于Python的概念。

学习算法/数学/文件IO/ python优化

这不会让你成为专家,但是开始,尝试通过Project Euler问题 如果你有不错的高中数学,知道如何谷歌,前50个左右不应该征税。当你解决了一个问题,你就可以进入论坛,在那里你可以看到其他人的解决方案,这将教会你更多。但要体面,不要张贴你的解决方案,因为你的想法是鼓励人们自己解决问题。< / p > 如果你使用蛮力算法,那么强迫自己用Python工作将是不可原谅的。 这将教你如何在内存中布局大型数据集,并使用快速语言功能(如字典)有效地访问它们

我从自己的经历中学到了:

  • 文件输入输出
  • 算法和技术,如动态规划
  • Python数据布局
    • 字典/ hashmap
    • 列表
    • 元组
    • 它们的各种组合,例如字典到元组列表
    • 李< / ul > < / >
    • 发电机
    • 递归函数
    • 开发Python库
      • 文件系统布局
      • 在解释器会话期间重新加载它们
      • 李< / ul > < / >

      还有很重要的一点

      • 什么时候放弃使用C或c++ !

      所有这些都应该与生物信息学相关

      诚然,我并没有从那次经历中学到Python的面向对象编程特性。