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

Mor*_*ock 659 python

我一直在学习,工作和玩Python一年半.随着生物学家慢慢转向生物信息学,这种语言一直是我在实验室做出的所有主要贡献的核心.我或多或少地爱上了Python允许我表达漂亮解决方案的方式,以及语言的语义,允许从思想到可行代码的这种自然流动.

我想知道的是你对我在这个论坛或其他论坛中很少见到的一个问题的答案.对于那些正在改进Python的人来说,这个问题对我来说似乎很重要,但是他想知道他的下一步应该是什么.

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

  • 我不想知道如何快速学习Python
  • 我也不想找到熟悉该语言的最佳方式
  • 最后,我不想知道"一招做到这一切"的方法.

我想知道你的意见,是:

您将向Python熟练人员推荐哪些步骤,从学徒到大师状态(随意停止,无论您的专业知识在哪里),以便一个人不断改进,成为更好,更好的Python编码器,一步一步.SO上的一些人几乎看起来值得为他们的Python实力而敬拜,请赐教:)

我会喜欢的那种答案(但随意给读者带来惊喜:P)的格式或多或少是这样的:

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

我非常关心在不同的阶段知道你应该注意什么的意见,以便不断进步(当然有适当的努力).如果您来自特定的专业领域,请在此字段中讨论您认为合适的路径.

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

whe*_*ies 471

我认为Python掌握的过程类似于:

  1. 发现列表理解
  2. 发现发电机
  3. 包括地图,减少,过滤器,ITER,范围,x范围经常到你的代码
  4. 发现装饰者
  5. 编写递归函数,很多
  6. 发现itertoolsfunctools
  7. 阅读真实世界Haskell(在线阅读)
  8. 用大量的高阶函数,递归和诸如此类的东西重写所有旧的Python代码.
  9. 每次为他们提供Python课程时,都要惹恼你的小隔间.声称它可以"更好"地实现为字典和一些功能.拥抱函数式编程.
  10. 重新发现策略模式,然后从Haskell之后你努力忘记的命令性代码重新发现所有这些事情.
  11. 找到一个平衡点.

  • 是的,不是.我发现编写更好,更简洁的代码越接近函数式编程.也就是说,有很多地方以强制性的方式更清楚地表达事物.有一个原因,真实世界Haskell在Python惯例中售罄,它让你成为一个更好的程序员.我的建议是,尽可能多地探索Python的各个方面,然后尝试一种函数式语言. (8认同)

dka*_*ins 108

提高Python知识的一个好方法是深入研究已经使用的库,平台和框架的源代码.

例如,如果您在Django上构建一个站点,可以通过查看Django如何实现相关功能来回答许多可能存在问题的问题.

这样你就可以继续学习新的习语,编码风格和Python技巧.(有些会很好,有些会很糟糕.)

当你在源头看到一些你不理解的Pythony时,跳到#python IRC频道,你会发现很多"语言律师"乐于解释.

多年来这些小小的澄清的积累导致对语言及其所有细节的更深入的理解.

  • 好奇为什么**当我们其他人可以从这个问题中受益时**使用IRC**? (14认同)

wes*_*cpy 92

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

正如社区中的一些人所知,我教授Python课程,最受欢迎的课程是全面的Intro + Intermediate课程以及介绍应用程序开发各个领域的"高级"课程.

很多时候,我被问到一个非常类似的问题,"我应该参加你的介绍还是高级课程?我已经编程了1到2年的Python,我认为介绍对我来说太简单了所以我会喜欢直接跳到高级... 你会推荐哪个课程?"

为了回答他们的问题,我探究了他们在这个领域的强大程度 - 不是说这是衡量他们是否已经为任何高级课程做好准备的最好方法,而是看他们的基础知识与Python的对象有多好.内存模型,这是许多 Python错误的原因,这些错误不仅是那些不仅是初学者而且还超越了那些人的人.

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

很多时候,他们能够获得输出,但是为什么更难以及更重要的回应...我会将输出权衡为答案的20%,而"为什么"得到80%的信用.如果他们无法理解为什么,无论他们有多少Python经验,我总会引导人们参加全面的介绍+中级课程,因为我在对象和内存管理上花了一个讲座,你应该能够回答这个问题.输出和充满信心的原因.(仅仅因为你知道Python的语法在1 - 2年后不会让你准备好超越"初学者"标签,直到你对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
Run Code Online (Sandbox Code Playgroud)

我推荐的下一个主题是很好地理解引用计数,学习"实习"意味着(但不一定使用它),学习浅层和深层副本(如上面的例3所示),最后是各种类型之间的相互关系.语言中的构造,即列表与元组,dicts与集合,列表推导与生成器表达式,迭代器与生成器等等; 然而,所有其他建议是另一个时间的另一个帖子.希望这有助于此期间!:-)

PS.我同意其他回应,以便更深入地了解内省以及研究其他项目的源代码,并为这两个建议添加强大的"+1"!

PPS.好问题BTW.我希望我在开始时能够很聪明地问这样的事情,但那是很久以前的事了,现在我正在尝试用我多年的全职Python编程来帮助别人!


twn*_*ale 67

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


Mar*_*son 59

理解内省

  • 写一个dir()等价物
  • 写一个type()等价物
  • 弄清楚如何"猴子补丁"
  • 使用该dis模块来查看各种语言结构的工作方式

做这些事情会

  • 给你一些关于如何实现python的理论知识
  • 为您提供一些低级编程的实践经验
  • 为python数据结构提供良好的直观感受


ami*_*mit 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?
Run Code Online (Sandbox Code Playgroud)

  • guru()应该通过.没有什么可以形容大师,让它通过 (4认同)

Hum*_*art 41

我会给你最简单,最有效的建议,我认为任何人都可以给你:代码.

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

有一个小时的闲暇?编写将反转字符串的代码,并找出最佳解决方案.一个免费的晚上?为什么不尝试一些网络抓取.阅读其他人的代码.看看他们是如何做的.问问自己你会做什么.

当我对我的计算机感到无聊时,我打开了我的IDE和代码风暴.我记下听起来很有趣,充满挑战的想法.一个URL缩短器?当然,我可以做到.哦,我学会了如何将数字从一个基数转换为另一个作为副作用!

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


小智 24

如果你正在使用python进行科学研究(你似乎是),其中一部分将是学习和理解科学图书馆,对我而言,这些将是

  • numpy的
  • SciPy的
  • matplotlib
  • 编写Mayavi/MLAB
  • 查科
  • 用Cython

了解如何使用正确的库并对代码进行矢量化对于科学计算至关重要.

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


dka*_*ins 23

谷歌最近刚刚发布了一个在线Python课程("课程"中的"课程").

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

我知道这不能回答你的完整问题,但我认为这是一个很好的起点!

  • 实际上,我认为谷歌的这些视频讲座更倾向于从中级到高级.http://code.google.com/intl/fi-FI/edu/languages/index.html#_python_understanding (6认同)

Jas*_*sta 20

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


Mar*_*son 12

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

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


ins*_*get 10

我在一个夏天首先通过在python网站上做教程来学习python(遗憾的是,我似乎无法再找到它,所以我无法发布链接).

后来,我在大学的一年级课程中教我蟒蛇.在接下来的夏天,我练习了PythonChallenge以及来自Google Code Jam的问题.解决这些问题有助于从算法的角度以及从学习Python可以做什么的角度以及如何操纵它来充分利用python.

出于类似的原因,我听说代码高尔夫也有效,但我从来没有尝试过.

  • 你的意思是这个教程?Python 2:http://docs.python.org/tutorial/index.html; Python 3:http://docs.python.org/py3k/tutorial/index.html. (3认同)

Cap*_*ton 10

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

这不会让你成为大师,但要开始,尝试解决项目欧拉问题 如果你有高中数学并且知道谷歌如何,前50名左右不应该征税.当你解决一个问题时,你会进入论坛,在那里你可以看到其他人的解决方案,这些解决方案会教会你更多.虽然要体面,也不要发布你的解决方案,因为这个想法是鼓励人们为自己解决问题.

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

从我自己这样做,我学到了:

  • 文件IO
  • 动态规划等算法和技术
  • Python数据布局
    • 字典/包含HashMap
    • 清单
    • 元组
    • 其各种组合,例如字典列表的字典
  • 发电机
  • 递归函数
  • 开发Python库
    • 文件系统布局
    • 在翻译会话期间重新加载它们

而且非常重要

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

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

不可否认,我从那次经历中没有了解Python的OOP功能.

  • 我喜欢PE网站,但老实说:这是一个数学网站,而不是一个编程网站.大多数问题(或至少大多数我已经完成的问题)实际上归结为了解一些数学技巧而不是编程语言相关的任何问题.通常,论坛中的好解决方案会被天真的解决方案等浪潮所淹没. (3认同)

Tim*_*ker 7

您是否看过" 使用Python进行生物信息学编程 " 一书?看起来你是焦点小组的确切成员.

  • 在前一段时间快速浏览这本书后,我发现这本书不是很有趣.它面向非常新手的Python用户,问题本身并不是非常有趣.太糟糕了,这显然是Python使用量增加的一个领域.一本更刺激的书本来会很棒. (2认同)

Gre*_*all 6

你已经有了很多阅读材料,但如果你能处理更多,我建议你通过阅读Python增强建议来了解python的演变,特别是"已完成"的PEP和"延迟,放弃,撤回和拒绝"政治公众人物.

通过了解语言如何变化,做出的决定及其理由,您将吸收Python的哲学并理解"惯用的Python"是如何产生的.

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