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

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

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

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

我想知道你的意见是:

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

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

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

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

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


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

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

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


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

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


深入了解Python知识的一个好方法是深入了解您已经使用的库、平台和框架的源代码。

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

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

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

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


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


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

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

出于类似的原因,我听说code golf也可以,但我自己从未尝试过。


理解自省

写一个dir()的等价函数 编写一个type()的对等体 弄清楚如何“打猴子补丁” 使用dis模块查看各种语言结构是如何工作的

做这些事

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


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

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


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


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

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

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

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

要做到这一点,我建议他们看看这个简单的测试问题:

Many times, they are able to get the output, but the why is more difficult and much more important of an response... I would weigh the output as 20% of the answer while the "why" gets 80% credit. If they can't get the why, regardless how Python experience they have, I will always steer people to the comprehensive intro+intermediate course because I spend one lecture on objects and memory management to the point where you should be able to answer with the output and the why with sufficient confidence. (Just because you know Python's syntax after 1-2 years doesn't make you ready to move beyond a "beginner" label until you have a much better understanding as far as how Python works under the covers.)

接下来的询问要求类似的答案就更难了,例如:

示例3

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

The next topics I recommend are to understanding reference counting well, learning what "interning" means (but not necessarily using it), learning about shallow and deep copies (as in Example 3 above), and finally, the interrelationships between the various types and constructs in the language, i.e. lists vs. tuples, dicts vs. sets, list comprehensions vs. generator expressions, iterators vs. generators, etc.; however all those other suggestions are another post for another time. Hope this helps in the meantime! :-)

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

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


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


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

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

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

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

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


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

Discover list comprehensions Discover generators Incorporate map, reduce, filter, iter, range, xrange often into your code Discover Decorators Write recursive functions, a lot Discover itertools and functools Read Real World Haskell (read free online) Rewrite all your old Python code with tons of higher order functions, recursion, and whatnot. Annoy your cubicle mates every time they present you with a Python class. Claim it could be "better" implemented as a dictionary plus some functions. Embrace functional programming. Rediscover the Strategy pattern and then all those things from imperative code you tried so hard to forget after Haskell. Find a balance.


你已经有了很多阅读材料,但如果你能处理更多,我建议你 通过阅读python增强建议来了解python的进化,特别是“完成”的pep和“延迟、放弃、撤回和拒绝”的pep。

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

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


I recommend starting with something that forces you to explore the expressive power of the syntax. Python allows many different ways of writing the same functionality, but there is often a single most elegant and fastest approach. If you're used to the idioms of other languages, you might never otherwise find or accept these better ways. I spent a weekend trudging through the first 20 or so Project Euler problems and made a simple webapp with Django on Google App Engine. This will only take you from apprentice to novice, maybe, but you can then continue to making somewhat more advanced webapps and solve more advanced Project Euler problems. After a few months I went back and solved the first 20 PE problems from scratch in an hour instead of a weekend.


如果你在科学中使用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个左右不应该征税。当你解决了一个问题,你就可以进入论坛,在那里你可以看到其他人的解决方案,这将教会你更多。但要体面,不要张贴你的解决方案,因为你的想法是鼓励人们自己解决问题。

如果您使用暴力算法,那么强迫自己使用Python将是不可原谅的。 这将教你如何在内存中布局大型数据集,并使用快速语言功能(如字典)有效地访问它们。

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

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

还有很重要的一点

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

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

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


使用Python尝试http://challenge.greplin.com/