代码之家  ›  专栏  ›  技术社区  ›  TheCodeJunkie

巨蟒前进之路-从学徒到大师

  •  659
  • TheCodeJunkie  · 技术社区  · 6 年前

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

    我想知道的是你对我在这个论坛或其他论坛上很少看到的问题的回答。这个问题对我来说似乎是任何一个在Python改进之路上的人的核心,但谁又怀疑他的下一步应该是什么呢?

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

    • 我不想知道如何快速学习巨蟒
    • 我也不想找出了解这门语言的最佳方法
    • 最后,我不想知道一个“一招到底”的方法。

    我想知道你的意见是:

    你会向一个从学徒到大师级的Python熟练工推荐哪些步骤(无论你的专业技能如何要求,请随时停止),以便一个人不断改进,成为一个更好的Python编码人员,一步一步地。上面的一些人似乎很值得崇拜他们的巨蟒能力,请启发我们:)

    我喜欢的答案(但请随意给读者带来惊喜:p)的格式大致如下:

    • 阅读这个(例如:python教程),注意那些细节
    • So Manytime/问题/代码行的代码
    • 那么,读这本书(如:这本书或那本书),但这次,要注意这一点。
    • 解决一些现实问题
    • 然后,继续读Y。
    • 一定要掌握这些概念
    • X时间代码
    • 回到这样的基础上,或者更进一步……
    • (你明白了:)

    我真的很关心你对一个人应该注意什么的看法,在不同的阶段,为了不断的进步(当然,有适当的努力)。如果您来自某个特定的专业领域,请讨论您在该领域中看到的适当路径。

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

    19 回复  |  直到 11 年前
        1
  •  471
  •   wheaties    12 年前

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

    1. 发现 list comprehensions
    2. 发现 generators
    3. 合并 map, reduce, filter, iter, range, xrange 经常进入你的代码
    4. 发现 Decorators
    5. 写递归函数,很多
    6. 发现 itertools functools
    7. Real World Haskell ( read free online )
    8. 用大量的高阶函数、递归等等重写所有旧的python代码。
    9. 每次你的同事给你上Python课程时,都会惹恼他们。声称它可以作为字典和一些函数“更好地”实现。接受函数式编程。
    10. 重新发现 Strategy 模式,然后 all those things 从命令式代码中,你在haskell之后很难忘记。
    11. 找到平衡点。
        2
  •  108
  •   dkamins    15 年前

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

    例如,如果您正在 Django ,通过查看Django如何实现所讨论的特性,可以回答许多可能会让您感到困惑的问题。

    这样你就可以继续 学习新的习惯用法、编码风格和Python技巧 . (有些是好的,有些是坏的。)

    当你在源头上看到你不理解的东西时, 跳到python irc频道 你会发现很多“语言律师”乐于解释。

    多年来,这些小小的澄清积累起来,导致人们对语言及其所有的内在和外在都有了更深的理解。

        3
  •  92
  •   mghie    14 年前

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

    正如你们社区中的一些人所知道的, I teach Python courses 最受欢迎的课程是综合介绍+中级课程,以及介绍各种应用程序开发领域的“高级”课程。

    经常有人问我一个类似的问题:“我应该参加你的入门课程还是高级课程?”我已经为python编程了1-2年了,我觉得介绍版对我来说太简单了,所以我想直接跳到高级版本……哪道菜可以 推荐?“

    为了回答他们的问题,我调查了他们在这方面有多强——不是说这确实是衡量他们是否准备好接受任何高级课程的最好方法,而是看看他们对Python对象和内存模型的基本知识有多好,这是 许多的 python bugs是由那些不仅是初学者,而且是那些超越了这一点的人编写的。

    为了做到这一点,我将他们引向这个由两部分组成的简单测验问题: 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体验,我总是引导人们学习全面的intro+中间课程,因为我花了一堂关于对象和内存管理的讲座,你应该能够用输出来回答,为什么用足够的C来回答。有信心。(仅仅因为你在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所示),以及语言中各种类型和构造之间的相互关系,即.lists vs.tuples、dicts vs.set、list expressions vs.generator expressions、iterators vs.generator等;不过,所有其他建议都是另一个帖子。希望这对我们有所帮助!-)

    附言:我同意其他的回答,以更密切地了解内省,以及研究其他项目的源代码,并添加一个强大的“+1”到这两个建议!

    PPS。好问题,顺便说一句,我希望我在一开始就足够聪明,能够问这样的问题,但那是很久以前的事了,现在我正努力帮助其他人完成我多年的Python编程!!

        4
  •  67
  •   twneale    15 年前

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

        5
  •  59
  •   UnkwnTech    13 年前

    了解内省

    • 写一个 dir() 相等的
    • 写一个 type() 相等的
    • 想办法 "monkey-patch"
    • 使用 dis 模块查看各种语言构造的工作方式

    做这些事会

    • 给你一些关于如何实现python的理论知识
    • 给你一些很好的低层编程实践经验
    • 让您对Python数据结构有很好的直观感受
        6
  •  48
  •   Amit    14 年前
    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?
    
        7
  •  41
  •   Humphrey Bogart    15 年前

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

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

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

    当我对电脑感到厌烦时,我会打开我的IDE并对Storm进行编码。我记下了一些听起来有趣且富有挑战性的想法。网址缩短器?当然,我能做到。哦,我学会了如何将数字从一个基数转换为另一个基数作为副作用!

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

        8
  •  24
  •   user503635    13 年前

    如果你正在使用python进行科学研究(你似乎就是这样),那么其中的一部分就是学习和理解科学库,对我来说,这些就是

    • 麻木的
    • 斯皮皮
    • Matplotlib公司
    • 马亚维/姆拉布
    • 查科
    • 赛隆

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

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

        9
  •  23
  •   dkamins    15 年前

    Google最近发布了一个在线的python类(“class”和“a course of study”)。

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

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

        10
  •  20
  •   Jason Christa    15 年前

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

        11
  •  12
  •   Mark Harrison    15 年前

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

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

        12
  •  10
  •   inspectorG4dget    15 年前

    在一个夏天里,我独自一人在python网站上学习了python(不幸的是,我似乎再也找不到它了,所以我不能发布链接)。

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

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

        13
  •  10
  •   Captain Lepton    14 年前

    学习算法/数学/文件IO/蟒蛇优化

    这不会让你成为大师,但要开始,试着通过 Project Euler problems 如果你有良好的高中数学知识并且知道如何使用谷歌,前50名左右的人不应该对你征税。当你解决一个问题时,你会进入论坛,在那里你可以浏览其他人的解决方案,这将教会你更多。但是要体面,不要把你的解决方案贴出来,因为这样做的目的是鼓励人们自己解决问题。

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

    我自己做这件事学到了:

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

    也是非常重要的

    • 何时放弃并使用C或C++!

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

    诚然,我并没有从这次经历中了解到Python的OOP特性。

        14
  •  7
  •   Tim Pietzcker    15 年前

    你看过这本书吗? Bioinformatics Programming using Python “?看来你是它焦点小组的一员。

        15
  •  6
  •   Greg Ball    15 年前

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

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

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

        16
  •  5
  •   Nam Ngo    13 年前
        17
  •  3
  •   Marc-Olivier Titeux    14 年前

    向其他开始学习python的人授课总是让你的想法清晰的好方法,有时,我会从学生那里得到许多整洁的问题,让我重新思考关于python的概念性问题。

        18
  •  2
  •   Davy8    15 年前

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

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

        19
  •  2
  •   hus787    11 年前

    我建议从一些迫使您探索语法表达能力的东西开始。Python允许多种不同的方式来编写相同的功能,但通常有一种最优雅、最快速的方法。如果你习惯了其他语言的习语,你可能永远不会找到或接受这些更好的方法。我花了一个周末艰难地度过了前20年左右。 Project Euler 在谷歌应用引擎上用django制作了一个简单的webapp。这可能只会让你从学徒变成新手,但是你可以继续制作一些更高级的webapps,解决更高级的ProjectEuler问题。几个月后,我回去解决了前20个体育问题从头开始在一个小时而不是一个周末。