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

我已经决定学习Python 3.对于之前的那些,你在这个过程中发现了哪些最有用的东西,希望你早点知道?

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

这是一个关键的事情,让我有点意识到,但现在我认为是至关重要的:其他语言将使内在的许多function实际上是由标准库和内置插件提供。

这个语言本身是小而简单的,但是,除非你熟悉标准库的内build和核心部分(比如现在的sysitertoolscollectionscopy …), itertools重复发明轮子。 所以,你花费更多的时间去熟悉这些部分,你的进步会更顺利。 每当你有一个任务你想要做,似乎并没有直接支持的语言,首先问自己:标准库中的内置或模块将使任务更简单,甚至做到这一点为了我? 有时候不会有任何东西,但更多的时候,通过继续这种思维方式,你会find出色的解决scheme。

  1. 我希望我不知道Java。
  2. 更多的function编程。 (请参阅itertools模块,列表理解,map(),reduce()或filter())

列表理解(干净地列表):

 [x for x in y if x > z] 

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

 (x for x in y if x > z) 

两件令人头痛的事情。 其中之一不适用于Python 3。

 a = 095 

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

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

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

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

学习如何使用iPython它有Tab完成。 使用“whos”查看名称空间中的所有元素。

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

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

大多数Python模块都有很好的文档。 从理论上讲,你可以学习iPython,其余的知识可以通过相同的工具来学习。

iPython也有一个debugging模式,pdb()。 最后,甚至可以使用iPython作为启用python的命令行。 基本的UNIX命令以%magic方式工作。 任何不是魔术命令的命令都可以执行:

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

不要有types的variables名称。 例如,不要将variables命名为“file”或“dict”

装饰。 编写自己的代码不是你可能想要做的事,但是从一开始就知道@staticmethod@classmethod是可用的(它们之间的区别)是一个真正的@classmethod

  • 在任何对象,类或path的shell中使用help()
  • 您可以运行import code; code.interact(local=locals()) import code; code.interact(local=locals())在你的代码中的任何地方,它会启动一个python shell在这个确切点
  • 您可以运行python -i yourscript.py在yourscript.py的末尾启动一个shell

最有用的: 深入Python 。 正如一位评论者指出的那样,如果你正在学习Python 3,那么Dive Into Python 3更适用。

更早地知道: virtualenv 。

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

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

当你重新testing一个模块,同时对一个从属模块进行大量的快速改变时, reload()是有用的。

尽可能多地学习一些常用的“成语”,否则当你认为这个成语是最好的方法时,你会find一个更好的方法去做一些事情,比如' '.join()或者为什么没有isInt(string)函数的答案….答案是你可以用一个try包装一个“可能的”整数的用法,然后捕获exception,如果它不是一个有效的int。运作良好,但当你第一次遇到这个问题听起来像是一个可怕的答案,所以你可以浪费大量的时间来说服你自己这是一个很好的方法。

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

从python.org读取:

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

列表parsing ,如果你来到Python新鲜(不是从早期版本)。

闭包。 干净简洁,而不必像Java这样的语言使用策略模式

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

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

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

如果你把它当作一本书的习语来学习的话,你不必为了这个标准的习惯而苦苦学习。 S.Lott已经解释了这一点:如果你试图让默认的初始化方法是一个空的列表,那么空的列表只会被计算一次(在编译时),而且你的类的每个默认初始化实例都会得到相同的列表实例,这不是在这里打算的。

有些习语可以保护你免受非预期的影响; 有些帮助你从语言中获得最佳performance; 有些只是风格的一小部分,这有助于其他Python迷更好地理解你的代码。

我从“ 学习Python ”一书中学到了东西,它向我介绍了一些成语。

这是一个致力于成语的网页: http : //python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

遵循最佳实践的Python成语的PS Python代码经常被称为“Pythonic”代码。

在我学习os.walk()之前,我实现了大量的recursion目录,

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

 >>> 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(Pythondebugging器):

 % python -m pdb poop.py 

在IPython中进入交互模式

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

当我开始使用python时,从例子的主要方法开始。 这是因为我不知道更好,之后我发现如何创build一个更好的主要方法。

我希望我知道如何在Python中惯用地编码。 你可以select你喜欢的任何语言,并开始编码,如C,Java等,但理想情况下,你将学习用语言的“精神”进行编码。 Python是特别相关的,因为我认为它有一个确定的风格。

虽然我在Python的职业生涯中发现了一些比我想要的更好的东西,但是这篇优秀的文章包含了许多Python成语以及使它变得特别的小技巧。 到目前为止,人们在他们的答案中提到的几个东西都包含在内部: 代码就像Pythonista:Python语言 。

请享用!

顺序导入覆盖:

如果你像这样导入两个文件:

 from foo import * from bar import * 

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

 import foo import bar 

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

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

Tab完成和一般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()命令四处探询,直到find我需要。

生成器和列表parsing比你想象的更有用。 不要忽略它们。

我希望我知道一个function语言。 在使用Clojure之后,我意识到很多Python的function性思想都是从Lisp或其他function性的语言中借用的

漂亮的印刷:

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

%s为string

%d为整数

%f为浮点数

%.xf精确到浮点数的许多小数位。 如果浮点数有较小的小数点,则加上0

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

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

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

这个多核心是未来。 仍然爱Python。 这是写我的代码公平的一点对我来说。

function编程工具,就像all一样