枚举
不要这么做:
i = <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> <span class="hljs-attribute">iterable</span>: <span class="hljs-built_in">print</span> i, item i += <span class="hljs-number">1</span>
而是这样:
<span class="hljs-keyword">for</span> i, item <span class="hljs-keyword">in</span> enumerate(iterable): <span class="hljs-built_in">print</span> i, item
Enumerate可以接受第二个参数,例如:
<span class="hljs-prompt">>></span>> list(enumerate(<span class="hljs-string">'abc'</span>)) [(<span class="hljs-number">0</span>, <span class="hljs-string">'a'</span>), (<span class="hljs-number">1</span>, <span class="hljs-string">'b'</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'c'</span>)] <span class="hljs-prompt">>></span>> list(enumerate(<span class="hljs-string">'abc'</span>, <span class="hljs-number">1</span>)) [(<span class="hljs-number">1</span>, <span class="hljs-string">'a'</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'b'</span>), (<span class="hljs-number">3</span>, <span class="hljs-string">'c'</span>)]
字典/集合 解析
你可能知道列表解析,但不知道字典/集合解析。字典/集合解析简单而且高效,例如:
my_dict = {i: i * <span class="hljs-function">i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-title">xrange</span><span class="hljs-params">(<span class="hljs-number">100</span>)</span>} my_set </span>= {i * <span class="hljs-number">15</span> <span class="hljs-function"><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-title">xrange</span><span class="hljs-params">(<span class="hljs-number">100</span>)</span>} # There <span class="hljs-keyword">is</span> only a difference of ':' <span class="hljs-keyword">in</span> both </span>
强制浮点数除法
如果我们除以一个整数,即使结果是一个浮点数,Python(2) 依旧会给我们一个整数。为了规避这个问题,我们需要这样做:
<span class="hljs-title">result</span> = <span class="hljs-number">1</span>.<span class="hljs-number">0</span>/<span class="hljs-number">2</span>
但是现在有一种别的方法可以解决这个问题,甚至在之前我都没有意识到有这种方法存在。你可以进行如下操作:
<span class="hljs-keyword">from</span> __future__ <span class="hljs-keyword">import</span> division result = <span class="hljs-number">1</span>/<span class="hljs-number">2</span> <span class="hljs-comment"># print(result)</span> <span class="hljs-comment"># 0.5</span>
需要注意的是这个窍门只适用于Python 2。在Python 3 中就不需要进行import 操作了,因为它已经默认进行import了。
简单的服务器
你想快速简单的分享目录下的文件吗?可以这样做:
<span class="hljs-comment"># Python2</span> <span class="hljs-title">python</span> -m SimpleHTTPServer <span class="hljs-comment"># Python 3</span> python3 -m http.server
这回启动一个服务器
Python表达式求值
我们都知道eval
,但也许并不是所有人都知道literal_eval
.可以这么做:
<span class="hljs-reserved">import</span> ast my_list = ast.literal_eval(expr)
而不是这样:
<span class="hljs-setting">expr = <span class="hljs-value"><span class="hljs-string">"[1, 2, 3]"</span> </span></span> <span class="hljs-setting">my_list = <span class="hljs-value">eval(expr)</span></span>
我相信对于大多数人来说这种形式是第一次看见,但是实际上这个在Python中已经存在很长时间了。
分析脚本
按下面的方式运行脚本,可以很简单的对其进行分析:
<span class="hljs-title">python</span> -m cProfile my_script.py
对象自检
在Python中,可以通过dir()来检查对象,例如:
<span class="hljs-prompt">>></span>> foo = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>] <span class="hljs-prompt">>></span>> dir(foo) [<span class="hljs-string">'__add__'</span>, <span class="hljs-string">'__class__'</span>, <span class="hljs-string">'__contains__'</span>, <span class="hljs-string">'__delattr__'</span>, <span class="hljs-string">'__delitem__'</span>, <span class="hljs-string">'__delslice__'</span>, ... , <span class="hljs-string">'extend'</span>, <span class="hljs-string">'index'</span>, <span class="hljs-string">'insert'</span>, <span class="hljs-string">'pop'</span>, <span class="hljs-string">'remove'</span>, <span class="hljs-string">'reverse'</span>, <span class="hljs-string">'sort'</span>]
调试脚本
你可以使用pdb
模块在脚本中设置断点来调试脚本,就像这样:
<span class="hljs-reserved">import</span> pdb pdb.set_trace()
你可以在脚本的任何地方加入pdb.set_trace()
,该函数会在那个位置设置一个断点。超级方便。你应该多阅读pdb 函数的相关内容,因为在它里面还有很多鲜为人知的功能。
简化if结构
如果必须检查一些值,可以用
<span class="hljs-keyword">if</span> n <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]:
而不是用复杂的if结构:
<span class="hljs-keyword">if</span> n==<span class="hljs-number">1</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">4</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">5</span> <span class="hljs-keyword">or</span> n==<span class="hljs-number">6</span>:
字符串/数列 逆序
下面的方式可以快速反转一个列表:
<span class="hljs-prompt">>></span>> a = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>] <span class="hljs-prompt">>></span>> a[<span class="hljs-symbol">:</span><span class="hljs-symbol">:-</span><span class="hljs-number">1</span>] [<span class="hljs-number">4</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>] <span class="hljs-comment"># This creates a new reversed list. </span> <span class="hljs-comment"># If you want to reverse a list in place you can do:</span> a.reverse()
这种方式同样适用于字符串:
<span class="hljs-prompt">>></span>> foo = <span class="hljs-string">"yasoob"</span> <span class="hljs-prompt">>></span>> foo[<span class="hljs-symbol">:</span><span class="hljs-symbol">:-</span><span class="hljs-number">1</span>] <span class="hljs-string">'boosay'</span>
优雅地打印
下面的方式可以用优雅的方式打印字典和列表:
<span class="hljs-keyword">from</span> pprint <span class="hljs-keyword">import</span> pprint pprint(my_dict)
这用于字典打印是非常高效的,如果你想从文件中快速优雅的打印出json,可以这样做:
<span class="hljs-title">cat</span> file.json | python -m json.tools
三元运算
三元运算是if-else 语句的快捷操作,也被称为条件运算。这里有几个例子可以供你参考:
[on_<span class="hljs-literal">true</span>] <span class="hljs-keyword">if</span> [expression] <span class="hljs-keyword">else</span> [on_<span class="hljs-literal">false</span>] x, y = <span class="hljs-number">50</span>, <span class="hljs-number">25</span> small = x <span class="hljs-keyword">if</span> x < y <span class="hljs-keyword">else</span> y
原文转自:https://freepythontips.wordpress.com/2015/04/19/nifty-python-tricks/