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

时间:2009-11-10 19:01:04

标签: python

我已经决定学习Python 3.对于那些之前已经发生过的事情,你发现什么是最有用的,并希望你早点知道?

29 个答案:

答案 0 :(得分:57)

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

话虽如此,一个关键的事情让我有点意识到,但我现在认为至关重要:其他语言将使内在的许多功能实际上由标准库和内置函数提供。

语言本身既小又简单,但在您熟悉标准库的内置插件和“核心部分”之前(例如,现在,sysitertools,{ {1}},collections,...),你将一遍又一遍地重新发明轮子。因此,您投入熟悉这些部件的时间越多,您的进度就会越顺畅。每当你有一个你想要做的任务时,这似乎没有语言直接支持,首先要问自己:标准库中的内置函数或模块将使任务更简单,甚至可以全部完成为了我?有时不会有任何,但通常会通过这种思维方式找到出色的解决方案。

答案 1 :(得分:33)

  1. 我希望我不懂Java。
  2. 更多功能编程。 (参见itertools模块,列表推导,map(),reduce()或filter())

答案 2 :(得分:28)

列表理解(清楚地列出清单):

[x for x in y if x > z]

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

(x for x in y if x > z)

答案 3 :(得分:25)

两个脑痉挛的事情。其中一个不适用于Python 3。

a = 095

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

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

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

答案 4 :(得分:20)

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

答案 5 :(得分:17)

了解如何使用iPython 它有Tab完成。 使用'whos'查看命名空间中的所有元素。

导入模块后,可以轻松查看代码:

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

大多数Python模块都有详细记录;从理论上讲,你可以学习iPython,你可以通过同一个工具学习你需要知道的其他内容。

iPython还有一个调试模式,pdb()。 最后,您甚至可以将iPython用作启用python的命令行。基本的UNIX命令用作%魔术方法。任何非魔术命令的命令都可以执行:

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

答案 6 :(得分:16)

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

答案 7 :(得分:13)

装修。编写自己的东西不是你可能想要立即做的事情,但是知道@staticmethod@classmethod从一开始就可用(以及它们之间的区别)是一个真正的优点。

答案 8 :(得分:7)

  • 在任何对象,类或路径的shell中使用help()
  • 您可以在代码中的任何位置运行import code; code.interact(local=locals()),它将在该确切位置启动python shell
  • 您可以在yourscript.py
  • 的末尾运行python -i yourscript.py来启动shell

答案 9 :(得分:5)

最有帮助:Dive Into Python。正如评论者指出的那样,如果您正在学习Python 3,Dive Into Python 3更适用。

早点知道:virtualenv

答案 10 :(得分:5)

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

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

当您在对依赖模块进行大量快速更改的同时重新测试模块时,

reload()非常有用。

尽可能多地学习常用的“习语”,否则当你习惯性地被认为是最好的方式时(例如{{1}这样丑陋的表达方式),你会想到更好的方法来寻找更好的方法。 },或者为什么没有' '.join()函数的答案....答案是你可以用try来包装“可能”整数的用法:然后如果它不是有效的int则捕获异常解决方案效果很好,但是当你第一次遇到它时听起来像是一个糟糕的答案,所以你可以浪费很多时间说服自己这是一个很好的方法。

有些事情浪费了我几个小时的时间来确定我的第一稿中哪些代码感觉不对,真的是可以接受的。

来自python.org的阅读材料:

http://wiki.python.org/moin/BeginnerErrorsWithPythonProgramming http://wiki.python.org/moin/PythonWarts

答案 11 :(得分:4)

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

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

class Foo(object):
    def __init__(self, lst=None):
        if lst is None:
            self.lst = []
        else:
            self.lst = lst

如果你从书中学到这个习语,你就不必学习为什么这是标准的习语。 @ S.Lott已经解释了这一点:如果你试图使默认初始化器成为一个空列表,那么空列表只会被评估一次(在编译时),并且每个默认初始化的类实例都会得到相同的< / em> list instance,这不是这里的目的。

有些习语会保护你免受非预期的影响;一些帮助您从语言中获得最佳表现;有些只是小风格,可以帮助其他Python粉丝更好地理解你的代码。

我从书中了解到Learning Python,并向我介绍了一些习语。

以下是专门针对习语的网页: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

P.S。遵循最佳实践Python惯用法的Python代码通常称为“Pythonic”代码。

答案 12 :(得分:4)

闭包。干净简洁,无需使用与Java等语言不同的策略模式

答案 13 :(得分:4)

在我了解os.walk()

之前,我手动实现了大量的递归目录遍历

答案 14 :(得分:4)

List comprehensions,如果您要使用Python(不是早期版本)。

答案 15 :(得分:3)

答案 16 :(得分: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,但没有所有的DeprecationWarnings。

让我们不要忘记PDB(Python Debugger):

% python -m pdb poop.py

答案 17 :(得分:3)

在IPython中放入交互模式

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell()

答案 18 :(得分:3)

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

答案 19 :(得分:2)

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

答案 20 :(得分:2)

顺序导入覆盖:

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

from foo import *
from bar import *

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

import foo
import bar

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

答案 21 :(得分:2)

选项卡完成和一般readline支持,包括历史记录,甚至在常规python shell中。

$ 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

中添加一行
export PYTHONSTARTUP=~/.pythonrc.py

这两件事导致探索性的编程风格“看起来这个库可能会做我想要的”,所以然后我启动python shell然后使用tab-completion和help()命令四处寻找直到我找到我需要的东西。

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

答案 22 :(得分:1)

漂亮的印刷:

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

%s表示字符串

%d表示整数

%f for float

%。xf表示一个浮点数的x多个小数位。如果float指示的小数位数较小,则添加0

答案 23 :(得分:1)

我希望我熟悉一种功能语言。在与Clojure一起玩之后,我意识到许多Python的功能性思想都是从Lisp或其他功能性语言中借用的

答案 24 :(得分:1)

我希望我知道如何在Python中以惯用方式编码。你可以选择你喜欢的任何语言,并开始编写它的C,Java等编码,但理想情况下你将学会用语言的“精神”编码。 Python特别重要,因为我认为它有自己独特的风格。

虽然我在Python职业生涯中发现的时间比我希望的要晚一些,但是这篇优秀的文章包含了许多Python习语以及使它变得特别的小技巧。到目前为止,人们在答案中提到的一些内容包含在: Code Like a Pythonista: Idiomatic Python

享受!

答案 25 :(得分:0)

多核是未来。还是喜欢Python。它为我写了一些我的代码。

答案 26 :(得分:0)

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

我希望我早点知道:在代码中使用Python习语(例如列表推导而不是列表上的循环)的事实更快。

答案 27 :(得分:0)

我非常喜欢列表理解和所有其他半功能构造。我希望在第一个Python项目中我知道这些。

答案 28 :(得分:0)

功能编程工具,例如allany