当你开始学习Python的时候,你希望你知道些什么?

What do you wish you'd known about when you started learning Python?

我决定学Python3。对于那些已经过去的人,你发现什么最有用,希望你早点知道?


我在1.5.2版本之前学习过Python,所以当时对我来说很关键的东西可能不是今天的关键。

也就是说,我花了一点时间才意识到这一点,但现在我认为这一点很重要:标准库和内置程序实际上提供了许多其他语言固有的功能。

语言本身很小也很简单,但是在你熟悉标准库的内置和"核心部分"(例如,现在,sysitertoolscollectionscopy…)之前,你会不断地重新发明轮子。所以,你花越多的时间熟悉这些部分,你的进展就越顺利。每当你有一个你想做的任务时,这似乎不是语言直接支持的,首先问问你自己:标准库中的什么内置或模块会使任务变得更简单,甚至为我做所有的事情?有时不会有任何解决方案,但通常情况下,你会用这种思维方式找到很好的解决方案。


  • 我真希望我不懂JAVA。
  • 更多功能编程。(请参阅ITertools模块、列表理解、map()、reduce()或filter())

  • 列表理解(清晰地列出列表):

    1
    [x for x in y if x > z]

    生成器扩展(与列表理解相同,但在使用之前不进行评估):

    1
    (x for x in y if x > z)


    两个大脑痉挛的东西。其中之一不适用于Python3。

    1
    a = 095

    不起作用。为什么?前导零是八进制文字。9在八进制文字中无效。

    1
    2
    3
    def foo( bar=[] ):
        bar.append( 1 )
        return bar

    不起作用。为什么?可变的默认对象将被重用。


    • enumerate的用途。
    • seq = seq.append(item)seq = seq.sort()都将seq设置为None
    • 使用set删除重复项。
    • itertoolscollections模块中几乎所有的东西。
    • 函数参数的***前缀是如何工作的。
    • 函数的默认参数如何在内部工作(即f.func_defaults是什么)。
    • 如何(为什么,真的)设计功能,以便与mapzip结合使用。
    • __dict__在班级中的作用。
    • import实际做的。


    学习如何使用ipython它的标签完成了。使用"whos"查看命名空间中的所有元素。

    导入模块后,很容易查看代码:

    1
    2
    3
    >>> import os
    >>> os?? # this display the actual source of the method
    >>> help() # Python's interactive help. Fantastic!

    大多数Python模块都有很好的文档记录;理论上,您可以学习ipython,而您需要知道的其他内容可以通过相同的工具学习。

    IPython还具有调试模式pdb()。最后,您甚至可以使用ipython作为启用了python的命令行。基本的unix命令作为%magic方法工作。可以执行任何非magic命令:

    1
    >>> os.system('cp file1 file2')


    没有类型的变量名。例如,不要将变量命名为"file"或"dict"


    装饰工。写自己的东西并不是你想马上做的事情,但你要知道,从一开始,@staticmethod@classmethod就可以使用(以及它们之间的区别),这才是真正的好处。


    • 在shell中对任何对象、类或路径使用help()
    • 您可以在代码中的任何地方运行import code;
      code.interact(local=locals())
      ,它将在该点启动一个python shell。
    • 可以运行python -i yourscript.py在script.py的末尾启动shell。


    最有用的:潜入Python。正如一位评论者指出的那样,如果您正在学习python 3,那么深入了解python 3更适用。

    早就知道了:virtualenv。


    单个项的元组必须以逗号结尾,否则将不会被解释为元组。

    pprint()非常方便(是的,2 p's)

    当您在测试模块的同时对依赖模块进行大量快速更改时,reload()非常有用。

    尽可能多地学习常见的"习语",否则当习语真的被认为是最好的方法时(例如,像' '.join()这样难看的表达,或者没有isInt(string)功能的答案),你会绞尽脑汁寻找更好的方法。答案是你可以用一次尝试来包装一个"可能"整数的用法:然后如果它不是一个有效的int,就捕获这个异常。这个解决方案工作得很好,但是当你第一次遇到它时,它听起来是一个糟糕的答案,所以你可以浪费很多时间说服自己它确实是一个很好的方法。

    这些事情浪费了我几个小时的时间来确定我的一些代码初稿是错误的,确实是可以接受的。

    阅读python.org:

    http://wiki.python.org/moin/初学者错误withpythonprogramminghttp://wiki.python.org/moin/pythonwarts网站


    在了解os.walk()之前,我手工实现了大量递归目录遍历。


    列出理解,如果您要使用python fresh(而不是早期版本)。


    关闭。简洁明了,不用像Java这样的语言使用策略模式。


    如果你从一本好书中学习,它不仅会教你语言,还会教你常见的习语。这些成语很有价值。

    例如,下面是用列表初始化类实例的标准习惯用法:

    1
    2
    3
    4
    5
    6
    class Foo(object):
        def __init__(self, lst=None):
            if lst is None:
                self.lst = []
            else:
                self.lst = lst

    如果你从一本书中把它当作习语来学习,你就不必费劲地去学习为什么它是标准习语。@s.lott已经解释过这一点:如果您试图使默认的初始值设定项为空列表,则空列表只被计算一次(在编译时),并且类的每个默认初始化实例都得到相同的列表实例,这不是此处的预期。

    一些习惯用法可以保护您不受非预期效果的影响;一些习惯用法可以帮助您从语言中获得最佳性能;还有一些习惯用法只是风格的一个小方面,它可以帮助其他Python爱好者更好地理解您的代码。

    我从《学习Python》一书中学到了一些习惯用法。

    下面是一个专门介绍成语的网页:http://python.net/~goodger/projects/pycon/2007/tylamatic/message.html

    遵循最佳实践的python习惯用法的p.s.python代码通常被称为"pythonic"代码。


    匿名函数

    http://www.diveintopython.org/power_of_introspection/lambda_functions.html


    我最近学到的最酷的事情之一是命令模块:

    1
    2
    3
    >>> import commands
    >>> commands.getoutput('uptime')
    '18:24  up 10:22, 7 users, load averages: 0.37 0.45 0.41'

    它类似于os.popen或os.system,但没有所有的拒绝警告。

    让我们不要忘记PDB(Python调试器):

    1
    % python -m pdb poop.py


    在IPython中进入交互模式

    1
    2
    3
    from IPython.Shell import IPShellEmbed
    ipshell = IPShellEmbed()
    ipshell()

    当我开始使用Python时,首先从示例中的主要方法开始。这是因为我不知道更好,之后我发现了这个关于如何创建更好的主要方法。


    顺序导入覆盖:

    如果导入两个这样的文件:

    1
    2
    from foo import *
    from bar import *

    如果foo.py和bar.py都有一个名为fubar()的函数,以这种方式导入了文件,那么在调用fubar时,将执行bar.py中定义的fubar。避免这种情况的最佳方法是:

    1
    2
    import foo
    import bar

    然后打电话给foo.fubar或bar.fubar。这样,您总是知道将执行哪个文件的fubar定义。


    也许更高级一点,但我希望我知道您不使用线程来利用(c)python中的多个核心。使用multiprocessing库。


    标签完成和一般的阅读线支持,包括历史,甚至在常规的python shell中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ cat ~/.pythonrc.py
    #!/usr/bin/env python

    try:
        import readline
    except ImportError:
        print("Module readline not available.")
    else:
        import rlcompleter
        readline.parse_and_bind("tab: complete")

        import os
        histfile = os.path.join(os.environ["HOME"],".pyhist")
        try:
            readline.read_history_file(histfile)
        except IOError:
            pass
        import atexit
        atexit.register(readline.write_history_file, histfile)
        del os, histfile

    然后在.bashrc中添加一行

    1
    export PYTHONSTARTUP=~/.pythonrc.py

    这两件事导致了一种探索性的编程风格"它看起来像这个库可以做我想做的事情",所以我启动了python shell,然后使用tab completion和help()命令进行浏览,直到找到我需要的东西。

    生成器和列表理解比您想象的更有用。不要忽视它们。


    我真希望我能马上知道如何用Python进行惯用编码。你可以拿起你喜欢的任何语言,然后开始编码,比如C语言、Java语言等等。但理想的是,你将学会用语言的"精神"来编码。Python特别相关,因为我认为它有自己的明确风格。

    虽然在我的python职业生涯中我发现它比我希望的晚了一点,但这篇优秀的文章总结了许多python习惯用法和使它与众不同的小技巧。到目前为止,人们在回答中提到的几个问题包含在:像Python一样的代码:惯用的Python。

    享受!


    漂亮的打印:

    1
    2
    >>> print"%s world" %('hello')
    hello world

    字符串的%s

    整数的%d

    浮动的%F

    %.xf表示一个浮点的精确x个小数位。如果浮点数的小数位数较小,则加0。


    我希望我能很好地掌握一门实用语言。在使用Clojure之后,我意识到许多Python的功能思想都是从Lisp或其他功能语言中借用的。


    功能编程工具,如allany


    我真正喜欢的是:列表理解、闭包(和高阶函数)、元组、lambda函数、无痛的bignumber。

    我希望我早点知道的是:在代码中使用Python习语(例如,列表理解而不是列表循环)的速度更快。


    多核是未来。还是喜欢Python。它为我写了不少代码。


    我真的很喜欢列表理解和所有其他的半功能结构。我希望我在第一个Python项目中就知道这些。