当你开始学习Python时,你希望你知道些什么?
我已经决定学习Python 3.对于之前的那些,你在这个过程中发现了哪些最有用的东西,希望你早点知道?
在1.5.2发行版之前,我学习了Python,所以当时对我来说关键的东西可能不是今天的关键。
这是一个关键的事情,让我有点意识到,但现在我认为是至关重要的:其他语言将使内在的许多function实际上是由标准库和内置插件提供。
这个语言本身是小而简单的,但是,除非你熟悉标准库的内build和核心部分(比如现在的sys
, itertools
, collections
, copy
…), itertools
重复发明轮子。 所以,你花费更多的时间去熟悉这些部分,你的进步会更顺利。 每当你有一个任务你想要做,似乎并没有直接支持的语言,首先问自己:标准库中的内置或模块将使任务更简单,甚至做到这一点为了我? 有时候不会有任何东西,但更多的时候,通过继续这种思维方式,你会find出色的解决scheme。
- 我希望我不知道Java。
- 更多的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
删除重复。 - 几乎所有的
itertools
和collections
模块。 - 函数参数的
*
和**
前缀是如何工作的。 - 函数的默认参数如何在内部工作(即,
f.func_defaults
是什么)。 - 如何(为什么,真的)devisefunction,以便它们与
map
和zip
结合使用。 -
__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
一样