Python进阶路径-从学徒到大师


659

我已经学习,工作和玩Python一年半了。随着生物学家逐渐转向生物信息学,这种语言一直是我在实验室中所做的所有重大贡献的核心。我或多或少地爱上了Python允许我表达漂亮的解决方案的方式,也喜欢这种语言的语义,这种语义允许从思想到可行的代码的自然流动。

我想知道的是您对在此论坛或其他论坛中很少见到的一种问题的回答。对我来说,这个问题似乎对Python改进道路上的每个人都很重要,但谁又想知道下一步应该做什么。

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

  • 我不想知道如何快速学习Python
  • 我也不想找出了解该语言的最佳方法
  • 最后,我不想知道一种“一劳永逸”的方法。

我想知道您的看法是:

从徒弟身份到专家地位,您会建议Python入门者采取哪些步骤(无论您的专业知识要求如何,都可以随时停下来),以便一个人不断地提高自己,成为越来越优秀的Python程序员。SO上的某些人似乎因其Python的出色表现值得敬拜,请赐教:)

我喜欢的答案(但随时可以给读者群:P带来惊喜)的格式大致如下:

  • 阅读此内容(例如:python教程),请注意此类详细信息
  • 如此众多的时间/问题/代码行的代码
  • 然后,阅读此书(例如:这本或那本书),但是这次要注意这一点
  • 解决一些现实生活中的问题
  • 然后,继续阅读Y。
  • 一定要掌握这些概念
  • X时间代码
  • 回到这样的基础知识或进一步...
  • (你明白了:)

我真的很想知道您的意见,以便在不断发展的过程中(当然,要做出适当的努力)在各个阶段中应该注意的是什么。如果您来自特定的专业领域,请讨论在该领域中您认为合适的路径。

编辑:感谢您的大力支持,我又回到了Python改进的轨道上!我真的很感激!

Answers:


471

我认为Python精通的过程是这样的:

  1. 发现列表理解
  2. 发现发电机
  3. 一体化的地图,减少,过滤器,ITER,范围,XRANGE经常到你的代码
  4. 发现装饰者
  5. 编写递归函数,很多
  6. 探索itertoolsfunctools
  7. 阅读真实世界Haskell免费在线阅读
  8. 用大量的高阶函数,递归等重写所有旧的Python代码。
  9. 每当他们的小伙伴向您展示Python类时,他们都会感到烦恼。声称它可以“更好”地实现为字典以及一些功能。接受函数式编程。
  10. 重新发现策略模式,然后从命令代码中发现所有这些事情,您很难在Haskell之后忘记。
  11. 找到平衡。

@wheaties超级好听的清单,喜欢它!您似乎偏向于函数式编程并且远离面向对象...是否有特定原因?Haskell的经验是否将您重新引导至该方法?
莫洛克2010年

8
是的,没有。我发现我越接近函数式编程,就会写出更好,更简洁的代码。也就是说,在很多地方都以命令式的方式更清楚地表达事物。Real World Haskell在Python约定上卖光了是有原因的,它使您成为更好的程序员。我的建议是,尽可能多地探索Python的各个方面,然后尝试一种功能语言。
麦蒂

@wheaties会得到答复,因为它既接近要求的格式又很有启发性。感谢您抽出宝贵的时间回复!
莫洛克2010年

1
初学者:字典,然后稍后...精通:元编程
gath

您能否详细说明>>它可以“更好地”实现为字典以及一些功能。<<?
Koobz

108

扩展您的Python知识的一种好方法是挖掘您已经使用的库,平台和框架的源代码。

例如,如果您要在Django上构建网站,则可以通过查看Django如何实现相关功能来回答很多可能困扰您的问题。

这样,您将继续学习新的习惯用法,编码样式和Python技巧。(有些会好,有些会坏。)

并且,当您在源代码中看到一些您不了解的Pythony时,请跳至#python IRC频道,您会发现很多“语言律师”很乐于解释。

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


1
我要补充一点,而不是简单地安装django扩展/插件,而是尝试使用git分支手动添加代码。这将迫使您实际阅读要添加到项目中的代码
g33kz0r 2010年

14
很好奇为什么我们其他人都可以从“问题”中受益时为什么使用IRC
tshepang

1
为“成语,样式和技巧” +1。生活在真实的,由真正的接触者创造的文化中(即使这种接触意味着在这种情况下主要是阅读彼此的代码),这使得人类知识随着时间的推移而不断发展。
heltonbiker

92

了解(更深入地)关于内存管理的Python数据类型及其作用

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

通常,我会被问到一个非常类似的问题:“我应该学习入门还是高级课程?我已经对Python进行了1-2年的编程,我认为入门对我来说太简单了,所以我会想直接跳到高级课程... 您会推荐哪门课程?”

为了回答他们的问题,我探究了他们在这一领域的实力-不是说这确实是衡量他们是否准备好参加任何高级课程的最佳方法,而是要了解他们对Python对象和对象的基本了解程度。内存模型,这是由不仅是初学者,而且还超出初学者的人编写的许多 Python错误的原因。

为此,我将他们指向这个简单的两部分测验问题: 例1:x = 42; y = x;  x + = 1; 打印x,y Ex2:x = [1,2,3]; y = x; x [0] = 4;打印x,y

很多时候,他们都能够获得输出,但是为什么做出响应会变得更加困难和重要……我将输出权衡为答案的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

我建议的下一个主题是很好地理解引用计数,了解“ interning”的含义(但不一定要使用它),了解浅层和深层副本(如上述示例3所示),最后是各种类型和类型之间的相互关系。语言的构造,即列表与元组,字典与集合,列表理解与生成器表达式,迭代器与生成器等;但是所有其他建议在另一时间都已发布。希望这对您有所帮助!:-)

ps。我同意其他与内省和研究其他项目的源代码更加亲密的答复,并在两个建议中都添加了强烈的“ +1”!

pps。顺便问一问。我希望我一开始有足够的才智来问这样的事情,但是那是很久以前的事了,现在我正尝试通过多年的全职Python编程来帮助其他人!


韦斯利·春!莫洛克,这是您在问题的粗体部分中所说的那种人。我是一个博学多才的人,也是一位非常有天赋的老师,这本书使我受益匪浅。
卸下

谢谢@bvmou!我只能回答这个问题,因为我必须像其他所有人一样经历这个学习过程……只有我是13年前!:-) thx用于插入corepython.com!:-)
wescpy 2010年

@wescpy您能解释一下example3的输出吗?还是指向我学习这个东西的好资源。谢谢。
Sankalp

1
诀窍是仅复制对象引用,而不复制对象本身。这就是全部...希望对您有所帮助!实际上,几周前,我在OSCON上发表了有关此话题的演讲。当有人告诉我这是会议上评分最高的Python演讲时,我感到非常惊喜!您可以在此处下载幻灯片:oscon.com/oscon2013/public/schedule/detail/29374
wescpy 2013年

输出为SyntaxError:语法无效,不是吗?为什么?因为我使用过Python 3,所以print它不是语句。
Konrad Borowski


59

了解内省

  • 写一个dir()等效的
  • 写一个type()等效的
  • 弄清楚如何“猴子补丁”
  • 使用该dis模块查看各种语言构造如何工作

做这些事情会

  • 给您一些有关如何实现python的良好理论知识
  • 给您一些底层编程的良好实践经验
  • 使您对python数据结构有良好的直观感觉

1
type()如果您采用的完整的元类规范,那么“写一个等效项”将非常困难type
asmeurer 2013年

48
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?

4
guru()应该通过。没有什么能形容上师,让它过去
-inv

1
如果您修复GIL那么我认为你置身在一个水平高等教育比大师,但略低于仁慈的独裁者。;)
亚当·帕金

41

我会给您最简单,最有效的建议,我认为任何人都可以给您:code

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

有一个小时的空闲时间?编写将反转字符串的代码,并找出最佳解决方案。有空吗?为什么不尝试一些网络爬网。阅读其他人的代码。看看他们是如何做的。问问自己你会怎么做。

当我无聊的时候,我打开IDE并进行代码风暴。我记下了听起来有趣且充满挑战的想法。URL缩短器?当然可以。哦,我学会了如何将数字从一个底数转换为另一个底数!

无论您的技能水平如何,这都是有效的。您永不停止学习。通过在业余时间积极编码,您将花费很少的精力来理解该语言,并最终成为一名专家。您将积累知识和可重用的代码,并记住成语。


24

如果您正在使用python进行科学研究(看来您是在其中),那么其中的一部分将是学习和理解科学图书馆,对我而言,这将是

  • 麻木
  • 科学的
  • matplotlib
  • mayavi / mlab
  • 查科
  • 赛顿

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

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


谢谢。花一些时间学习numpy和scipy以获得大型数据集的内存使用效率当然是值得的!
莫洛克

1
可能将熊猫和IPython添加到列表中。
埃里克·威尔逊



12

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

对于每种类型和结构,编写一系列演示程序,以演示该类型或数据结构的各个方面。如果这样做,可能值得在每个博客上写笔记...这可能对很多人都有用!


这不仅在Python中有用,而且在抽象意义上也是如此。
汉弗莱·鲍嘉

1
每当我找到一个新的结构时,我都会编写一个玩具程序来演示如何使用它,这也是我的职责。并将其在线发布在github 仓库中
Adam Parkin

10

整个夏天,我只是通过在python网站上进行教程就自己独自学习了python(遗憾的是,我似乎再也找不到了,因此无法发布链接)。

后来,在大学的第一年课程中,我被教给了python。在随后的夏天,我练习了PythonChallengeGoogle Code Jam的问题。从算法的角度以及从学习Python可以做什么以及如何操纵它以充分利用python的角度来看,解决这些问题都是有帮助的。

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


3
您的意思是本教程?Python 2:docs.python.org/tutorial/index.html ; Python 3:docs.python.org/py3k/tutorial/index.html
汉弗莱·鲍嘉

10

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

这不会让您大开眼界,但首先请尝试解决Euler项目的问题 如果您拥有不错的中学数学并且知道如何使用Google,那么前50个左右的课程不应向您征税。当您解决一个问题时,您可以进入论坛,在这里您可以浏览其他人的解决方案,这将教给您更多的知识。不过要保持体面,不要发布您的解决方案,因为这样做的目的是鼓励人们自己解决问题。

如果您使用蛮力算法,那么强迫自己使用Python工作将是无法原谅的。这将教您如何在内存中布置大型数据集,以及如何使用快速语言功能(例如字典)有效地访问它们。

通过自己做这个,我学到了:

  • 文件IO
  • 动态编程等算法和技术
  • Python数据布局
    • 字典/哈希图
    • 清单
    • 元组
    • 其各种组合,例如字典到元组列表
  • 发电机
  • 递归函数
  • 开发Python库
    • 文件系统布局
    • 在解释器会话期间重新加载它们

而且非常重要

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

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

诚然,我没有从该经验中学到Python的OOP功能。


3
我喜欢PE网站,但说实话:这是一个数学网站,而不是编程网站。实际上,大多数问题(或者至少我已经解决的大多数问题)归结为知道一些数学技巧,而不是任何与编程语言相关的技巧。时常在论坛中的良好解决方案得到由天真的解决方案等的海浪淹没了
亚当帕金

相反,我发现它涉及编程和数学技能的应用,最重要的是将两者结合起来才能解决实际问题。如果您的数学技能不佳,则不能使用PE学习Python编程,但您只会通过使用它来学习如何使用一种语言,因此,如果您的数学足够好,这是理想的选择。
勒普顿船长2012年

7

您看过《使用Python进行生物信息学编程》一书吗?您似乎是其焦点小组的确切成员。


2
在前一段时间快速浏览本书之后,我发现这本书不是很有趣。它面向的是Python新手,问题本身并不是特别有趣。太糟糕了,这显然是Python使用不断增加的领域。一本更具刺激性的书本来不错。
莫洛克2010年

6

您已经有很多阅读材料,但是如果您能处理更多,我建议您阅读Python增强建议,尤其是“完成的” PEP和“推迟,放弃,撤回和拒绝”,以了解python的发展。 PEP。

通过了解语言的变化,做出的决定及其原理,您将了解Python的哲学,并了解“惯用的Python”是如何产生的。

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



3

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


2

不完全是您的要求,但我认为这是个好建议。

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


1
Haskell很有意思,我被Lisp吸引住了,但是我觉得在我继续前进之前,在Python世界中还有很多我需要发现的东西。
莫洛克

2
landoflisp(.com)最近引起了我的注意。
Jiaaro

如果有人在考虑Lisp,我建议使用Scheme
Tharindu Rusira

2

我建议从一些可以迫使您探索语法表现力的东西开始。Python允许使用多种不同的方式来编写相同的功能,但是通常只有一种最优雅,最快的方法。如果您习惯于其他语言的习惯用法,那么您可能永远不会找到或接受这些更好的方法。我花了一个周末来研究前20个左右的Euler项目问题,并使用Django在Google App Engine上制作了一个简单的webapp。也许这只会使您从学徒带到新手,但您可以继续制作更高级的Web应用程序,并解决更高级的Euler项目问题​​。几个月后,我回过头来,在一个小时而不是一个周末的时间内从头解决了前20个PE问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.