Python progression path:Python进程路径-从学徒到导师

我已经学习、工作和使用Python一年半了。作为一个生物学家慢慢转向生物信息学,这种语言是非常核心的所有重大贡献我在实验室里,或多或少地爱上了Python允许我表达美丽的方式解决方案以及语言的语义,允许这样的自然流动的想法可行的代码。

我想知道的是你对一个我在这个论坛或者其他论坛上很少看到的问题的回答。对于任何正在进行Python改进的人来说,这个问题对我来说似乎都很重要,但是谁又想知道下一步应该做什么呢?

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

我不想知道如何快速学习Python我也不想找出学习这门语言的最好方法最后,我不想知道一种"一举两得"的方法。

我想知道你的意见是:

您会向Python新手推荐哪些步骤,从学徒阶段到大师阶段(随时可以根据您的专业知识停止),以便不断改进,逐步成为更好的Python程序员。有些人对巨蟒的超凡能力几乎是值得崇拜的,请启发我们:)

我喜欢这样的答案(但也可以随意地让读者感到惊讶:P),格式大致是这样的:

阅读本文(例如:python教程),注意这类细节为这么多时间/问题/行代码编写代码然后,读这个(例如:这本或那本书),但这次,注意这个处理一些现实生活中的问题然后,继续读Y。一定要掌握这些概念X时间编码回到这些基础知识,或者更进一步……(你懂的)

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

编辑:感谢您的输入,我又回到了Python改进的轨道上!我真的很感激!


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

发现列表理解发现发电机经常在代码中包含map、reduce、filter、iter、range、xrange发现修饰符写递归函数,很多发现迭代工具和函数工具阅读真实世界的Haskell(在线免费阅读)用大量的高阶函数、递归等重写所有旧的Python代码。每次你的同事给你上Python类的时候,你都会被他们惹恼。声称它可以"更好地"实现为字典加上一些函数。接受函数式编程。重新发现策略模式,然后从您在Haskell之后极力想要忘记的命令式代码中重新发现所有这些东西。找到一个平衡。


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

例如,如果您正在Django上构建一个站点,那么可以通过研究Django如何实现所讨论的特性来回答许多可能会让您感到困惑的问题。

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

当您在源代码中看到一些您不理解的python内容时,请跳转到#python IRC频道,您会发现有很多"语言律师"乐意为您解释。

经过多年的积累,这些小的澄清使我们对这门语言及其所有的来龙去脉有了更深刻的理解。


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

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

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

要回答他们的问题,我探头去看他们是多么强烈的在这一领域,而不是它真的是最好的方式来衡量他们是否准备好任何高级课程,但看看他们的基本知识是Python的对象和内存模型中,这是一个原因,许多Python bug不仅写的那些初学者,那些超越。

为了做到这一点,我把它们指向这个简单的两部分测试问题:Ex1: x=42; y=x; x+=1; print x,y Ex2: x=[1,2,3];y=x;x[0]=4;print x,y

很多时候,他们能够得到输出,但是为什么更困难,响应更重要……我将把结果作为答案的20%来衡量,而"为什么"得到80%的好评。如果他们不能得到,为什么无论如何Python的经历,我将永远引导人们全面介绍+中级课程,因为我花一节课在对象和内存管理,您应该能够回答输出和为什么有足够的信心。(仅仅因为您在1-2年后才了解Python的语法,并不意味着您已经准备好超越"初学者"的标签,除非您对Python的底层工作原理有了更好的理解。)

后续的调查需要类似的答案就更困难了,例如,

示例3

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

接下来的话题我建议是理解引用计数,学习"实习"是什么意思(但不一定使用它),学习浅和深拷贝(在上面的示例3),最后,各种类型之间的相互关系和构造语言,即列表和元组、字典和集列表理解与生成器表达式,迭代器和发电机,等;然而,所有这些其他的建议都是另一个时间的帖子。希望这对你有所帮助!:-)

ps.我同意其他的回答,通过内省,以及研究其他项目的源代码,在这两个建议中都加上一个强"+1"!

pp。顺便说一句伟大的问题。我希望我在开始的时候足够聪明,能够提出这样的问题,但是那是很久以前的事了,现在我正试图用我多年的全职Python编程来帮助其他人!!


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


理解自省

编写一个等价的dir()编写一个等价的type()弄清楚如何"猴子补丁"使用dis模块查看各种语言构造是如何工作的

做这些事情会

给你一些关于python是如何实现的很好的理论知识给你一些较低层次编程的良好实践经验让您对python数据结构有一个很好的直观感受


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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?


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

只有通过编码才能更好地使用一门语言(这意味着理解它)。你必须积极地享受编程,获得灵感,提出问题,并自己找到答案。

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

当我在电脑前感到无聊时,我打开IDE并进行代码风暴。我把那些听起来有趣、有挑战性的想法记下来。一个网址吗?当然,我能做到。哦,我学会了如何把数字从一个基数转换成另一个基数作为副作用!

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


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

numpyscipymatplotlibmayavi / mlab查科Cython

知道如何使用正确的库并使代码向量化对于科学计算非常重要。

我想补充一点,用常见的python方法(面向对象的方法、列表、迭代器)处理大型数字数据集可能非常低效。在科学计算中,有必要以与大多数传统python程序员处理数据的方式截然不同的方式构造代码。


谷歌最近刚刚发布了一个在线Python类("class"与"a course of study"中的"class"相同)。

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

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


下载Twisted并查看源代码。他们使用一些非常先进的技术。


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

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


我花了一个夏天的时间自学python,只是通过python网站上的教程(遗憾的是,我似乎再也找不到这样的教程了,所以我不能发布链接)。

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

出于类似的原因,我听说code golf也可以运行,但是我从来没有亲自尝试过。


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

这不会让你成为大师,但开始,尝试通过欧拉项目的问题如果你拥有不错的高中数学知识,并且知道如何谷歌,那么前50名左右的学生不应该向你征税。当你解决了一个问题,你可以进入论坛,你可以通过其他人的解决方案,这将教你更多。但是要得体,不要张贴你的解决方案,因为这样做的目的是鼓励人们自己解决问题。

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

我从自己做这件事中学到了:

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

同样重要的是

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

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

诚然,我并没有从那次经历中学到Python的OOP特性。


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


你已经有很多阅读材料,但如果你能处理更多,我推荐你通过阅读python增强建议了解python的发展,特别是"完成的"PEPs和"延迟的、废弃的、撤回的和被拒绝的"PEPs。

通过了解语言是如何变化的、所做的决策以及它们的原理,您将了解Python的哲学并理解"惯用Python"是如何产生的。

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


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


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


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


不完全是你想要什么,但我认为这是个好建议。

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