我一直在学习,工作和玩Python一年半 . 随着生物学家慢慢转向生物信息学,这种语言一直是我在实验室做出的所有主要贡献的核心 . 我或多或少地爱上了Python允许我表达美妙解决方案的方式,以及语言的语义,允许从思想到可行代码的这种自然流动 .
我想知道的是你对我在这个论坛或其他论坛中很少见到的一个问题的答案 . 对于那些正在改进Python的人来说,这个问题似乎对我来说至关重要,但是谁想知道他的下一步应该是什么 .
让我总结一下我不想先问的问题;)
-
我不想知道如何快速学习Python
-
我也不想找到熟悉该语言的最佳方法
-
最后,我不是一个可以做到这一切的伎俩 .
我想知道你的意见,是:
What are the steps YOU would recommend to a Python journeyman, from apprenticeship to guru status (feel free to stop wherever your expertise dictates it), in order that one IMPROVES CONSTANTLY, becoming a better and better Python coder, one step at a time. Some of the people on SO almost seem worthy of worship for their Python prowess, please enlighten us :)
我会喜欢的答案(但随意给读者带来惊喜:P)的格式或多或少是这样的:
-
阅读本文(例如:python教程),注意那种细节
-
代码多次/问题/代码行
-
然后,阅读本文(例如:这本书或那本书),但这一次,请注意这一点
-
解决一些现实生活中的问题
-
然后,继续阅读Y.
-
一定要掌握这些概念
-
X时间代码
-
回到这样的基础知识或进一步向...
-
(你明白了:)
我非常关心在不同的阶段知道你应该注意什么的意见,以便不断进步(当然要付出适当的努力) . 如果您来自特定的专业领域,请在此字段中讨论您认为合适的路径 .
编辑:感谢您的大力投入,我回到了Python改进轨道!我真的很感激!
19 回答
我会给你最简单,最有效的建议,我认为任何人都可以给你: code .
您只能通过编码更好地使用语言(这意味着理解它) . 您必须自己积极地享受编码,获得灵感,提出问题并找到答案 .
有一个小时的空余时间?编写将反转字符串的代码,并找出最佳解决方案 . 一个免费的晚上?为什么不尝试一些网络抓取 . 阅读其他人的代码 . 看看他们是如何做的 . 问问自己你会做什么 .
当我对我的计算机感到无聊时,我打开了我的IDE和代码风暴 . 我记下听起来很有趣,充满挑战的想法 . 一个URL缩短器?当然,我可以做到 . 哦,我学会了如何将数字从一个基数转换为另一个作为副作用!
无论您的技能水平如何,这都是有效你永远不会停止学习 . 通过在业余时间积极编码,您只需付出额外的努力就可以了解语言,并最终成为一名大师 . 您将构建知识和可重用代码并记住习语 .
提升Python知识的一个好方法是 dig into the source code of the libraries, platforms, and frameworks you use already.
例如,如果您在Django上构建网站,可以通过查看Django如何实现相关功能来回答许多可能存在问题的问题 .
这样你就会继续 pick up new idioms, coding styles, and Python tricks . (有些会很好,有些会很糟糕 . )
当你在源头中看到一些你不理解的Pythony时,你会发现很多"language lawyers"很乐意解释 .
多年来对这些小小的澄清的积累导致对语言及其所有细节的更深入的理解 .
不完全是你所要求的,但我认为这是一个很好的建议 .
学习另一种语言,没有你可以学习的自己的想法和习惯 . 了解语言的差异,更重要的是
why
它们是不同的 . 尝试像Haskell这样的纯函数式语言,看看没有副作用的函数的一些好处(和挑战) . 了解如何将您从其他语言中学到的一些内容应用到Python中 .Understand Introspection
写一个
dir()
等价物写一个
type()
等价物弄清楚如何"monkey-patch"
使用
dis
模块查看各种语言结构的工作原理做这些事情会
为您提供有关如何实现python的一些很好的理论知识
为您提供一些低级编程的实践经验
为python数据结构提供了良好的直观感觉
Thoroughly Understand All Data Types and Structures
对于每种类型和结构,编写一系列演示程序,以演练类型或数据结构的每个方面 . 如果你这样做,可能值得在每个人的博客上发表评论...它可能对很多人有用!
向正在开始学习Python的其他人进行教学总是一种很好的方法可以让你的想法清晰有时,我通常会从中获得很多很好的问题 . 让我重新思考Python概念性事物的学生 .
我建议从强迫您探索语法表达能力的东西开始 . Python允许使用许多不同的方式编写相同的功能,但通常只有一种最优雅,最快速的方法 . 如果你习惯了其他语言的习语,你可能永远不会找到或接受这些更好的方法 . 我花了一个周末来讨论前20个左右Project Euler问题,并在Google App Engine上用Django做了一个简单的webapp . 这只会让你从学徒到新手,但是你可以继续制作更高级的webapps并解决更高级的Project Euler问题 . 几个月后,我回去,在一小时而不是周末从头开始解决了前20个PE问题 .
Understand (more deeply) Python's data types and their roles with regards to memory mgmt
正如社区中的一些人所知,I teach Python courses,最受欢迎的是全面的介绍中级课程以及介绍应用程序开发的各个领域的"advanced"课程 .
很多时候,我被问到一个非常类似的问题,“我应该参加你的介绍或高级课程吗?我想直接跳到高级课程......你会推荐哪个课程?”
为了回答他们的问题,我探究了他们在这方面的强大程度 - 不是说它已经为任何高级课程做好了准备,而是要了解他们对Python的对象和内存模型的基本知识有多好,这是一个原因 . 许多Python错误由那些不仅是初学者而且已经超越了那些人的人编写 .
为此,我将他们指向这个简单的两部分测验问题:
很多时候,他们能够获得输出,但为什么更难以及更重要的回应......我会将输出权衡为答案的20%而"why"获得80%的信用 . 如果他们能够在1 - 2年后使用_75164的语法,那么除非你对Python的工作方式有了更好的理解,否则你不会让自己更好地理解"beginner"标签 . )
需要类似答案的后续调查甚至更难,例如,
Example 3
我推荐的下一个主题是很好地理解引用计数,学习“实习”意味着什么(但不一定使用它),学习浅层和深层副本(如上面的例3所示),最后是各种类型之间的相互关系 . 语言中的构造,即列表与元组,dicts与集合,列表推导与生成器表达式,迭代器与生成器等等;然而,所有其他建议是另一个时间的另一个帖子 . 希望这有助于此期间! :-)
PS . 我同意其他回应,以便更深入地了解内省以及研究其他项目的源代码,并为这两个建议添加强大的“1”!
PPS . 好问题BTW . 我希望我在开始时能够很聪明地问这样的事情,但那是很久以前的事了,现在我正在尝试用我多年的全职Python编程来帮助别人!
下载Twisted并查看源代码 . 他们采用了一些非常先进的技术
我在一个夏天首先通过在python网站上做教程来学习python(遗憾的是,我似乎无法再找到它了,所以我无法发布链接) .
后来,我在大学的一年级课程中教我蟒蛇 . 在接下来的夏天,我练习了PythonChallenge并且遇到了来自Google Code Jam的问题 . 解决这些问题有助于从算法的角度以及从学习Python可以做什么的角度以及如何操纵它来充分利用python .
出于类似的原因,我听说code golf也有效,但我从来没有为自己尝试过 .
如果你正在使用python进行科学研究(你似乎是),其中一部分将是学习和理解科学图书馆,对我来说这些将是
numpy
scipy
matplotlib
mayavi / mlab
chaco
Cython
了解如何使用正确的库并对代码进行矢量化对于科学计算至关重要 .
我想补充一点,以常见的pythonic方式处理大型数值数据集(面向对象的方法,列表,迭代器)可能效率极低 . 在科学计算中,可能需要以与大多数传统python编码器处理数据的方式大不相同的方式构建代码 .
谷歌最近刚刚发布了一个在线Python课程(“课程”中的“课程”) .
http://code.google.com/edu/languages/google-python-class/
我知道这不能回答你的完整问题,但我认为这是一个很好的起点!
学习算法/数学/文件IO / Pythonic优化
这不会让你成为大师,但是要开始,尝试通过Project Euler problems前50个左右的解决方案,这将会教你更多 . 虽然要体面,也不要将你的解决方案作为想法发布是鼓励人们为自己解决问题 .
如果你使用暴力算法,强迫自己在Python中工作是不可原谅的 . 这将教您如何在内存中布置大型数据集,并使用字典等快速语言功能有效地访问它们 .
From doing this myself I learnt:
文件IO
算法和技术,如动态规划
Python数据布局
字典/哈希映射
列表
元组
其各种组合,例如字典列表中的元组
发电机
递归函数
开发Python库
文件系统布局
在翻译会话期间重新加载它们
And also very importantly
All of this should be relevant to Bioinformatics
不可否认,我从那次经历中没有了解Python的OOP功能 .
我认为Python掌握的过程类似于:
发现list comprehensions
发现generators
经常将map, reduce, filter, iter, range, xrange合并到您的代码中
发现Decorators
编写递归函数,很多
发现itertools和functools
阅读Real World Haskell(read free online)
用大量高阶函数,递归和诸如此类的函数重写所有旧的Python代码 .
每次向他们展示Python课程时,你的小隔间都会惹恼你 . 声称它可以"better"实现为字典和一些功能 . 拥抱功能编程 .
重新发现Strategy模式,然后从Haskell之后难以忘记的命令式代码中重新发现all those things .
找到一个 balancer 点 .
看看Peter Norvig在10年内成为一名大师级程序员的文章:http://norvig.com/21-days.html . 我敢打赌任何语言都适用 .
使用Python尝试http://challenge.greplin.com/
你看过这本书“Bioinformatics Programming using Python”了吗?看起来你是焦点小组的确切成员 .
你已经有了很多阅读材料,但是如果你能处理更多,我建议你通过阅读Python增强建议来了解python的演变,特别是“已完成”的PEP和“延迟,放弃,撤回和拒绝”政治公众人物 .
通过了解语言如何变化,做出的决定及其理由,您将吸收Python的哲学并理解“惯用的Python”是如何产生的 .
http://www.python.org/dev/peps/