What do you wish you'd known about when you started learning Python?
我决定学Python3。对于那些已经过去的人,你发现什么最有用,希望你早点知道?
我在1.5.2版本之前学习过Python,所以当时对我来说很关键的东西可能不是今天的关键。
也就是说,我花了一点时间才意识到这一点,但现在我认为这一点很重要:标准库和内置程序实际上提供了许多其他语言固有的功能。
语言本身很小也很简单,但是在你熟悉标准库的内置和"核心部分"(例如,现在,
列表理解(清晰地列出列表):
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 删除重复项。 - 在
itertools 和collections 模块中几乎所有的东西。 - 函数参数的
* 和** 前缀是如何工作的。 - 函数的默认参数如何在内部工作(即
f.func_defaults 是什么)。 - 如何(为什么,真的)设计功能,以便与
map 和zip 结合使用。 __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"
装饰工。写自己的东西并不是你想马上做的事情,但你要知道,从一开始,
- 在shell中对任何对象、类或路径使用
help() 。 - 您可以在代码中的任何地方运行
import code; ,它将在该点启动一个python shell。
code.interact(local=locals()) - 可以运行
python -i yourscript.py 在script.py的末尾启动shell。
最有用的:潜入Python。正如一位评论者指出的那样,如果您正在学习python 3,那么深入了解python 3更适用。
早就知道了:virtualenv。
单个项的元组必须以逗号结尾,否则将不会被解释为元组。
当您在测试模块的同时对依赖模块进行大量快速更改时,
尽可能多地学习常见的"习语",否则当习语真的被认为是最好的方法时(例如,像
这些事情浪费了我几个小时的时间来确定我的一些代码初稿是错误的,确实是可以接受的。
阅读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中的多个核心。使用
标签完成和一般的阅读线支持,包括历史,甚至在常规的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或其他功能语言中借用的。
功能编程工具,如
我真正喜欢的是:列表理解、闭包(和高阶函数)、元组、lambda函数、无痛的bignumber。
我希望我早点知道的是:在代码中使用Python习语(例如,列表理解而不是列表循环)的速度更快。
多核是未来。还是喜欢Python。它为我写了不少代码。
我真的很喜欢列表理解和所有其他的半功能结构。我希望我在第一个Python项目中就知道这些。